<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Npm Download Farm (WASM Worker) on CyberVeille</title>
    <link>https://cyberveille.ch/tags/npm-download-farm-wasm-worker/</link>
    <description>Recent content in Npm Download Farm (WASM Worker) on CyberVeille</description>
    <generator>Hugo -- 0.146.0</generator>
    <language>fr-fr</language>
    <copyright>Cyberveille CC BY-NC-SA 4.0</copyright>
    <lastBuildDate>Tue, 22 Sep 2026 00:00:00 +0200</lastBuildDate>
    <atom:link href="https://cyberveille.ch/tags/npm-download-farm-wasm-worker/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Campagne npm &#39; Equation of Compromise &#39; : supply-chain ciblant développeurs DeFi et quant</title>
      <link>https://cyberveille.ch/posts/2026-09-22-campagne-npm-equation-of-compromise-supply-chain-ciblant-developpeurs-defi-et-quant/</link>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0200</pubDate>
      <guid>https://cyberveille.ch/posts/2026-09-22-campagne-npm-equation-of-compromise-supply-chain-ciblant-developpeurs-defi-et-quant/</guid>
      <description>&lt;h2 id=&#34;-contexte&#34;&gt;🔍 Contexte&lt;/h2&gt;
&lt;p&gt;Publié le 21 septembre 2026 par JFrog Security Research, cet article présente l&amp;rsquo;analyse complète d&amp;rsquo;une campagne de supply-chain npm active depuis mars 2026, baptisée « Equation of Compromise ». La campagne regroupe plusieurs incidents signalés séparément par d&amp;rsquo;autres vendeurs et cible principalement les développeurs quantitatifs et DeFi.&lt;/p&gt;
&lt;h2 id=&#34;-mécanisme-dinfection&#34;&gt;🎯 Mécanisme d&amp;rsquo;infection&lt;/h2&gt;
&lt;p&gt;Le vecteur initial est un &lt;strong&gt;package npm malveillant&lt;/strong&gt; (&lt;code&gt;mathsbase&lt;/code&gt;) copiant la bibliothèque légitime &lt;code&gt;mathjs&lt;/code&gt;. Le package embarque :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lib/cjs/utils/event.js&lt;/code&gt; : loader &lt;strong&gt;AES-256-GCM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lib/cjs/utils/graph.js&lt;/code&gt; : orchestrateur (stage 2, base64 chiffré)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lib/cjs/utils/fraction.js&lt;/code&gt; : agent Slack (stage 3, base64 chiffré)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lib/cjs/utils/bignumber/type.js&lt;/code&gt; : copie bundlée d&amp;rsquo;&lt;strong&gt;ethers.js v5.7.2&lt;/strong&gt; (~1,5 MB)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le déclencheur est &lt;strong&gt;cryptographiquement conditionnel&lt;/strong&gt; : le payload ne se déchiffre que si la victime appelle &lt;code&gt;math.lusolve()&lt;/code&gt; avec la &lt;strong&gt;matrice de Pascal 3×3 symétrique&lt;/strong&gt; &lt;code&gt;[[1,1,1],[1,2,3],[1,3,6]]&lt;/code&gt;. Le facteur LU de cette matrice sert de mot de passe pour dériver la clé AES via &lt;code&gt;scryptSync&lt;/code&gt;. Toute autre matrice échoue à l&amp;rsquo;authentification GCM sans erreur visible.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
