Der Supply-Chain-Angriff auf Tensorlake über npm und die „Token-Wipe“-Falle

Die „php2shell“-Patches (CVE-2026-109618 und CVE-2026-109619) für PHP am Ende des Lebenszyklus (EOL) sind nun verfügbar. Da die Antworten des Vertriebs aufgrund der hohen Nachfrage derzeit langsamer als gewöhnlich ausfallen, ist der schnellste Weg zu den gepatchten Paketen der Online-Kauf von ELS für Runtimes (wird in einem neuen Tab geöffnet). Lesen Sie die FAQ zu den Patches

Gehen Sie direkt zu einer KI-Zusammenfassung dieses Blogbeitrags

  • Fasse diesen Beitrag mit Perplexity zusammen
  • Fasse diesen Beitrag mit Gemini zusammen

Die Kurzfassung

Was: Ein bösartiger [email protected] Am 8. Oktober 2026 um 01:12 Uhr UTC auf npm veröffentlicht. Diesmal kein Typosquatting. Es handelt sich um das echte Tensorlake TypeScript SDK, das mit dem projektinternen Workflow erstellt wurde und über eine gültige Sigstore-Herkunftsnachweis verfügt. Ein preinstall „hook“ nutzt „Bun“, um eine 856 KB große, verschleierte ChainDrop-/Shai-Hulud-Nutzlast auszuführen.

Auswirkungen: Socket verzeichnet etwa 12.000 Downloads pro Woche, Aikido über 100.000 Installationen seit seiner Einführung. Dort, wo der Hook ausgeführt wurde, stiehlt er Anmeldedaten, Browser-Passwörter und Konfigurationen von KI-Tools. Gehört das gestohlene GitHub-Token zu einem Konto ohne Organisationsmitgliedschaften, wird zusätzlich ein Monitor platziert, der versucht, das Home-Verzeichnis zu löschen, sobald dieses Token widerrufen wird.

Status: Socket hat es innerhalb von 11 Minuten gemeldet, und Die Hacker-Nachrichten Berichten zufolge hat npm es zurückgezogen. Tensorlake hat die Commits in Pull-Request Nr. 1016. Zum Zeitpunkt der Erstellung dieses Artikels war Version 0.5.145 noch nicht veröffentlicht worden, und sechs tensorlake-native-* Die Pakete waren in Version 0.5.144 noch verfügbar. Hast du sie installiert? Erstelle ein Backup, entferne den Monitor und drehe das Gerät dann.

Die Langfassung

Sind Sie davon betroffen?

Zwei Fragen sind entscheidend: Wurde 0.144 an einer für Sie wichtigen Stelle aufgelöst, und wurde dort der Installations-Hook ausgeführt?

Das hängt in erster Linie davon ab, wie Sie die Installation durchführen. tensorlake befindet sich noch in der 0.x-Reihe, daher wäre ein Bereich wie ^0.5.140 nimmt gerne jeden späteren 0.5-Patch an. Projekte, die aus einer bestehenden Lockdatei mit npm ci blieb unverändert. Das Risiko ergab sich daraus, dass neue Transaktionen abgewickelt wurden, während die fehlerhafte Version noch aktiv war, und zwar durch npm update, ein an diesem Morgen zusammengeführter Dependabot- oder Renovate-PR, eine Erstinstallation oder ein Dockerfile, das package.json ohne die Sperrdatei. Jeder, der zwischen dem 7. Oktober und Tensorlakes Rückgängigmachung den Hauptzweig des Repos heruntergeladen und Folgendes ausgeführt hat: npm install in typescript/ habe den Hook ebenfalls ausgeführt, ohne dass eine Registrierung erforderlich war.

Was die zweite Frage betrifft, musste das SDK gar nicht importiert werden. Es reichte aus, es mit aktivierten Lebenszyklus-Skripten zu installieren – selbst in einem Build, der eine Minute später fehlschlug. Mit ignore-scripts=true in .npmrc, der Hook wurde nie ausgelöst. npm 12 und pnpm 10 sowie spätere Versionen halten Abhängigkeitsskripte zurück, bis du sie freigibst (npm 11 gibt lediglich eine Warnung aus), und Bun führt sie nur für Pakete aus, die auf seiner Liste vertrauenswürdiger Pakete stehen. Überprüfe jedoch deine Konfiguration, bevor du dich darauf verlässt. StepSecurity Es wurde festgestellt, dass der Loader beendet wird, sobald er CI erkennt, wodurch die Laptops der Entwickler an erster Stelle stehen. Dies senkt das CI-Risiko, ohne es jedoch vollständig auszuschließen, da Socket in der Nutzlast weiterhin die Erfassung von CI-Anmeldedaten festgestellt hat.

