Keyv-gekoppelde npm-worm vergiftigt honderden pakketten, planten Claude Code en VS Code Hooks

Een inloggegevens stelende npm-worm die voor het eerst verscheen in [email protected] verspreidde zich op 4 augustus 2026 buiten de Keyv- en Cacheable-naamruimten naar honderden pakketten over meerdere organisaties.

SafeDep heeft 353 vergiftigde versies van 79 pakketnamen in het npm-register geverifieerd. Uit de monitoring kwam het bredere bereik op 442 versies verdeeld over 353 namen, terwijl Aikido later minstens 868 pakketten rapporteerde verdeeld over 1.381 versies. Geen van beide bredere totalen was onafhankelijk reproduceerbaar op basis van een volledige openbare lijst op het rapportagegrenspunt.

De kwaadaardige release gebruikte een preinstall script om een ​​bundel voor het stelen van inloggegevens uit te voeren binnen ontwikkelaars- en continue integratie (CI)-omgevingen. SafeDep en Socket zeggen dat het repository-, pakketregister-, cloud- en privé-sleutelmateriaal kan verzamelen en vervolgens de beschikbare npm-publicatietoegang kan gebruiken om meer pakketten te vergiftigen.

De Keyv-repository behield ook afzonderlijke Claude Code- en Visual Studio Code-hooks (VS Code) die de payload kunnen uitvoeren zodra een gebruiker de werkruimte vertrouwt of de projectconfiguratie toestaat.

Socket zegt dat elk werkstation of elke runner die een getroffen versie heeft uitgevoerd, moet worden behandeld als blootgesteld aan referenties. SafeDep adviseert hulpverleners om de watcher voor het intrekken van inloggegevens van de malware te verwijderen voordat blootgestelde tokens en sleutels worden gerouleerd.

Intrekking is de trigger van de waarnemer; Door eerst te roteren, kan een door de aanvaller geleverde lokale handler worden uitgevoerd. npm 12 blokkeert standaard niet-goedgekeurde levenscyclusscripts voor afhankelijkheid, maar eerdere npm-clients en andere installatiepaden die levenscyclusscripts toestaan, blijven zichtbaar.

De eerste bevestigde kwaadaardige release was [email protected]. Het voegde eraan toe node setup.mjs als een preinstall commando en inbegrepen setup.mjs En Math_Symbol.js in het pakket terwijl de gecompileerde bibliotheekcode ongewijzigd blijft.

Fase één controleert op Bun, downloadt indien nodig versie 1.3.13 van de officiële GitHub-releases van de runtime en draagt ​​over aan een gecompileerde bundel van 727.680 bytes.

De payload-analyse van SafeDep zegt dat de bundel GitHub, npm, cloud, Vault, Kubernetes, database en privé-sleutelmateriaal verzamelt. Het leest ook het runner-geheugen van GitHub Actions, installeert een token-intrekkingswatcher en bevat npm-publicatiemachines. Socket afzonderlijk gedecodeerde code voor het wijzigen, versiebeheer en opnieuw publiceren van pakketten die beschikbaar zijn voor een gestolen npm-identiteit.

Het register is te snel gewijzigd om een ​​vaste campagnebrede lijst met pakketten die nog steeds zijn getagd, te ondersteunen latest. Om 17:40 uur India Standard Time (IST) op 4 augustus lieten npm-pakketpagina’s zien dat eerdere releases waren hersteld als latest voor ten minste negen pakketten uit de initiële set van SafeDep, inclusief [email protected], [email protected]En [email protected].

De volledige campagne kon niet afzonderlijk per pakket in kaart worden gebracht, dus moeten blootstellingscontroles gebruikmaken van exacte pakketnamen, opgeloste versies en lockfiles in plaats van een in de cache opgeslagen lijst met huidige tags.

De door SafeDep en Aikido gerapporteerde totalen tellen kwaadaardige pakketartefacten, geen slachtoffersystemen. Ze bepalen de schaal van de campagne, maar laten niet zien hoeveel machines de payload hebben geïnstalleerd of uitgevoerd. Voor het bepalen van de blootstelling op systeemniveau is vereist dat de exacte afhankelijkheidsversie op de machine is opgelost en of het levenscyclusscript ervan is uitgevoerd.

Omdat tags veranderen, sommige gerelateerde pakketten schoon blijven en de volledige set onvolledig is, riskeert een blokkeerlijst op naamruimteniveau zowel het missen van vergiftigde versies als het behandelen van niet-getroffen releases als gecompromitteerd.

De repository heeft een tweede uitvoeringspad. Zijn .claude/settings.json bevat een SessionStart haak die roept .vscode/setup.mjs. De .vscode/tasks.json bestand bevat een Environment Setup taak mee runOn: folderOpen dat roept .claude/setup.mjs. Deze bestanden creëren een route voor het uitvoeren van de payload vanuit een uitgecheckte repository, maar ze draaien niet onvoorwaardelijk in elke standaardomgeving.

