Abstrakt teknisk illustration på ett mörkt marinblått fält: en liten platt vektoriserad paketkub till vänster om mitten, med en tunn bärnstensgul linje som krokar ner i en kompakt representation av en utvecklararbetsstation; en solfjäder av fina cyan- och stålblå filament breder ut sig åt höger från arbetsstationen mot många små cirkelformade noder på ett glest rutnät, varav två kröker sig tillbaka upp mot paketkuben, och en nod längst till höger står ensam och frånkopplad. Inga personer, logotyper eller text förekommer. OrcaRouter-logotypen är komponerad i det nedre högra hörnet.
AI Safety Incidents

Tensorlakes npm-SDK förgiftades för att stjäla autentiseringsuppgifter för AI-agenter – och för att radera din hemkatalog om du återkallade token

Författare

Alistair Wren

Publiceringsdatum

Senaste modellerna · 20Visa alla modeller →
Benchmarks: Artificial Analysis · uppdateras dagligen
Tillbaka till alla inlägg

Den 8 oktober 2026: en förgiftad release av tensorlake — npm-SDK:n för Tensorlakes plattform, som kör opålitlig, LLM-genererad kod i isolerade sandlådor — nådde npm-registret. Version 0.5.144 publicerades kl. 01:12:07 UTC; Sockets forskare säger att de flaggade den ungefär elva minuter senare. Det var inte en auktoriserad release. Tensorlake uppger att angriparen pushade in kod direkt i företagets GitHub-repositorium och publicerade den via projektets eget release-arbetsflöde, så paketet hade giltig npm-proveniens — ett signerat intyg som visar var det byggdes, för källkod som redan hade förgiftats. Företaget uppger att versionen var live i ungefär 1 timme 40 minuter, från 01:12 till 02:54 UTC, innan npm tog bort den.

Nyttolasten behövde ingen import och ingen körande agent. En preinstall-hook i paketmanifestet körde node lib/setup.mjs, en obfuskerad laddare som släppte ned Bun-runtime på maskinen och använde den för att köra lib/Math_Symbol.js, ett 856 501 byte stort stöldprogram för autentiseringsuppgifter och en självspridande mask. Alla som gjorde en vanlig installation av just den versionen körde den. Eftersom den var paketets latest-tagg var det den versionen som en standardinstallation valde medan den var live.

Det som gör detta fynd värt att spara är inte nyttolastens storlek — Shai-Hulud-familjen har dokumenterats tidigare. Det är mållistan. Vid sidan av npm- och GitHub-token, AWS-autentiseringsuppgifter, Kubernetes- och Vault-hemligheter, SSH-nycklar, .env filer, webbläsarlösenord och kryptovalutaplånböcker, samlade denna build specifikt in konfiguration för AI-utvecklingsverktyg och MCP-filer — de som är associerade med Claude Code, Cursor, Kiro, Windsurf och Zed, enligt Socket. Den skrev också sin egen .claude/settings.json och .vscode/tasks.json in i de arkiv den kunde nå, så att koden skulle köras igen nästa gång en utvecklare öppnade projektet i Claude Code eller VS Code. Det är en leveranskedjeattack som riktar sig direkt mot de maskiner som människor bygger agenter på.

Hur utgåvan kom ut från en underhållaress konto

Socket, SafeDep och Aikido publicerade var sin egen analys den 8 oktober, och deras redogörelser för mekanismen stämmer överens. Arkivets tillförlitlighetsgrad för denna post är A, den är inte markerad som omtvistad, och inget som hittats i källorna motsäger någon av dem.

SafeDeps genomgång spårar åtta commits till repots main-grenen mellan 01:20 och 03:57 UTC den 7 oktober, tillskrivna ett administratörskonto för repot och gjorda via GitHubs webbgränssnitt. Den commit som arkivet pekar ut som den första skadliga är 41b38f0, en revision av fyra filer från 03:44:48 UTC den 7 oktober vars meddelande är "Add files via upload" och som bär GitHubs verifierade signatur — GitHub signerar commits som görs i dess egen webbredigerare, så "verifierad" registrerar redigeringsytan, inte personen. Den commiten rörde inga filer utöver typescript/lib/Math_Symbol.js och typescript/lib/setup.mjs, enligt GitHub-API:et: nyttolasten, och inget annat.