Die rg Die Linie dient der groben Triage, daher sollten Sie alle 0.5.144 auf einem tensorlake Zeile als Anführungszeichen. Dabei werden „.gitignored“-Dateien und Binärdateien übersprungen, was bedeutet, dass eine ältere Binärdatei bun.lockb wird nicht angezeigt:

npm ls tensorlake --all
npm ls --all | grep tensorlake-native
pnpm why tensorlake
yarn why tensorlake
rg -n 'tensorlake' -g '*lock*' -g 'npm-shrinkwrap.json' .

Überprüfen Sie anschließend die Festplatte und das Benutzerprofil:

find "$HOME" -path '*/node_modules/tensorlake/lib/Math_Symbol.js' 2>/dev/null
ls -la ~/.config/gh-token-monitor ~/.local/bin/gh-token-monitor.sh 2>/dev/null

Erweitern Sie die find um Caches und Runner zu erstellen oder EDR in verwalteten Flotten einzusetzen. Bestätigen Sie alle Math_Symbol.js Treffer bei den Hashtags unter „Mitigation“. A gh-token-monitor Wenn der Eintrag vorhanden ist, bedeutet dies, dass die Falle aktiviert ist; fahren Sie daher direkt mit „Abwehr“ fort. Fehlt der Eintrag, wird der Host nicht freigegeben, da der Monitor nur für bestimmte Konten aktiviert wird.

Was ist der Tensorlake-Angriff?

Tensorlake führt nicht vertrauenswürdigen, vom Modell generierten Code in isolierten Sandboxes aus, und das npm-SDK dient dazu, diese über TypeScript-Anwendungen zu steuern. Die Teams schotten alles ab, was ihre Agenten schreiben, und installieren dann das SDK auf einem Laptop, der auf alles zugreifen kann. Die Sandbox hat noch nie versagt. Die Malware lief auf dem Rechner, auf dem die Installation erfolgte, noch bevor eine Sandbox ins Spiel kam.

Der Angreifer verschaffte sich über das Quell-Repo Zugang. Laut StepSecurity war der erste böswillige Commit, e90c47b, landete am 7. Oktober um 01:20 UTC auf der Hauptplattform, gefolgt von sieben weiteren, die die Nutzlast kalibrierten und die preinstall Zeile. Keiner davon wurde über einen Pull-Request eingereicht. Laut Tensorlakes eigenem Bericht stammten sie von einem Repo-Admin-Konto über die GitHub-Weboberfläche, weshalb Aikido sie als „verifiziert“ markiert sah. GitHub signiert Commits über die Weboberfläche selbst, daher zeigte das Abzeichen lediglich ein angemeldetes Konto an – mehr nicht. Wie dieses Konto kompromittiert wurde, wurde nicht veröffentlicht.

Etwa einen Tag später versandte dasselbe Konto manuell die Repos des publish_npm.yaml Workflow. Es wurde die Version 0.5.144 kompiliert, signiert und veröffentlicht. Der Scanner von Socket hat sie um 01:23:10 UTC erkannt, und StepSecurity hat dies den Betreuern gemeldet in GitHub-Issue Nr. 1014. Die Dateinamen stimmen mit der ChainDrop-Welle vom August überein, und zwar über keyv, und Aikido fand einen WORMTAG Ein Hinweis darauf, dass es sich eher um eine neue Infektion als um eine Rezidivinfektion handelt.

So funktioniert der Geisel-Token

