Nach Angaben von Socket sind zwei Beta-Release-Versionen von Paketen im @joyfill-Namensraum betroffen. Die kompromittierten Bibliotheken enthalten einen JavaScript-Implantatcode, der beim Import in Node.js aktiv wird und anschließend weiteren Schadcode nachlädt. Anders als bei typischen npm-Angriffen geschieht das nicht über Installationsroutinen, sondern zur Ladezeit des CommonJS-Paketeinstiegspunkts.

Die Nachlade-Logik ist zweigleisig aufgebaut. Sobald das Paket geladen wird, startet es eine blockchainbasierte Abfrage: Zunächst wird aus der jüngsten ausgehenden Transaktion einer fest kodierten Tron-Adresse ein Transaktions-Hash der BNB Smart Chain bezogen. Scheitert dieser Schritt, fragt der Code ersatzweise ein Aptos-Konto ab, um darüber die BSC-Transaktion zu erhalten, den darin enthaltenen JavaScript-Code zu entschlüsseln, zu extrahieren und auszuführen.

Socket beschreibt außerdem zwei parallele Lieferpfade. Der erste, im laufenden Prozess ausgeführte Nutzlastpfad, lädt per Blockchain-Auflösung eine zweite Schadstufe mit dem Namen „clientCode“ nach. Der zweite Pfad läuft als abgekoppelter Prozess und ruft über eine IP-Adresse JavaScript-Code ab, den er anschließend ausführt. Nach Einschätzung von Socket handelt es sich dabei nicht um einen harmlosen Ausweichmechanismus, sondern um einen redundanten Lieferzweig, der vom importierenden Node.js-Prozess gelöst weiterlaufen kann, auch wenn Build-, Test- oder CLI-Prozesse bereits beendet wurden.

Für beide Zweige kommen unterschiedliche Wallet-Adressen, Konten und Transaktionen auf Tron, Aptos und BNB Smart Chain zum Einsatz. Laut Socket erhöht die Nutzung von Blockchains die operative Widerstandsfähigkeit der Angreifer und erlaubt es, Nutzlasten auszutauschen, ohne neue Paketversionen veröffentlichen zu müssen.

Die endgültige Nutzlast „clientCode“ ist stark verschleiert und arbeitet als Node.js-RAT. Sie vermeidet die Ausführung auf Entwicklungs-, CI- oder Sandbox-Systemen mit den Hostnamen github-runner, buildbot, buildkitsandbox und microsoft-standard-WSL2. Socket zufolge kann der wiedergewonnene Code Host-Informationen sammeln, einen Socket.IO-Kanal zur Fernsteuerung aufbauen, bereitgestellten JavaScript- oder Shell-Code ausführen, Dateien hochladen, Zwischenablagedaten auslesen und Dateien verändern, die zu Entwicklerwerkzeugen gehören.

Mit dem abgekoppelten Prozess werden zwei Nutzlasten in Verbindung gebracht: der RAT „clientCode“ sowie ein Python-Infostealer, der umfangreiche Daten von kompromittierten Systemen abgreifen kann. Nach Einschätzung der Forscher handelt es sich dabei um eine Variante der Malware OmniStealer, über die eSentire erstmals Anfang April berichtet hatte.

Socket sagte The Hacker News, dass ViteVenom und die nun entdeckten npm-Pakete derselben fortlaufenden Operation nordkoreanischer Akteure zuzurechnen seien und keine getrennten Kampagnen darstellen. Checkmarx und OpenSourceMalware hatten in diesem Monat eine Reihe bösartiger npm-Pakete unter der Sammelbezeichnung ViteVenom beschrieben, die das Vite-Frontend-Ökosystem angriffen und dieselbe mehrstufige, blockchainbasierte Command-and-Control-Infrastruktur nutzten, um einen RAT mit Reverse Shell, dem Abgriff von Zugangsdaten, Dateiabfluss und persistenter Hintertür-Injektion auszuliefern.

Laut dem Anwendungssicherheitsunternehmen wurden beide schädlichen Versionen mit derselben npm-Identität veröffentlicht, unter Node.js 18.20.0 und npm 10.5.0; der Schadcode sei bereits beim Bündeln enthalten gewesen. Unklar ist nach Angaben von Socket bislang, ob die Einschleusung des Quellcodes auf eine Kompromittierung eines Entwicklerarbeitsplatzes, des Quellcode-Repositorys, der CI-Umgebung oder der Veröffentlichungszugangsdaten zurückgeht. Entwicklern rät Socket, die betroffenen Versionen aus Lockfiles, Caches, internen Spiegeln, Build-Images und Bereitstellungsartefakten zu entfernen, auf eine verifizierte Version festzulegen und Zugangsdaten aus dem betroffenen Node.js-Prozess zu rotieren. Die Veröffentlichung von @joyfill/layouts müsse als zu willkürlicher Codeausführung im Kontext jedes Prozesses fähig behandelt werden, der das Paket lädt.