SafeDep erbjuder en tolkning av operatörens beteende, betecknad som dess egen slutledning: den första redigeringen av preinstall-hooken bröt filens JSON-syntax och en reparationscommit följde nitton minuter senare, vilket beskrivs som förenligt med en person som redigerar filer i en webbläsare snarare än en skriptad pipeline. Inget som publicerats av Socket, SafeDep, Aikido, StepSecurity eller Tensorlake anger metoden genom vilken underhållarens konto övertogs.

Angriparen behövde ingen npm-token. SafeDep rapporterar att kontot startade projektets publish_npm.yaml-arbetsflöde manuellt den 8 oktober kl. 00:08 UTC; byggloggen visar nyttolastfilerna i den publicerade tarballen. Utgåvan använde npm trusted publishing, och syskonpaketen tensorlake-native-* som publicerades från samma körning har giltig SLSA-proveniens – proveniens som är genuint giltig för ett bygge av förgiftad källkod. Utgåvan publicerades tolv minuter efter att arbetsflödet startade.

Arkivet dokumenterar att repositoriet var komprometterat i ungefär 20 timmar innan publiceringen utlöstes – glappet som tidslinjen nedan redovisar commit för commit – vilket stämmer överens med Tensorlakes eget uttalande om att angriparen publicerade "genom vårt eget releaseflöde".

Vad nyttolasten gjorde när den väl kördes

A screenshot of a card titled 'A credential stealer with an AI-tooling list', kicked 'tensorlake@0.5.144 · what the payload collected', subtitled 'Per Socket, SafeDep and Tensorlake's advisory — grouped by what each collector reached for'. Three columns of paired labels sit side by side. 'Publishing and source control' lists npm tokens from .npmrc, the token API and the OIDC exchange; GitHub tokens with a repository and workflow permission check; GitHub Actions secrets read from Runner.Worker memory; and cryptocurrency browser wallets across 14 extensions. 'AI agent tooling' lists ~/.claude.json for Claude Code settings; ~/.kiro/settings/mcp.json for Kiro MCP config; .cursor, Windsurf and Zed config and MCP files; and .claude/settings.json and .vscode/tasks.json written back into reachable repositories. 'Cloud, cluster and endpoint' lists AWS via STS, SSM Parameter Store and Secrets Manager; Kubernetes service-account tokens and kubeconfigs; HashiCorp Vault at 127.0.0.1:8200; SSH and GPG keys, .env files and Docker and CLI files; the Wallets row, wallet.dat, Exodus, Electrum and MetaMask; and saved passwords via a downloaded HackBrowserData binary. A footer reads 'Collector list per Socket's initial assessment, SafeDep's decoded payload analysis and the Tensorlake advisory (GHSA-8g63-53c9-65j2). Socket flags AI development tooling for Claude Code, Cursor, Kiro, Windsurf and Zed by name.'

Sockets bedömning identifierar inhämtning från lokala filer, CI-miljöer, Kubernetes- och Vault-källor, samt exfiltrering, persistens och körning av fjärrlevererad kod. SafeDep återskapade den avkodade nyttolasten: lib/setup.mjs laddar ned Bun 1.3.13 från den officiella GitHub-utgåvan och använder det för att köra masken, och den avslutas på CI-runners — målet är en utvecklarmaskin, inte en byggagent. SafeDep upptäckte också att nyttolasten innehåller en vanlig kopia av samma loader, som den planterar i andra paket och repositorier.

Nyttolasten kör tre obfuskalager, som SafeDep avkodade utan att köra provet: en obfuskatorsträngarray, ett anpassat chiffer som använder saltet svksjrhjkcejg – identiskt med det som rapporterades i den tidigare keyv-komprometteringen – och AES-256-GCM över elva inbäddade filer, inklusive skript, hooks och två publika RSA-nycklar. Dess första rad bär byggtaggen WORMTAG='tensrlake', felstavad, vilket är hur SafeDep skiljer den här byggversionen från en pågående återinfektion.