Wenn die Payload ein GitHub-Token von einem Konto ohne Organisationsmitgliedschaften erhält, installiert sie einen Dienst namens gh-token-monitor, laut Die Entschlüsselung von SafeDep. Tokens von Konten, die zu einer Organisation gehören, werden genauso gestohlen, auch ohne diese Falle. Dabei handelt es sich um eine systemd-User-Unit unter Linux, einen LaunchAgent unter macOS und eine geplante Anmeldeaufgabe unter Windows. Alle 60 Sekunden, bis zu 24 Stunden lang, ruft sie api.github.com/user mit dem gestohlenen Token. Laut StepSecurity wird, sobald GitHub das Token ablehnt, Folgendes ausgeführt: rm -rf ~/ unter Linux und macOS oder das Löschen des Benutzerprofils über PowerShell unter Windows. Der Code enthält sogar die Zeichenfolge IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwnerund GMO Flatt Security Es wird berichtet, dass auf infizierten Rechnern Dateien gelöscht wurden.

Schlagen Sie fast jedes Runbook zum Thema Identitätsdiebstahl auf, und der erste Schritt ist immer die Sperrung des Tokens. Auf einem Host, auf dem dieser Monitor noch läuft, kann dieser Schritt das Home-Verzeichnis des Entwicklers mit sich reißen – ganz gleich, ob die Sperrung vom Entwickler, einem Administrator oder einem automatisierten Playbook veranlasst wird. Wenn die Automatisierung Tokens sperrt, die mit markierten Hosts verknüpft sind, sollten Sie dies für die betroffenen Hosts zurückhalten, bis die Monitore entfernt wurden.

Auch das Ziehen des Netzwerkkabels ist keine garantierte Lösung, da noch niemand veröffentlicht hat, wie der Monitor mit einer unterbrochenen Verbindung umgeht. Sichern Sie wichtige Daten, alarmieren Sie Ihr Incident-Response-Team und handeln Sie schnell, denn der Angreifer kann dieses Token die ganze Zeit über nutzen.

Im Inneren der Nutzlast

Der Loader prüft auf CI, beendet sich, wenn er es findet, lädt Bun herunter und übergibt an Math_Symbol.js, daher findet die eigentliche Arbeit in einem Prozess statt, der nicht node.

Es greift auf npm-Token zu, einschließlich des von „Trusted Publishing“ verwendeten OIDC-Austauschs, und ruft Daten aus den Metadaten von AWS-Instanzen, dem Secrets Manager und dem SSM Parameter Store ab, wobei GMO Flatt Security beobachtet hat, dass es diese Daten in allen Regionen ausliest. Es durchsucht einen lokalen Vault unter 127.0.0.1:8200 und durchsucht nach Kubernetes-Tokens, SSH-Schlüsseln, .env Dateien, Docker-Konfigurationen und Krypto-Wallets. Aikido stellte fest, dass die Malware „HackBrowserData“ ablegt, um gespeicherte Passwörter und Cookies zu erfassen. Außerdem zielt sie auf Konfigurations- und MCP-Dateien für Claude, Cursor, Kiro, Windsurf und Zed ab, die häufig API-Schlüssel im Klartext enthalten.

Die gestohlenen Daten werden verschlüsselt an iseekaigogo.com, die in der Nutzlast fest codierte C2-Domain oder zu einem neuen öffentlichen Repository im GitHub-Konto des Opfers mit der Bezeichnung „Shai-Hulud: Here We Go Again“. Als Ausweichlösung stellte Aikido fest, dass die Malware einen vom Angreifer kontrollierten Ethereum-Vertrag unter 0xb614155Fd88114d40549b259457Bcf921Df091B9 für eine alternative Domain. Die letzte Aktualisierung erfolgte am 21. September über die Wallet 0x779f83aE56309682beDb04816c19d358c4B21040, verweist auf dieselbe Domain. Eine Sperrung hilft zwar, aber schon eine einzige Transaktion kann die Weiterleitung umgehen.

Dann verbreitet es sich. Mit einem npm-Token schleust es sich in die Pakete des Opfers ein, erhöht die Versionsnummer, generiert eine Sigstore-Herkunftsangabe und veröffentlicht das Paket erneut. Mit einem GitHub-Token führt es ein Commit durch .claude/settings.json und .vscode/tasks.json in die Repos, die es erreichen kann, unter Verwendung des Autors [email protected] und die Meldung „chore: update dependencies“. Claude-Code-Hooks können Shell-Befehle ausführen, und VS-Code-Aufgaben können beim Öffnen eines Ordners ausgeführt werden. Daher können diese Dateien je nach ihrer Konfiguration und den Vertrauenseinstellungen des nächsten Entwicklers einen Weg zurück bieten.

