
Tensorlakes npm-SDK werd vergiftigd om inloggegevens van AI-agenten te stelen — en om je thuismap te wissen als je het token introk
- OrcaNIEUWOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 per 1 mln tokens · 56 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2952Intelligentie
- anthropicAnthropic: Claude Sonnet 5.52026-09-2856Intelligentie
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 per 1 mln tokens · 993 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2238Intelligentie
- OpenAIOpenAI: GPT-6 Sol2026-09-2248Intelligentie
- AnthropicAnthropic: Claude Opus 5.52026-09-2258Intelligentie
- xAIGrok 4.72026-09-2146Intelligentie
- OrcaOrca: OrcaCyber Zero 1.02026-09-17$3.00 / $7.50 per 1 mln tokens · 40 tok/s
- OrcaOrca: OrcaVerify Text 1.02026-09-16$2.00 / $0.00 per 1 mln tokens · 2230 tok/s
- DeepSeekDeepSeek: DeepSeek V4.1 Flash2026-09-1040Intelligentie
- OpenAIOpenAI: GPT-6 Astra2026-09-0453Intelligentie77Coderen
- GoogleGoogle: Gemini 3.8 Flash2026-09-0241Intelligentie76Coderen
- AlibabaQwen: Qwen3.8 Max (0902)2026-09-0245Intelligentie76Coderen
- AnthropicAnthropic: Claude Fable 5.12026-09-0153Intelligentie82Coderen
- TencentTencent: Hy4 preview2026-08-28$0.83 / $2.50 per 1 mln tokens · 57 tok/s
- AlibabaQwen: Qwen3.8 Flash2026-08-26$0.15 / $0.47 per 1 mln tokens · 125 tok/s
- z-aiZ.ai: GLM 5.3 Flash2026-08-2642Intelligentie72Coderen
- DeepSeekDeepSeek: DeepSeek V4 Flash Vision (Exp)2026-08-21$0.22 / $0.66 per 1 mln tokens · 206 tok/s
- z-aiZ.ai: GLM 5.32026-08-1845Intelligentie75Coderen
Op 8 oktober 2026 bereikte een vergiftigde release van tensorlake — de npm-SDK voor het platform van Tensorlake, die niet-vertrouwde, door LLM gegenereerde code in geïsoleerde sandboxes uitvoert — het npm-register. Versie 0.5.144 werd gepubliceerd om 01:12:07 UTC; onderzoekers van Socket zeggen dat ze het ongeveer elf minuten later hebben gesignaleerd. Het was geen geautoriseerde release. Tensorlake stelt dat de aanvaller code rechtstreeks in de GitHub-repository van het bedrijf heeft gepusht en deze via de eigen releaseworkflow van het project heeft gepubliceerd, zodat het pakket geldige npm-provenance — een ondertekende attestatie die laat zien waar het is gebouwd, voor broncode die al vergiftigd was — bevatte. Het bedrijf zegt dat de versie ongeveer 1 uur 40 minuten, van 01:12 tot 02:54 UTC, voordat npm deze verwijderde.
De payload had geen import en geen draaiende agent nodig. Een preinstall-hook in het pakketmanifest voerde node lib/setup.mjs uit, een geobfusceerde loader die de Bun-runtime op de machine neerzette en die gebruikte om lib/Math_Symbol.js uit te voeren, een 856.501 bytes grote steler van inloggegevens en een zelfpropagerende worm. Iedereen die een gewone installatie van die ene versie uitvoerde, voerde de payload uit. Omdat het de latest-tag van het pakket was, was dat de versie waar een standaardinstallatie op uitkwam terwijl die live was.
Wat dit record de moeite van het bewaren waard maakt, is niet de omvang van de payload — de Shai-Hulud-familie is al eerder gedocumenteerd. Het is de doellijst. Naast npm- en GitHub-tokens, AWS-referenties, Kubernetes- en Vault-secrets, SSH-sleutels, .env-bestanden, browserwachtwoorden en cryptowallets, verzamelde deze build specifiek configuratie van AI-ontwikkeltools en MCP-bestanden — de exemplaren die verband houden met Claude Code, Cursor, Kiro, Windsurf en Zed, volgens Socket. Hij schreef ook zijn eigen .claude/settings.json en .vscode/tasks.json in repositories die hij kon bereiken, zodat de code opnieuw zou draaien de volgende keer dat een ontwikkelaar dat project in Claude Code of VS Code opende. Het is een aanval op de toeleveringsketen die rechtstreeks is gericht op de machines waarop mensen agents bouwen.
Hoe de release uit het account van een maintainer kwam
Socket, SafeDep en Aikido publiceerden op 8 oktober elk hun eigen analyse, en hun beschrijvingen van het mechanisme komen overeen. De betrouwbaarheidsgraad van het archief voor dit record is A, het is niet als betwist gemarkeerd, en niets dat in de bronnen is gevonden, weerspreekt een van hen.
In het verslag van SafeDep worden acht commits getraceerd naar de main-branch van de repository tussen 01:20 en 03:57 UTC op 7 oktober, toegeschreven aan een repositorybeheerder en uitgevoerd via de GitHub-webinterface. De commit die het archief aanhaalt als de eerste kwaadwillige, is 41b38f0, een revisie van vier bestanden van 03:44:48 UTC op 7 oktober met als bericht "Add files via upload" en die GitHubs geverifieerde signatuur draagt — GitHub ondertekent commits die in zijn eigen webeditor zijn gemaakt, dus "geverifieerd" verwijst naar het bewerkingsvlak, niet naar de persoon. Die commit raakte geen bestanden aan buiten typescript/lib/Math_Symbol.js en typescript/lib/setup.mjs, volgens de GitHub API: de payload, en niets anders.
SafeDep biedt een lezing van het gedrag van de operator, aangeduid als zijn eigen gevolgtrekking: de eerste bewerking van de preinstall-hook brak de JSON-syntaxis van het bestand en negentien minuten later volgde een herstelcommit, wat er volgens SafeDep mee overeenkomt dat een persoon bestanden bewerkt in plaats van een gescripte pipeline. Niets dat door Socket, SafeDep, Aikido, StepSecurity of Tensorlake is gepubliceerd, noemt de methode waarmee het account van de maintainer is overgenomen.
De aanvaller had geen npm-token nodig. SafeDep meldt dat het account de publish_npm.yaml workflow van het project op 8 oktober om 00:08 UTC handmatig heeft gestart; de buildlog toont de payloadbestanden in de gepubliceerde tarball. De release gebruikte npm trusted publishing, en de zuster tensorlake-native-* pakketten die in dezelfde run zijn gepubliceerd, hebben geldige SLSA-provenance — provenance die echt geldig is voor een build van een vergiftigde bron. De release verscheen twaalf minuten nadat de workflow was gestart.
Het archief vermeldt dat de repository gecompromitteerd was gedurende ongeveer 20 uurvoordat de publicatie werd geactiveerd — het gat dat de tijdlijn hieronder commit voor commit uiteenzet — wat overeenkomt met de eigen verklaring van Tensorlake dat de aanvaller publiceerde "via onze eigen release-workflow".
Wat de payload deed zodra die eenmaal draaide