Utöver konfigurationen av AI-verktyg är insamlingslistan bred och specifik: ~/.claude.json och ~/.kiro/settings/mcp.json för agentinställningar; SSH-nycklar, moln-CLI-filer, .npmrc, .env, Docker- och Kubernetes-filer samt shellhistorik; wallet.dat plus data från Exodus, Electrum och Ledger Live och webbläsartillägg för plånböcker som MetaMask och Phantom; AWS STS, SSM Parameter Store och Secrets Manager; GitHub Actions-hemligheter som läses från processminnet hos Runner.Worker; samt Kubernetes-token för tjänstekonton och Vault-token. Den hämtade en plattformsspecifik binärfil från iseekaigogo[.]com/hbd/<platform> och körde den med argumenten "dump -b all -c password -f json" – argument som matchar verktyget HackBrowserData, även om SafeDep påpekar att själva binärfilen inte återfanns och betecknar identifieringen som en slutsats. Masken avslutas vid ryska lokaler, tillägger SafeDep.

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.'

Persistensen är avsiktlig. Socket skrev om nyttolasten: "Den kombinationen utökar risken bortom en enda stulen API-nyckel," och tillade att "persistens kan behålla angriparens åtkomst efter att det påverkade beroendet har tagits bort." SafeDep rapporterar att masken committar Claude Code- och VS Code-hookfiler som git-författaren claude, och planterar ett "Run Copilot"-arbetsflöde som dumpar alla hemligheter i repositoriet och sedan raderar körningen och grenen. Tensorlake-rådgivningen uppmanar utvecklare som granskar sina loggar att leta efter en gren med namnet dependabot/github_actions/format/setup-formatter och commits som skapats under samma identitet.

Spridningen drivs av stulna tokens i stället för av en andra sårbarhet. Socket säger att masken räknar upp paketen som är kopplade till ett offers publiceringsidentitet, bygger Sigstore-proveniens och återpublicerar förgiftade versioner. SafeDep tillägger detaljen att den i CI lägger till ett git-beroende och signerar sin utdata med Fulcio och Rekor – så proveniensen för paketet den publicerar härnäst är lika giltig som proveniensen för 0.5.144 var.

De tjugo timmarna före publiceringen

Glappet mellan den första rogue-commiten och releasen är den del av tidslinjen som förklarar hur ett förgiftat paket kunde komma att bära giltig proveniens. Alla tider är i UTC; commit-tiderna är SafeDeps och GitHub API:s, och publicerings-, borttagnings- och rådgivningstiderna är Tensorlakes.

A screenshot of a card titled 'Compromised source in the repo, then one manual publish', kicked 'tensorlake@0.5.144 · the ~20-hour window', subtitled 'All times UTC. Commit times per SafeDep's timeline and the GitHub API; publish and removal times per the Tensorlake advisory.' Three columns sit side by side. '7 October 2026 — source, main branch' lists 01:20 setup.mjs and Math_Symbol.js added; 01:24 the preinstall script added; 01:43 package.json JSON repaired; 02:13 to 03:44 four loader and payload revisions; 03:44 commit 41b38f0, the payload commit; 03:57 the version set to 0.5.144. '8 October 2026 — release and removal' lists 00:08 publish_npm.yaml started by hand; 01:12:07 version 0.5.144 published to npm; 01:22:02 issue #1014 opened by StepSecurity; 01:23:10 flagged by Socket, about eleven minutes in; 02:54 the version removed, after roughly 1h 40m live; 20:24 version 0.5.145 published next. '9 October 2026 — disclosure closed' lists advisory GHSA-8g63-53c9-65j2; pull request #1016, source reverted and 0.5.145 cut; issue #1014 closed as completed; 0.5.143 as the last version stated unaffected; and no usage seen, per Tensorlake's user-agent telemetry. A footer reads 'The ~20-hour gap between the first rogue commit and the publish is SafeDep's commit timeline, and matches the archive's own upstream record.'