Was sollte sich bei der Aufnahme ändern?

Die Herkunftsangabe in Version 0.5.144 ist echt. Dort wird korrekt angegeben, dass das Paket von tensorlakeai/tensorlake über den projektinternen Workflow – und genau das ist alles, was die Herkunftsnachweisbarkeit jemals beansprucht. Wenn ein Administratorkonto direkt in den „main“-Zweig eincheckt, erstellt die eigentliche Pipeline die Malware und signiert sie. Eine Richtlinie, die zwar die Herkunft überprüft, aber niemals den beglaubigten Code unter die Lupe nimmt, hätte diese Veröffentlichung akzeptiert.

Lockfiles halfen nur aufgrund der Trägheit, und ein CVE-Scanner fand keine Übereinstimmung. Derweil war der Unterschied zwischen den Versionen 0.5.143 und 0.5.144 kaum zu übersehen, da eine neue preinstall Skript, einen neuen Loader und eine verschleierte Datei mit einer Größe von 856 KB in einem Patch-Release. Nur wenige Teams lesen die Diff-Dateien von Tarballs, um Patch-Erhöhungen zu erkennen, aber in neueren npm-Lockfiles führt eine Änderung an einem Paket hasInstallScript „entry“ ist ein günstiger Titel, den man im Auge behalten sollte.

