Iemand die 's avonds op een laptop zit te programmeren.
Nieuws4 augustus · 18:105 min leestijd

npm-worm besmet honderden pakketten via gekaapt account van keyv-beheerder

Een worm besmette sinds dinsdagochtend honderden npm-pakketten via het gekaapte GitHub-account van de keyv-beheerder. De malware steelt tokens uit CI en cloud, publiceert zichzelf verder en nestelt zich in hooks van Claude Code en VS Code.

Een zelfvermenigvuldigende worm op npm heeft sinds dinsdagochtend honderden pakketten besmet, nadat aanvallers het GitHub-account kaapten van jaredwray, de beheerder van de cachebibliotheken keyv en cacheable, meldt beveiligingsbedrijf Aikido.

Het gaat niet om pakketten die je bewust hebt gekozen. file-entry-cache en flat-cache zitten volgens de meting van Wiz Research in 46,6 procent van alle gescande cloud- en code-omgevingen, keyv in 46,3 procent: ze komen mee als onderliggende afhankelijkheid van iets anders. Draaide je dinsdag een build op zo'n project, dan kan de payload al zijn uitgevoerd voordat de installatie klaar was. En omdat de malware npm-tokens, GitHub-tokens, AWS-sleutels, Kubernetes-secrets en Vault-tokens leest en daarmee zelfstandig nieuwe besmette versies publiceert, is de schade niet één pakket maar je hele sleutelbos.

De tellingen lopen uiteen, de richting niet

Aikido kwam op 4 augustus om 13.37 uur op minstens 868 besmette pakketten over 1.381 versies, samen goed voor ruim twee miljard installaties per maand. Wiz telde ruim 400 losse pakketten en dateert het begin op dezelfde dag, 9.00 uur UTC. SafeDep hield het op 1.684 vergiftigde versies over 420 pakketnamen, verdeeld over negen organisaties. BleepingComputer, dat de campagne ChainDrop doopte, komt op meer dan 1.300 pakketten met samen twee miljard downloads per maand.

Die spreiding zegt minder over onenigheid dan over tempo. Aikido zag in de piek elke paar minuten vijftig tot honderd nieuwe pakketten besmet raken, en iedere onderzoeker telt iets anders: pakketnamen, versies of hele scopes. Het bereik eronder is in elk geval geen randgeval. flat-cache haalt 565 miljoen downloads per maand, file-entry-cache 557 miljoen en keyv 127 miljoen per week.

Hoe de besmetting binnenkomt

Twee bestanden doen het werk. setup.mjs is de dropper, Math_Symbol.js de versluierde payload van 728 kB. Een preinstall-regel start de dropper zodra je installeert; die haalt de Bun-runtime van GitHub en voert de payload uit voordat npm klaar is. Je hoeft de code dus nooit te draaien. De installatie zelf is genoeg.

Wat er meegaat is breed: authTokens uit ~/.npmrc, GitHub-tokens (classic PAT, OAuth, App-tokens en JWT OIDC), AWS-sleutels met sessietokens plus EC2- en ECS-metadata, Kubernetes-serviceaccounttokens, Vault-tokens, Stripe-sleutels, Slack-tokens, SSH-sleutels, Terraform-state en Docker-registry-credentials. Op GitHub Actions-runners leest de malware het procesgeheugen van de secret store uit. Met de buitgemaakte npm-tokens publiceert hij daarna zelf nieuwe versies van pakketten van andere beheerders, en zo groeit de besmetting zonder dat de aanvaller nog iets hoeft te doen.

De gestolen gegevens verdwijnen naar GitHub-repositories die onder gekaapte identiteiten worden aangemaakt, met de omschrijving "Shai-Hulud: Here We Go Again". De commandoservers zitten niet in de code: de malware haalt die domeinen op uit een smartcontract op Ethereum, zodat de aanvaller ze kan wisselen zonder de payload aan te raken.