VS Code blokkeert automatische taken in een niet-vertrouwde werkruimte en geeft prompts weer voordat deze standaard worden toegestaan. Claude Code past werkruimtevertrouwen toe op door de repository geleverde projectinstellingen. Op 4 augustus om 17.40 uur IST waren beide hookfiles nog steeds aanwezig main. De core/keyv/package.json manifest nog steeds gedeclareerde versie 6.0.0behouden node setup.mjs als zijn preinstall opdracht en vermeld setup.mjs En Math_Symbol.js voor publicatie.

De vergiftigde Keyv-release had een geldige herkomst van OpenID Connect (OIDC) en Supply-chain Levels for Software Artefacts (SLSA), omdat deze de legitieme release-workflow van GitHub Actions van het project passeerde. Het attest identificeerde het bouwproces correct, maar kon niet vaststellen dat de bron die het binnenkwam veilig was.

SafeDep vond dezelfde payload onder directe npm-publicatieaccounts elders in de campagne. Er werd gezegd dat geautomatiseerde propagatie het beste past bij de timing en publicatie-bursts van de hele naamruimte, hoewel de initiërende functie niet werd hersteld.

Uit het bewijsmateriaal blijkt niet of de worm zich uitsluitend via één gestolen publicatie-identiteit verspreidde, of dat er ook afzonderlijk gecompromitteerde uitgeversreferenties bij betrokken waren. De pakketuitbarsting kan daarom niet vaststellen hoeveel accounts zijn gecompromitteerd.

De commit die de Claude Code- en VS Code-hooks plantte, had een groene GitHub-geverifieerde badge en een naam github-actions(bot) als auteur. De geverifieerde badge bevestigt dat de handtekening van de commit geldig was, terwijl SafeDep zei dat het auteurveld was ingesteld op github-actions(bot); geen van beide feiten identificeert wie de controle had over de inloggegevens die deze hebben ingediend.

Samen verifieerden de herkomst- en commit-records de build- en ondertekeningspaden, maar niet of de bron veilig was of wie de inloggegevens beheerde.

Niet elk pakket dat aan de oorspronkelijke beheerder was gekoppeld, was vergiftigd. SafeDep zegt dat het is gepubliceerd @keyv/* adapters en de Keyv 5.x-lijn waren schoon. De repository is een apart risico: bij een latere commit werden de payload-bestanden verspreid over alle 19 werkruimtepakketten, zodat een release uit de nog steeds vergiftigde boom ze zou kunnen bevatten.

Semgrep documenteerde dezelfde Claude Code- en VS Code-hooks, setup.mjs bestandsnaam en Bun 1.3.13 downloaden in een aprilcompromis van de lightning PyPI-pakket. Aikido plaatst de augustusactiviteit in de Shai-Hulud-familie. De overlap ondersteunt een verbinding tussen malware en familie. Er wordt niet vastgesteld wie de activiteit in augustus heeft uitgevoerd; noch het initiële toegangspad, noch een genoemde actor is bekend.

Er was geen openbare incidentverklaring van de beheerder, npm of GitHub te vinden op de rapportagegrens.

Update – 4 augustus 2026: SafeDep heeft het door het register ondersteunde aantal uitgebreid naar 1.684 vergiftigde versies in 420 pakketnamen die aan negen organisaties zijn gekoppeld, ter vervanging van de eerdere hierboven aangehaalde momentopname. Het bedrijf zei dat de worm elke twee tot zeven minuten tussen organisaties bewoog en de publicatie-uitbarsting tussen organisaties in ongeveer een half uur voltooide. Het afzonderlijke aantal Aikido’s blijft hoger per pakketnaam, maar lager per versie, dus de twee cijfers mogen niet worden gecombineerd.

SafeDep zei dat de vergiftigde Keyv- en Cacheable-releases sindsdien niet meer zijn gepubliceerd, maar latest ten tijde van de update nog steeds omgezet naar een kwaadaardige versie voor de meeste andere getroffen pakketnamen. Alleen al het upgraden kan de blootstelling daarom behouden.

Teams moeten lockfiles en opgeloste versies vergelijken met de lijst met getroffen pakketten, onnodige installatiescripts uitschakelen en omgevingen die een getroffen release hebben uitgevoerd, als gecompromitteerd beschouwen.

De onderzoekers telden ook 546 openbare GitHub-repository’s die op 4 augustus met de beschrijving waren aangemaakt Shai-Hulud: Here We Go Again en een results/ map. Deze opslagplaatsen zijn potentiële exfiltratie- of ensceneringsartefacten, geen 546 bevestigde slachtoffers. Bij een nieuwe controle bevatte de Keyv-repository nog steeds de .claude En .vscode mappen aan maininclusief de bestanden die zijn gekoppeld aan het afzonderlijke uitvoeringspad Claude Code en VS Code dat hierboven is beschreven.

Thijs Van der Does