Auch die Zeit spielt eine Rolle. Socket hat das Problem innerhalb von 11 Minuten entdeckt, daher gilt eine 24-Stunden-Frist ab Veröffentlichung (npm’s min-release-age, oder pnpms minimumReleaseAge(das ab pnpm 11 standardmäßig auf 24 Stunden eingestellt ist) hätte dies in den meisten Builds verhindert. Die Antwort von Tensorlake, die in PR #1016 dargelegt ist, stellt ebenfalls eine gute Vorlage dar: Der Admin-Bypass wurde aus dem Main-Zweig entfernt, signierte Commits sind erforderlich, bei npm-Veröffentlichungen ist ein zweiter Prüfer vorgeschrieben, und es gibt einen CI-Tripwire, der fehlschlägt, wenn ein veröffentlichtes Manifest ein Installationsskript deklariert. Anwender sollten jede Aktualisierung einer Abhängigkeit zurückhalten, die ein Installationsskript hinzufügt oder ändert. Ein Paket ohne ein solches Skript kann beim Import zwar weiterhin Code ausführen, doch ein neues Skript ist ein Grund, die Aktualisierung zu stoppen.

Milderung

Die Reihenfolge ist wichtiger als sonst. Behandeln Sie jeden Host, auf dem der Hook ausgeführt wurde, als kompromittiert, und durchlaufen Sie Ihren Vorfallbearbeitungsprozess.

Sichern Sie zunächst kritische Daten. Kopieren Sie noch nicht gespeicherte Arbeitsergebnisse und andere unersetzbare Daten – nicht jedoch Werkzeuge – auf einen externen Speicher, bevor Sie Tokens, Dienste oder das Netzwerk berühren. Bewahren Sie Sperrdateien und Installationsprotokolle als Nachweis auf.

Überprüfen Sie die Artefakte. Vergleichen Sie die am 7. oder 8. Oktober erstellten Workstations, Build-Hosts und Images mit den veröffentlichten SHA-256-Werten. lib/setup.mjs ist 25a0735d0db7dc40e5d45ce42d9c106067e6a66e184d967cfecfab17c3bcb5ef und lib/Math_Symbol.js ist b50a00900399ba99fb6ce1fc151519cb99d44320ef2a631f2237e1aea0ad6fec. GMO Flatt Security führt eine Datei auf, die es artifact.tar.gz als 33108f494dad71369a9aa7cd6daa5402335d1a718b78320b9b687c0b2174fa67, und in der Kopie des Veröffentlichungsprotokolls von SafeDep wird der SHA-1-Wert des npm-Tarballs wie folgt angegeben: 843a898ab72793568d77c53ff9282e6ce7c66aea. Hashwerte bestätigen einen Treffer, erkennen jedoch keine veränderte Kopie.

Deaktivieren Sie den Monitor, bevor Sie irgendetwas widerrufen. Die Datei in ~/.config/gh-token-monitor/ enthält das „watched“-Token. Behandeln Sie es als vertrauliches Beweismaterial und erwähnen Sie es nicht in Tickets oder im Chat. StepSecurity hat die folgenden Befehle für Linux und macOS veröffentlicht, mit einem daemon-reload hier hinzugefügt. Überprüfen Sie die Namen und Pfade auf dem jeweiligen Rechner, bevor Sie sie ausführen:

# Linux
systemctl --user disable --now gh-token-monitor.service
rm -rf ~/.config/gh-token-monitor
rm -f ~/.local/bin/gh-token-monitor.sh
rm -f ~/.config/systemd/user/gh-token-monitor.service
systemctl --user daemon-reload

# macOS
plist=~/Library/LaunchAgents/com.user.gh-token-monitor.plist
launchctl bootout gui/(id-u)"plist"
rm -rf ~/.config/gh-token-monitor
rm -f ~/.local/bin/gh-token-monitor.sh
rm -f "$plist"

Unter Windows listet diese schreibgeschützte PowerShell-Befehlszeile geplante Aufgaben auf, die ausgeführt werden monitor.ps1, sodass Sie sie über Ihre Endpunkt-Tools entfernen können:

Get-ScheduledTask | Where-Object {
  "(_.Actions.Execute) (_.Actions.Arguments)" -match 'monitor\.ps1'
}

Vergewissern Sie sich, dass es gelöscht ist, bevor Sie fortfahren. Löschen node_modules Ich werde es nicht anfassen, und das Entfernen dieses Monitors beweist nicht, dass es keine weiteren Spuren gibt.

Aus einer sauberen Maschine entnehmen. Entziehen Sie das überwachte GitHub-Token; dann wird der Zugriff auf alles, worauf dieses Konto Zugriff hatte – einschließlich npm, Cloud, SSH, Kubernetes, Vault und Registry-Anmeldedaten – gesperrt, .env Geheimnisse sowie Schlüssel für KI-Tools und die MCP-API. Gehen Sie davon aus, dass Browser-Passwörter und -Sitzungen offengelegt wurden, und beenden Sie gleich dabei alle aktiven Sitzungen.

Räume deine Repos auf und überprüfe, was du veröffentlichst. Suche nach Commits von [email protected] mit „chore: update dependencies“, stray .claude/settings.json oder .vscode/tasks.json Dateien, unbekannte Arbeitsabläufe und neue öffentliche Repos mit der Beschreibung „Shai-Hulud: Here We Go Again“. Falls das npm-Token eines Betreuers offengelegt wurde, suchen Sie nach Releases, die niemand aus Ihrem Team veröffentlicht hat.

Ausgang sperren und überprüfen. Block iseekaigogo.com nach Domäne. Flatt-Listen 172.67.207.33 und 104.21.22.217 als Adressen, aber dabei handelt es sich um gemeinsam genutzte Cloudflare-IPs; verwenden Sie diese daher für die Suche in Protokollen, nicht jedoch für Firewall-Regeln.

Im Zweifelsfall fixieren, durchsetzen und neu imageieren. Halten tensorlake auf 0.5.143, wodurch auch die nativen Pakete auf 0.5.143 festgelegt werden, bis Tensorlake 0.5.145 veröffentlicht und bestätigt. Behalten Sie tensorlake-native-* ab Version 0.5.144. Führen Sie die Neuinstallation auf einem leeren Host durch, speichern Sie die Sperrdatei und verwenden Sie npm ci in CI. Wenn Sie nicht jeden Persistenzpunkt nachverfolgen können, erstellen Sie die Maschine anhand eines bekanntermaßen fehlerfreien Images neu.

Erkennung

Die Prozesskette ist das beste Indiz. Achten Sie auf npm oder node Laichen node lib/setup.mjs, das dann heruntergeladen und gestartet wird bun. Das Erscheinen von „bun“ im Rahmen einer Paketinstallation auf einem Rechner, auf dem es zuvor noch nie vorhanden war, ist an sich schon verdächtig, ebenso wie untergeordnete Installationselemente, die Folgendes auslesen: .npmrc, .aws, .kube, SSH-Schlüssel oder Browserprofile.

Zur Persistenz sollten Warnmeldungen zu systemd-Benutzereinheiten, LaunchAgents oder ONLOGON-Aufgaben ausgegeben werden, die unter einem Node- oder Bun-Prozess erstellt wurden. Ein Nicht-Browser-Prozess, der abfragt api.github.com/user „Einmal pro Minute“ ist so ziemlich der genaueste Anhaltspunkt, den man bekommen kann.

Wie SecureChain für JavaScript den Ausgang verändert

SecureChain für JavaScript verlagert die Vertrauensentscheidung in eine frühere Phase, noch bevor ein Paket einen Laptop erreicht. Es erstellt Pakete aus dem Quellcode in abgesicherten, isolierten Umgebungen neu und überprüft sie auf bekannte Malware, verdächtige Codemuster und Risiken in der Lieferkette, wobei alles blockiert wird, was die Überprüfung nicht besteht. Eine Neuerstellung allein hätte hier niemanden gerettet, da sich der manipulierte Code bereits im vorgelagerten Quellcode befand. Erst durch die Überprüfung wird dies erkannt, und eine Patch-Version, die plötzlich einen preinstall Ein Hook, der eine zweite Laufzeitumgebung herunterlädt und 856 KB verschleiertes JavaScript ausführt, ist genau die Art von Änderung, die das System verhindern soll.

Entdecken Sie SecureChain für JavaScript →

Es handelt sich um einen sofort einsatzbereiten Repository-Ersatz, der mit JFrog Artifactory, Sonatype Nexus und GitHub Packages kompatibel ist, sodass das npm Die Befehle bleiben unverändert, und das Produkt liefert SLSA Level 3-Provenienz, SBOM sowie VEX-Ausgaben. Es deckt JavaScript, Python, Java, Go, Rust und PHP ab. Und wenn Vorfälle wie dieser Teams dazu zwingen, eine Abhängigkeit bis zum Ende ihres Lebenszyklus einzufrieren, kann der „Endless Lifecycle Support“ von TuxCare weiterhin Sicherheitsupdates für diese Version bereitstellen, solange Sie darauf angewiesen sind. Keine erzwungenen Upgrades und keine Neuprogrammierungen.

Warum es hier um mehr geht als nur um ein Paket

Im Mai gab es über TanStack eine „Mini-Shai-Hulud“-Welle mit gültiger SLSA-Herkunftsangabe, und im Juni gab es Mastras „Typosquat“. Im August gab es ChainDrop über keyv und der Arrayref-Kompromiss auf crates.io. Nun hat dieselbe Wurmfamilie die Infrastruktur von KI-Agenten erreicht. Immer wieder lassen sich Verteidiger davon täuschen, dass ein authentifizierter Herausgeber oder eine gültige Bescheinigung als Beweis dafür herangezogen wird, dass der Code in Ordnung ist. In diesem Fall waren sowohl der Paketname als auch die Herkunft echt. Sie gaben lediglich eine Antwort auf eine andere Frage als die, auf die es wirklich ankam.

Entdecken Sie SecureChain für JavaScript →

FAQ

Welche TensorLake-Versionen sind sicher?

0.5.143 ist die letzte fehlerfreie Version und war noch die von npm latest zum Zeitpunkt der Erstellung dieses Artikels. Wechseln Sie zu Version 0.5.145, sobald Tensorlake diese veröffentlicht, und behalten Sie tensorlake-native-* ab 0.5.144.

Ist es sicher, das gestohlene GitHub-Token sofort zu widerrufen?

Nicht, wenn der Monitor möglicherweise noch läuft. Auf einem Host, auf dem gh-token-monitor Ist der Monitor aktiv, kann das Widerrufen seines Tokens zur Löschung des Home-Verzeichnisses oder des Benutzerprofils führen. Sichern Sie die Daten, entfernen Sie den Monitor, widerrufen Sie dann das Token und führen Sie die Rotation durch – und das möglichst zügig.

Schließen Sie sich 4.500+ Linux- und Open-Source-Experten an!

2x im Monat. Kein Spam.

Inhaltsübersicht
Holen Sie sich die Open-Source-Sicherheitslösungen, die Sie brauchen

Schließen Sie sich 4.500+ Linux- und Open-Source-Experten an!

2x im Monat. Kein Spam.