Veröffentlicht wurden die drei Versionen von einem Konto namens „atiertant“, das keine Verbindung zum ursprünglichen Autor „riaevangelist“ hat. Zwar taucht „atiertant“ in der Liste der Maintainer auf, doch das Konto hat im Zusammenhang mit node-ipc keine frühere Veröffentlichungshistorie. Das letzte reguläre Update des Pakets stammt vom August 2024.

Dass das ruhende, häufig heruntergeladene Paket nach einer Lücke von 21 Monaten kompromittiert wurde, deutet laut den Forschern darauf hin, dass entweder die Zugangsdaten von „atiertant“ neu kompromittiert wurden oder das Konto gezielt als Maintainer hinzugefügt wurde, um die schädlichen Versionen zu veröffentlichen.

Auffällig ist, dass der Angriff ohne npm-Lifecycle-Hooks wie preinstall, install oder postinstall auskommt. Stattdessen wird die Nutzlast als sofort ausgeführter Funktionsausdruck (Immediately Invoked Function Expression, IIFE) an das Ende von „node-ipc.cjs“ angehängt. Dadurch wird der Schadcode bei jedem require('node-ipc') bedingungslos aktiv.

Die Version 12.0.1 verfügt zudem über eine Zielprüfung: Sie berechnet einen SHA-256-Fingerabdruck und vergleicht ihn mit einem fest einprogrammierten Hash, der aus acht verschleierten Tabellenfragmenten zusammengesetzt ist, bevor sie mit der Systemerkundung und dem Sammeln von Zugangsdaten fortfährt. „Das bedeutet, dass 12.0.1 auf jeder Maschine vollständig inaktiv bleibt, deren primärer Modulpfad nicht den Zielwert ergibt“, erklärte StepSecurity-Forscher Sai Likhith. Der Angreifer wisse genau, welches Projekt oder welcher Entwickler ins Visier genommen werde, und habe den Hash des Einstiegspunkts vor der Veröffentlichung berechnet. Die 9.x-Versionen besitzen diese Sperre nicht und führen die vollständige Nutzlast auf jedem System aus, das sie lädt.

Neben dem HTTPS-POST an die gefälschte Azure-Domain nutzt die Malware einen zweiten Abflusskanal: Sie kodiert Teile des Archivs als DNS-TXT-Records, nachdem sie den DNS-Resolver des Systems durch Google Public DNS ersetzt hat, um lokale DNS-basierte Sicherheitskontrollen zu umgehen. Laut StepSecurity löst sie zunächst „sh.azurestaticprovider.net“ über 1.1.1.1 (primär) oder 8.8.8.8 (Ausweichoption) auf, um die C2-IP zu ermitteln, und richtet den Resolver dann für alle Abfluss-Abfragen direkt auf diese IP aus. Da die Anfragen damit keine öffentlichen DNS-Resolver berühren, tauchen sie in öffentlichen DNS-Protokollen nicht auf — Organisationen, die sich allein auf das DNS-Logging über Unternehmens-Resolver verlassen, sehen diesen Verkehr nicht.

Es ist nicht das erste Mal, dass node-ipc schädliche Funktionen enthält. Im März 2022 baute der Maintainer in den Versionen 10.1.1 und 10.1.2 absichtlich eine zerstörerische Funktion ein, die als Protest gegen den russischen Einmarsch in der Ukraine Dateien auf Systemen in Russland oder Belarus überschrieb. Zwei weitere Versionen, 11.0.0 und 11.1.0, enthielten die Abhängigkeit „peacenotwar“. Beim aktuellen Vorfall handelt es sich nach Einschätzung von Socket eher um ein verdächtiges erneutes Veröffentlichen von Schadcode in einem bekannten Paket als um einen Typosquatting-Versuch.

Betroffenen wird geraten, die kompromittierten node-ipc-Versionen zu entfernen und eine nachweislich saubere Version (9.2.1 oder 12.0.0) zu installieren, von einer Kompromittierung auszugehen und sämtliche Zugangsdaten und Geheimnisse zu rotieren, die npm-Veröffentlichungsaktivität zu prüfen, Workflow-Protokolle und Cloud-Logs auf unautorisierte Aktionen zu kontrollieren und den ausgehenden Verkehr zur C2-Domain zu blockieren.