Läs tvärs igenom: nyttolastfilerna landade i repositoriets huvudgren den 7 oktober, versionen sattes till 0.5.144 kl. 03.57 den morgonen, och inget publicerades förrän ett konto startade release-arbetsflödet manuellt kl. 00.08 nästa dag. Den komprometterade källkoden låg i grenen i ungefär tjugo timmar innan projektets egen pipeline byggde den. Det är hela attacken mot releasevägen – ingen förfalskad attestation, ingen återpublicerad tarball. Proveniensen var korrekt om ett bygge av kod som aldrig borde ha funnits i grenen.

Dödmansgreppet

Det som saknar motstycke i tidigare npm-kompromisser i den här incidenten är vad som händer efter att ett offer reagerat korrekt. Om den stulna GitHub-token tillhör ett konto utan organisationer, rapporterar SafeDep, installerar masken gh-token-monitor: en tjänst som pollar api.github.com/user med den stulna token var 60:e sekund, i 24 timmar. När GitHub returnerar en 40x – vilket det gör i samma stund som token återkallas – kör monitorn en hanterare som angriparen har tillhandahållit och raderar användarens hemkatalog.

Socket beskriver samma komponent som att använda en PowerShell-övervakare som kvarstår genom en ONLOGON schemalagd uppgift, som kör en av angriparen tillhandahållen hanterare genom Invoke-Expression, och noterar att koden innehåller den litterala strängen "IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner", som setts i tidigare Shai-Hulud-vågor. SafeDep kallar hanteraren för rm -rf ~/. Sockets formulering är tydlig med att detta utlöses oavsett var återkallelsen sker; övervakaren är lokal, och återkallelsen är inte. Alla fyra källor — Socket, SafeDep, StepSecurity och Tensorlakes egen rådgivning — ger samma ordning av operationer: ta bort övervakaren först, återkalla sedan.

Vad är fastställt, och vad är endast härlett?

Arkivet registrerar ingen bekräftad skada för denna post, och källorna stöder detta snarare än att bara inte motsäga det.

• Tensorlake uppger att versionen inte har använts.I sitt rådgivande meddelande säger företaget att det övervakar SDK-användning via user-agent-rubriker och att man "inte har sett någon användning av denna version sedan den släpptes". Det är ett uttalande från leverantören om den egna telemetrin, inte ett granskat antal.

• Nedladdningssiffran är inte ett antal infektioner. Socket rapporterar att paketet har ungefär 12 000 nedladdningar per vecka och noterar att detta beskriver paketets totala användning, inte nedladdningar av den skadliga versionen; SafeDep anger cirka 106 000 nedladdningar per månad för samma paket. Inget av dessa är bevis för att 0.5.144 kördes någonstans. Sockets fönster för flaggad utgåva och Tensorlakes två timmars fönster stämmer överens med en version som togs bort innan den spreds.

• Nyttolastens egna buggar kan ha begränsat den. SafeDep hittade två: npm-spridningsvägen kräver ./dist/Math_Symbol.js på disk och stannar utan den, och den inplanterade loadern letar efter ai_init.js medan masken skriver math_init.js. SafeDep betecknar dessa fynd som begränsningar för spridning, och artikeln behandlar dem som en analyss läsning av koden, inte som en garanti för att inget spreds.

• Proveniensattesteringen är äkta. Detta är inte ett omtvistat påstående: npm-proveniens registrerar var ett paket byggdes och av vilket arbetsflöde, och i det här fallet registrerade den sanningen – projektets eget release-arbetsflöde, som byggde förgiftad källkod. Tensorlakes rådgivning uttrycker det med exakt dessa ord: ”paketet har giltig npm-proveniens”. Socket uttrycker samma poäng klart när de noterar att proveniens ”säger var ett paket byggdes. Det säger inte att koden är säker.”

Flera detaljer som cirkulerar är påståenden från en enda analys och bör läsas som sådana. Den specifika mekanism genom vilken angriparen kom över underhållarens konto har inte publicerats av något av de utredande företagen eller av Tensorlake. Ethereum-kontraktets adress och dess roll för att lösa upp slutpunkten förekommer i SafeDeps och Sockets redogörelser — Socket säger att nyttolasten löser upp sin slutpunkt via ett Ethereum-kontrakt som använder omkring 30 publika RPC-slutpunkter med en GitHub-reservlösning, medan SafeDep anger antalet RPC:er till 35 och rapporterar att kontraktet den 8 oktober returnerade iseekaigogo.com — och Tensorlake bekräftar slutpunkten och kontraktet i sin säkerhetsbulletin. Det exakta antalet RPC:er skiljer sig mellan de två redogörelserna; själva utformningen gör det inte.