Staafdiagram van Wiz Research met de meest voorkomende besmette pakketten. file-entry-cache en flat-cache staan in 46,6 procent van de gescande cloud- en code-omgevingen, keyv in 46,3 procent en cacheable-request in 42,7 procent (bron: Wiz Research)
Staafdiagram van Wiz Research met de meest voorkomende besmette pakketten. file-entry-cache en flat-cache staan in 46,6 procent van de gescande cloud- en code-omgevingen, keyv in 46,3 procent en cacheable-request in 42,7 procent (bron: Wiz Research)

De AI-hoek zit in je editor, niet in npm

Het detail dat dit incident onderscheidt van een gewone pakketvergiftiging staat buiten de pakketbeheerder. In de gekaapte repository stonden een .claude/settings.json met een SessionStart-hook en een .vscode/tasks.json met een taak "Environment Setup", allebei wijzend naar de kwaadaardige setup-bestanden. Wie de map opent in Claude Code of VS Code, start de payload daarmee opnieuw, volledig buiten npm om.

De rem daarop is workspace trust. VS Code blokkeert automatische taken in een map die je niet vertrouwd hebt en Claude Code past dezelfde controle toe. Dat helpt alleen zolang je niet uit gewoonte op "trust" klikt bij elke repository die je binnenhaalt. En het gevaar was er niet mee weg: npm zette de oude releases op 4 augustus in de middag terug als latest, maar de vergiftigde hookbestanden bleven op de main-branch van de repository staan, constateert The Hacker News.

Wat je vanavond controleert, in deze volgorde

De volgorde is hier geen detail, want er zit een dodemansknop in de malware. OX Security beschrijft dat het pakket sporen wist zodra het gestolen GitHub-token wordt ingetrokken. SafeDep adviseert daarom eerst de watcher die op die intrekking let te verwijderen, en pas daarna te roteren. Vijf stappen:

  • Vergelijk je lockfile met de lijsten. Wiz, Aikido, Socket en OX publiceerden lijsten met besmette pakketten en versies. Zoek in package-lock.json en in je buildlogs naar keyv, cacheable, cacheable-request, cache-manager, flat-cache en file-entry-cache.
  • Zoek de sporen op je machines. Een bestand node_modules/keyv/Math_Symbol.js, een map /tmp/bun-dl-*, uitgaand verkeer naar npm-cache[.]com, pypi-get[.]com of js-mirror[.]com, en de user-agent Bun/1.3.13 in je logs.
  • Behandel een geraakte omgeving als gecompromitteerd. Niet alleen de laptop van de ontwikkelaar, ook de CI-runner en de deployomgeving. Opnieuw opbouwen is veiliger dan opschonen.
  • Roteer alles wat de payload leest. npm- en GitHub-tokens eerst, daarna cloudsleutels, Kubernetes- en Vault-secrets, Stripe- en Slack-tokens en SSH-sleutels.
  • Zet installatiescripts uit waar dat kan. Installeren met npm ci --ignore-scripts in je pijplijn blokkeert precies de preinstall-stap waarlangs dit binnenkomt.

Waarom dit sneller ging dan de vorige keer

De aanval past in een reeks die sinds midden juni loopt. In juni kregen ruim 140 Mastra-pakketten voor AI-agenten een verborgen wachtwoordsteler via de gekaapte npm-scope, medio juli werden vier AsyncAPI-pakketten besmet, waaronder @asyncapi/specs met ruim twee miljoen downloads per week. Steeds hetzelfde patroon: geen obscuur typosquat-pakket, maar de publicatieketen van een vertrouwd project.

Wat verschuift is de snelheid. Deze golf groeide volgens Aikido van tien pakketten naar meer dan achthonderd in een halve werkdag. Geen handmatig controleproces houdt dat bij, dus de verdediging moet in je beleid zitten en niet in je reactietijd. Begin juli adviseerde de FBI om een pakketversie pas te installeren nadat die zeven dagen bestaat, juist omdat kwaadaardige versies meestal binnen enkele dagen worden ontdekt en teruggetrokken. Combineer dat met een vastgelegde lockfile en installeren via npm ci, dat stopt zodra lockfile en package.json niet overeenkomen, en een golf als die van vandaag komt op de dag dat hij losbarst simpelweg je omgeving niet in.

