Die Infektion über die npm-Pakete beginnt mit einem postinstall-Hook, der einen Loader ausführt. Dieser legt eine in Python geschriebene Backdoor ab, die den ICP-Canister als Dead Drop kontaktiert, um eine URL für die nächste Schadcode-Stufe abzurufen. Da die Dead-Drop-Infrastruktur dezentral ist, lässt sie sich nur schwer abschalten. „Der Controller des Canisters kann die URL jederzeit austauschen und so neue Binärdateien an alle infizierten Systeme ausspielen, ohne den Implantat-Code selbst anzufassen", erklärte Eriksen. Für die dauerhafte Verankerung sorgt ein systemd-Dienst auf Nutzerebene. Über die Direktive „Restart=always" startet er die Python-Backdoor nach einer Verzögerung von fünf Sekunden automatisch neu, falls sie beendet wird. Um unauffällig zu bleiben, gibt sich der Dienst als PostgreSQL-Werkzeug („pgmon") aus. Die Backdoor meldet sich alle 50 Minuten mit einem gefälschten Browser-User-Agent beim ICP-Canister und ruft die URL im Klartext ab, um die darüber erreichbare Datei herunterzuladen und auszuführen. Enthält die URL jedoch youtube[.]com, überspringt das Skript sie – laut Eriksen der Ruhezustand des Canisters. Die Angreifer aktivieren das Implantat, indem sie den Canister auf eine echte Binärdatei verweisen lassen, und deaktivieren es durch die Rückkehr zu einem YouTube-Link. Zeigt der Canister auf eine neue URL, lädt jede infizierte Maschine beim nächsten Abruf die neue Binärdatei; die alte läuft weiter, da das Skript vorherige Prozesse nie beendet. Einen vergleichbaren youtube[.]com-Kill-Switch hat Wiz im Zusammenhang mit der trojanisierten Trivy-Binärdatei (Version 0.69.4) gemeldet, die über einen weiteren Python-Dropper („sysmon.py") denselben ICP-Canister anspricht. Zum Zeitpunkt der Veröffentlichung verwies die vom C2 zurückgegebene URL auf ein Rickroll-YouTube-Video. The Hacker News stellte fest, dass der ICP-Canister drei Methoden unterstützt: get_latest_link, http_request und update_link. Die letzte erlaubt es den Angreifern, das Verhalten jederzeit zu ändern und eine echte Schadlast auszuliefern. Zu den Paketen gehört außerdem eine Datei „deploy.js", die der Angreifer manuell ausführt, um die Schadlast programmatisch an jedes Paket weiterzureichen, auf das ein gestohlenes npm-Token Zugriff bietet. Der Wurm, der nach Einschätzung der Forscher mithilfe eines KI-Werkzeugs entstand, verbirgt seine Funktion nicht. „Das wird nicht durch npm install ausgelöst", so Aikido. „Es ist ein eigenständiges Werkzeug, das der Angreifer mit gestohlenen Tokens ausführt, um die Reichweite des Angriffs zu maximieren." Eine spätere Ausprägung von CanisterWorm, entdeckt in „@teale.io/eslint-config" in den Versionen 1.8.11 und 1.8.12, verbreitet sich von selbst – ohne manuelles Eingreifen. Anders als das eigenständige „deploy.js" bündelt die neue Variante diese Funktion in einer Funktion findNpmTokens() innerhalb der „index.js", die während der postinstall-Phase läuft und npm-Authentifizierungstokens vom Rechner des Opfers sammelt. Nach der Installation der persistenten Backdoor sucht das postinstall-Skript jedes npm-Token in der Entwicklungsumgebung und startet den Wurm sofort, indem es „deploy.js" als vollständig abgekoppelten Hintergrundprozess aufruft. Bemerkenswert ist, dass die Angreifer die ICP-Backdoor-Schadlast durch eine Test-Zeichenfolge („hello123") ersetzt haben sollen – vermutlich, um die gesamte Angriffskette vor dem Einbau der eigentlichen Schadsoftware zu erproben. „Hier kippt der Angriff von ‚kompromittiertes Konto veröffentlicht Schadsoftware’ zu ‚Schadsoftware kompromittiert weitere Konten und veröffentlicht sich selbst’", sagte Eriksen. Jeder Entwickler und jede CI-Pipeline, die ein solches Paket installiert und über ein erreichbares npm-Token verfügt, werde zum unfreiwilligen Überträger: Die eigenen Pakete würden infiziert, nachgelagerte Nutzer installierten diese, und bei vorhandenen Tokens wiederhole sich der Kreislauf.
CanisterWorm: Selbstverbreitender Wurm befällt 47 npm-Pakete nach Trivy-Angriff

Im Zuge des Supply-Chain-Angriffs auf den verbreiteten Scanner Trivy gehen Sicherheitsforscher davon aus, dass die Angreifer Folgeangriffe durchgeführt haben, die zur Kompromittierung einer großen Zahl von npm-Paketen führten. Dabei kommt ein bislang nicht dokumentierter, sich selbst verbreitender Wurm zum Einsatz, den die Forscher CanisterWorm nennen. Der Name verweist darauf, dass die Schadsoftware einen ICP-Canister – manipulationssichere Smart Contracts der Internet-Computer-Blockchain – als Dead-Drop-Resolver verwendet. Laut Charlie Eriksen, Sicherheitsforscher bei Aikido Security, ist dies der erste öffentlich dokumentierte Missbrauch eines ICP-Canisters mit dem ausdrücklichen Ziel, den Command-and-Control-Server (C2) abzurufen. Der Vorfall folgt nur einen Tag, nachdem Angreifer mit einem gestohlenen Zugang manipulierte Releases von trivy, trivy-action und setup-trivy veröffentlicht hatten, die einen Zugangsdaten-Dieb enthielten. Hinter den Angriffen wird eine auf Cloud-Umgebungen spezialisierte cyberkriminelle Operation namens TeamPCP vermutet. Besonders brisant: Eine spätere Variante von CanisterWorm verbreitet sich vollständig ohne manuelles Zutun weiter und macht so jeden Entwickler und jede CI-Pipeline mit erreichbarem npm-Token zum unfreiwilligen Überträger.