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.