De beoordeling van Socket identificeert het oogsten van gegevens uit lokale bestanden, CI-omgevingen, Kubernetes- en Vault-bronnen, en ook exfiltratie, persistentie en uitvoering van op afstand aangeleverde code. SafeDep reproduceerde de gedecodeerde payload: lib/setup.mjs downloadt Bun 1.3.13 van de officiële GitHub-release en gebruikt het om de worm uit te voeren, en het stopt op CI-runners — het doelwit is een ontwikkelaarsmachine, geen build-agent. SafeDep ontdekte ook dat de payload een gewone kopie van diezelfde loader bevat, die het in andere pakketten en repositories plant.
De payload doorloopt drie obfuscatielagen, die SafeDep heeft gedecodeerd zonder het sample uit te voeren: een obfuscator-stringarray, een aangepast cijferalgoritme dat de salt svksjrhjkcejg gebruikt — identiek aan degene die in de eerdere keyv-compromittering werd gemeld — en AES-256-GCM over elf ingebedde bestanden, waaronder scripts, hooks en twee RSA-publieke sleutels. De eerste regel bevat de buildtag WORMTAG='tensrlake', verkeerd gespeld, en dat is hoe SafeDep deze build onderscheidt van een lopende herinfectie.
Naast de configuratie van AI-tools is de verzamellijst breed en specifiek: ~/.claude.json en ~/.kiro/settings/mcp.json voor agentinstellingen; SSH-sleutels, cloud-CLI-bestanden, .npmrc, .env, Docker- en Kubernetes-bestanden, en shellgeschiedenis; wallet.dat plus Exodus-, Electrum- en Ledger Live-gegevens en browserwallet-extensies zoals MetaMask en Phantom; AWS STS, SSM Parameter Store en Secrets Manager; GitHub Actions-secrets uitgelezen uit Runner.Worker procesgeheugen; en Kubernetes-service-accounttokens en Vault-tokens. Het haalde een platformspecifieke binary op van iseekaigogo[.]com/hbd/<platform> en voerde die uit met de argumenten "dump -b all -c password -f json" — argumenten die overeenkomen met de HackBrowserData-tool, hoewel SafeDep opmerkt dat de binary zelf niet is teruggevonden en de identificatie als een gevolgtrekking bestempelt. De worm, voegt SafeDep toe, stopt bij Russische locales.
![A screenshot of a card titled 'Persistence, resolution, and the wipe trigger', kicked 'tensorlake@0.5.144 · staying power', subtitled 'The release was removed in under two hours; the implant it installed was built to outlive that.' Three columns sit side by side. 'Persistence: gh-token-monitor' lists a systemd user service on Linux, a LaunchAgent com.user.gh-token-monitor on macOS, a scheduled task with a PowerShell monitor on Windows, and files left behind in ~/.local/bin, ~/.config and %LOCALAPPDATA%. 'Endpoint resolution order' lists, in numbered order, the primary endpoint iseekaigogo[.]com:443/router; an Ethereum contract 0xb614155Fd88...1Df091B9; the public RPC endpoints that contract is read through, given as ~30 by Socket and 35 by SafeDep; signed GitHub commits found by the string thebeautifulmarchoftime; and public dead-drop repositories described as 'Shai-Hulud: Here We Go Again'. 'The dead-man switch' lists a poll of api.github.com/user every 60s, for 24 hours, firing on a 40x response to that token, with the effect rm -rf ~/ (advisory: home dir), armed only if the account has no orgs, and the order that matters: remove monitor, then revoke. A footer reads 'Per Socket's blog and SafeDep's analysis, with the C2 endpoint, the contract and the gh-token-monitor service confirmed in Tensorlake's advisory. Socket and SafeDep give different counts of the public RPC endpoints the contract is read through.'](https://cms.orcarouter.ai/api/media/file/3-1820.png)
Persistentie is doelbewust. Socket schreef over de payload: "Die combinatie breidt het risico uit voorbij één enkele gestolen API-sleutel", en voegde daaraan toe dat "persistentie de toegang van de aanvaller in stand kan houden nadat de getroffen dependency is verwijderd." SafeDep meldt dat de worm Claude Code- en VS Code-hookbestanden commit als de git-auteur claude, en een "Run Copilot"-workflow plaatst die alle repositorygeheimen dumpt en vervolgens de run en de branch verwijdert. De Tensorlake-advisory adviseert ontwikkelaars die hun logs controleren te zoeken naar een branch met de naam dependabot/github_actions/format/setup-formatter en commits die onder diezelfde identiteit zijn gemaakt.
Spread draait op gestolen tokens in plaats van op een tweede kwetsbaarheid. Socket zegt dat de worm de pakketten opsomt die aan de publicatie-identiteit van een slachtoffer zijn gekoppeld, Sigstore-provenance opbouwt en besmette versies opnieuw publiceert. SafeDep voegt het detail toe dat hij binnen CI een git-afhankelijkheid toevoegt en zijn output ondertekent met Fulcio en Rekor — waardoor de provenance van het pakket dat hij daarna publiceert even geldig is als de provenance op 0.5.144 was.
De twintig uur voor de publicatie
Het gat tussen de eerste kwaadwillige commit en de release is het deel van de tijdlijn dat verklaart hoe een vergiftigd pakket geldige provenance kon krijgen. Alle tijden zijn in UTC; de commit-tijden zijn afkomstig van SafeDep en de GitHub API, en de publicatie-, verwijderings- en advisory-tijden zijn afkomstig van Tensorlake.

Lees dit in samenhang: de payloadbestanden kwamen op 7 oktober terecht in de main branch van de repository, de versie werd die ochtend om 03:57 op 0.5.144 gezet, en er werd niets gepubliceerd totdat een account de volgende dag om 00:08 de releaseworkflow handmatig startte. De gecompromitteerde broncode bleef ongeveer twintig uur in de branch staan voordat de eigen pipeline van het project er een build van maakte. Dat is de hele aanval op het releasepad — geen vervalste attestatie, geen opnieuw gepubliceerde tarball. De provenance was accuraat met betrekking tot een build van code die nooit in de branch had mogen zitten.
De dodemansschakelaar
Het deel van dit incident dat geen precedent heeft in eerdere npm-compromissen, is wat er gebeurt nadat een slachtoffer correct reageert. Als het gestolen GitHub-token bij een account zonder organisaties hoort, zoals SafeDep meldt, installeert de worm gh-token-monitor: een service die api.github.com/user met dat gestolen token elke 60 seconden gedurende 24 uur bevraagt. Wanneer GitHub een 40x retourneert — zoals gebeurt op het moment dat het token wordt ingetrokken — voert de monitor een door de aanvaller aangeleverde handler uit en verwijdert de thuismap van de gebruiker.
Socket beschrijft dezelfde component als het gebruik van een PowerShell-monitor die blijft voortbestaan via een ONLOGON geplande taak, waarbij een door de aanvaller aangeleverde handler wordt uitgevoerd via Invoke-Expression, en merkt op dat de code de letterlijke tekenreeks "IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner" bevat, die in eerdere Shai-Hulud-golven is gezien. SafeDep noemt de handler rm -rf ~/. De bewoording van Socket is expliciet dat dit afgaat ongeacht waar de intrekking plaatsvindt; de monitor is lokaal, en de intrekking niet. Alle vier bronnen — Socket, SafeDep, StepSecurity en Tensorlake's eigen advies — geven dezelfde volgorde van handelingen: verwijder eerst de monitor, trek daarna in.
Wat is vastgesteld, en wat is alleen maar afgeleid
Het archief vermeldt geen bevestigde schade voor deze vermelding, en de bronnen ondersteunen dat, in plaats van dat ze het slechts niet tegenspreken.
• Tensorlake verklaart dat de versie niet wordt gebruikt. In hun advies staat dat het bedrijf het SDK-gebruik monitort via user-agent-headers en "sinds de release geen enkel gebruik van deze versie heeft gezien". Dat is een verklaring van de leverancier over zijn eigen telemetrie, geen gecontroleerde telling.
• Het downloadcijfer is geen infectieaantal. Socket meldt dat het pakket ongeveer 12.000 wekelijkse downloads heeft en merkt op dat dit het totale gebruik van het pakket beschrijft, niet het aantal downloads van de kwaadaardige versie; SafeDep noemt ongeveer 106.000 maandelijkse downloads voor hetzelfde pakket. Geen van beide is bewijs dat 0.5.144 ergens is uitgevoerd. Het venster van de gemarkeerde release van Socket en het twee uur durende venster van Tensorlake komen overeen met een versie die werd verwijderd voordat deze zich verspreidde.
• De eigen fouten van de payload kunnen hem hebben beperkt. SafeDep vond er twee: het npm-verspreidingspad heeft ./dist/Math_Symbol.js op schijf nodig en stopt zonder dat, en de geïmplanteerde loader zoekt naar ai_init.js terwijl de worm math_init.js schrijft. SafeDep bestempelt deze bevindingen als beperkingen op verspreiding, en het artikel behandelt ze als de lezing van de code door één analyse, niet als een garantie dat er niets is verspreid.
• De provenance-attestatie is echt. Dit is geen betwiste bewering: npm-provenance legt vast waar een pakket is gebouwd en door welke workflow, en in dit geval legde het de waarheid vast — de eigen releaseworkflow van het project, die vergiftigde broncode bouwde. Het advies van Tensorlake zegt het in zoveel woorden: "het pakket heeft geldige npm-provenance". Socket maakt hetzelfde punt duidelijk wanneer het opmerkt dat provenance "zegt waar een pakket is gebouwd. Het zegt niet dat de code veilig is."
Verschillende details die in omloop zijn, zijn claims op basis van één enkele analyse en moeten als zodanig worden gelezen. Het specifieke mechanisme waarmee de aanvaller het account van de maintainer heeft verkregen, is door geen van de onderzoekende bedrijven gepubliceerd, noch door Tensorlake. Het Ethereum-contractadres en de rol ervan bij het resolven van het endpoint komen voor in de verslagen van SafeDep en Socket — Socket zegt dat de payload zijn endpoint resolveert via een Ethereum-contract dat ongeveer 30 openbare RPC-endpoints gebruikt, met een GitHub-fallback, terwijl SafeDep het aantal RPC's op 35 stelt en meldt dat het contract op 8 oktober iseekaigogo.com retourneerde — en Tensorlake bevestigt het endpoint en het contract in zijn advies. Het exacte aantal RPC's verschilt tussen de twee rapporten; het ontwerp niet.
Eén hiaat in de openbare verslaglegging is het waard om ronduit te vermelden. Geen van de bronnen die voor dit artikel zijn onderzocht, meldt een bevestigde downstream-infectie — een ander pakket of een andere repository, vergiftigd door de worm met behulp van inloggegevens die uit dit exemplaar zijn gestolen. De verspreidingscode bestaat en SafeDep heeft die gelezen; of die een tweede slachtoffer heeft opgeleverd, is onbekend.
Wat veranderde er daarna?
De reactie was sneller en beter gecoördineerd dan het incident.
• De versie is verdwenen. Deze was live van 01:12 tot 02:54 UTC op 8 oktober, volgens Tensorlake; SafeDep meldt dat npm deze heeft verwijderd. Bij het rechtstreeks opvragen van het npm-register op 10 oktober voor dit artikel, 0.5.144 komt niet langer voor tussen de gepubliceerde versies van het pakket, en de nieuwste tag van het pakket is 0.5.148. In het advies van Tensorlake wordt ontwikkelaars gewezen op 0.5.143 als de laatste niet-getroffen versie.
• Het beveiligingsadvies is gepubliceerd met een oplossing. In het beveiligingsadvies GHSA-8g63-53c9-65j2 van Tensorlake staat dat de PyPI- en crates.io-tensorlake-pakketten en de tensorlake CLI niet getroffen waren — alleen het npm-pakket was getroffen — en dat versies 0.5.143 en eerder niet getroffen zijn. SafeDep meldt dat de beheerders de broncode hebben teruggedraaid in pull request #1016 en 0.5.145 hebben uitgebracht.
• De openbaarmakingsthread is ongewoon compleet. Onderzoeker Ashish Kurmi van StepSecurity opende GitHub-issue #1014 op 01:22:02 UTC op 8 oktober — ongeveer tien minuten na de publicatie — met een verwijzing naar het eigen verslag van StepSecurity over wat het de "hostage token"-worm noemt. Oliver Smith van Aikido merkte op dat de payload was geïntroduceerd in commit 41b38f0 en identificeerde die als een nieuwe Shai-Hulud-infostealer. Maintainer David Lorenzo — de maintaineridentiteit die op het npm-pakket vermeld staat als calavera — antwoordde op 9 oktober door het beveiligingsadvies te bevestigen en het issue dezelfde dag als afgerond te sluiten. De titel van het issue weerspiegelt zelf het bewijs: het begon als een "mogelijk kwaadaardig"-rapport en werd tegen de tijd dat het werd gesloten zodanig hernoemd dat de payload zonder voorbehoud als kwaadaardig werd beschreven.
• De campagne waartoe dit behoort, is groter dan dit pakket. Socket, SafeDep en Aikido plaatsen de Tensorlake-release allemaal in de ChainDrop / Mini Shai-Hulud-golf die voor het eerst werd gedocumenteerd in begin augustus 2026, waarvan de npm-slachtoffers keyv, cacheable en gerelateerde pakketten omvatten. De advisory van Tensorlake zegt hetzelfde, met verwijzing naar Socket, SafeDep en Aikido.
De richtlijn van Socket aan iedereen die deze versie heeft geïnstalleerd, is dat de host als gecompromitteerd moet worden beschouwd: controleer lockfiles, manifests en buildlogs op de versie; verwijder de gh-token-monitor-service voordat u een token intrekt; roteer daarna inloggegevens vanaf een schone machine. De advisory van Tensorlake voegt dezelfde volgorde toe en suggereert om pakketregisters en repositories waarnaar de blootgestelde tokens kunnen schrijven te controleren op onverwachte releases. De write-up van Aikido adviseert om ignore-scripts=true in .npmrc in te stellen om install hooks te blokkeren, en elke machine waarop de hook heeft gedraaid als volledig gecompromitteerd te behandelen.
Dit is één registratie, gemeld door anderen en hier met verwijzing naar hen aangehaald. De andere gedocumenteerde incidenten met agents, elk met eigen bronnen, ernstgraad, betrouwbaarheidsscore en betwist-markering, staan in het AI-incidentenarchief — zo kan een supplychaincompromis gericht op agent-tooling gelezen worden naast de rest van wat daadwerkelijk is gebeurd.