Veelgestelde vragen

Alisina Nawabi
Geschreven doorAlisina Nawabi

AI Product Engineer & Solutions Architect

Grip op je eigen stack

Een incident als dit legt bloot hoeveel code van vreemden er in je bedrijf draait zonder dat iemand er eigenaar van is. Ik denk mee over je architectuur, bouw en koppel je systemen en richt je pijplijn zo in dat updates en secrets geregeld zijn, self-hosted waar dat kan.

Meer informatie

Dit artikel is geproduceerd samen met het Agent Team. Meer over de redactie.

Genoemde integraties

Dit artikel noemt deze tools. Ik koppel ze op maat aan je eigen systemen.

Gerelateerde artikelen

Aanvallers besmetten populaire AsyncAPI-npm-pakketten met een inloggegevens-steler
Nieuws
4 min

15 jul 18:12

Aanvallers besmetten populaire AsyncAPI-npm-pakketten met een inloggegevens-steler

Aanvallers kaapten de release-pijplijn van vier veelgebruikte AsyncAPI-pakketten op npm en publiceerden versies met een inloggegevens-steler, waaronder @asyncapi/specs met ruim 2 miljoen wekelijkse downloads. Wie ze gebruikt, controleert nu en roteert tokens.

Amazon schrijft kaping van npm-pakketten debug, chalk en axios toe aan één Noord-Koreaanse groep
Nieuws
5 min

30 jul 22:12

Amazon schrijft kaping van npm-pakketten debug, chalk en axios toe aan één Noord-Koreaanse groep

Amazon koppelt de kapingen van npm-pakketten axios, debug, chalk en typo-crypto met medium confidence aan één Noord-Koreaanse groep. Het bereik was enorm, de buit klein, en het aanvalsambacht verschuift richting AI-scanners.

AI-codeeragent veilig instellen: permissies, goedkeuring en een wegwerpbare sandbox
Gids
Uitgebreide gids16 min

25 jul 13:02

AI-codeeragent veilig instellen: permissies, goedkeuring en een wegwerpbare sandbox

Claude Code, Codex en vergelijkbare agents draaien met jouw rechten op jouw schijf. Zo zet je ze vast met deny-regels, een OS-sandbox, een korte allowlist en een wegwerpomgeving voor code die je niet kent.

Wiz lanceert Atlas, een AI-agent die elk lek met een werkende exploit bewijst
Nieuws
5 min

29 jul 10:26

Wiz lanceert Atlas, een AI-agent die elk lek met een werkende exploit bewijst

Wiz brengt Atlas uit, een autonome AI-agent die kwetsbaarheden opspoort en elke vondst met een werkende exploit bewijst. Op de openbare CyberGym-ranglijst van UC Berkeley staat het systeem bovenaan met 90,9 procent.

Nep-SDK's van Paysafe en Skrill op npm en PyPI stelen ontwikkelaarsgeheimen
Nieuws
4 min

9 jul 00:09

Nep-SDK's van Paysafe en Skrill op npm en PyPI stelen ontwikkelaarsgeheimen

Beveiligingsbedrijf Socket vond zeventien nep-betaal-SDK's op npm en PyPI die zich voordoen als Paysafe, Skrill en Neteller. Ze geven een valse succesmelding terug en stelen ondertussen de cloud- en repository-sleutels van ontwikkelaars die er een betaalintegratie mee bouwen.

Model Context Protocol (MCP) uitgelegd voor de niet-developer: wat het is en hoe je weet of jouw software klaar is
Gids
8 min

20 jun 23:05

Model Context Protocol (MCP) uitgelegd voor de niet-developer: wat het is en hoe je weet of jouw software klaar is

MCP is de stekker waarmee AI bij je eigen systemen komt. Zonder code leg ik uit wat het is, en geef ik je de exacte vragen voor je leverancier of IT-partner.