En lucka i det offentliga materialet förtjänar att sägas rakt ut. Ingen av de källor som granskats för den här artikeln rapporterar om en bekräftad nedströmsinfektion – ett annat paket eller arkiv som förgiftats av masken med hjälp av inloggningsuppgifter stulna från detta. Spridningskoden finns och SafeDep har läst den; huruvida den skapade ett andra offer är okänt.

Vad förändrades efteråt?

Responsen var snabbare och mer samordnad än incidenten.

• Versionen är borta. Den var live från 01:12 till 02:54 UTC den 8 oktober, enligt Tensorlake; SafeDep rapporterar att npm tog bort den. Vid en direkt förfrågan till npm-registret den 10 oktober för den här artikeln, 0.5.144 förekommer inte längre bland paketets publicerade versioner, och paketets senaste tagg är 0.5.148. Tensorlakes säkerhetsmeddelande hänvisar utvecklare till 0.5.143 som den sista opåverkade versionen.

• Rådgivningen publiceras med en korrigering. Tensorlakes GHSA-8g63-53c9-65j2-rådgivning anger att PyPI- och crates.io-tensorlakepaket och tensorlake CLI påverkades inte – endast npm-paketet påverkades – och att versionerna 0.5.143 och tidigare inte påverkas. SafeDep rapporterar att underhållarna återställde källkoden i pull request #1016 och släppte 0.5.145.

• Avslöjandetråden är ovanligt komplett. StepSecuritys forskare Ashish Kurmi öppnade GitHub-ärendet #1014 kl. 01:22:02 UTC den 8 oktober — omkring tio minuter efter publiceringen — och hänvisade till StepSecuritys egen redogörelse för vad de kallar "hostage token"-masken. Aikidos Oliver Smith kommenterade att nyttolasten infördes i commit 41b38f0 och identifierade den som en ny Shai-Hulud-informationsstjälare. Underhållaren David Lorenzo — den underhållaridentitet som anges på npm-paketet som calavera — svarade den 9 oktober och bekräftade säkerhetsmeddelandet samt stängde ärendet som slutfört samma dag. Ärendets titel speglar själva bevisningen: den började som en "möjligen skadlig" rapport och hade, när ärendet stängdes, döpts om till att beskriva nyttolasten som skadlig utan förbehåll.

• Kampanjen som detta tillhör är större än detta paket. Socket, SafeDep och Aikido placerar alla Tensorlake-släppet i ChainDrop / Mini Shai-Hulud-vågen som först dokumenterades i början av augusti 2026, vars npm-offer inkluderade keyv, cacheable och relaterade paket. Tensorlakes rådgivning säger samma sak och citerar Socket, SafeDep och Aikido.

Sockets råd till alla som har installerat versionen är att värden ska betraktas som komprometterad: kontrollera lockfiler, manifest och byggloggar för versionen; ta bort gh-token-monitor-tjänsteninnan du återkallar någon token; rotera sedan autentiseringsuppgifter från en ren maskin. Tensorlakes rådgivning tillägger samma ordning och föreslår att man kontrollerar paketregister och repositorier som de exponerade tokenerna skulle kunna skriva till för oväntade utgåvor. Aikidos artikel rekommenderar att ställa in ignore-scripts=true i .npmrc för att blockera installationshooks, och behandla varje maskin där hooken kördes som fullständigt komprometterad.

Detta är en post, rapporterad av andra och här citerad med hänvisning till dem. De andra dokumenterade agentincidenterna, var och en med sina egna källor, allvarlighetsgrad, konfidensgrad och flagga för omstridd status, finns i AI-incidentarkivet — så att en kompromettering av leverantörskedjan riktad mot agentverktyg kan läsas bredvid resten av vad som faktiskt har hänt.