Wat er tussen 09:35 en 11:44 UTC is gepubliceerd

De eerste vergiftigde uitgave was keyv versie 6.0.0, gepubliceerd op 4 augustus om 09:35 UTC. Semgrep, dat de campagne ChainDrop noemde, telde in de golf die volgde 1.557 kwaadaardige versies over 435 pakketten, tussen 09:40 en 11:44 UTC. Wiz volgde hetzelfde incident, kwam op meer dan 400 verschillende pakketten en herleidde het tot een beheerdersaccount waarvan de inloggegevens waren gestolen. Het waren geen naam-imitaties en geen nieuwe pakketten. Het waren de echte bibliotheken, opnieuw gepubliceerd onder de naam van de echte beheerder, met een extra bestand erbij.

Binnen een half uur stak de verspreiding de grenzen tussen organisaties over. Getroffen naamruimten waren onder meer @deliveroo, @ornikar, @qlik, @servicetitan, @onereach, @or-sdk, @arv-bedrock en @adminide-stack, naast de families keyv en cacheable zelf. Die organisaties delen geen code en geen eigenaar. Wat zij deelden was een gestolen publicatietoken: elke infectie oogstte npm-inloggegevens van de machine die het pakket installeerde en gebruikte die om alles opnieuw te publiceren wat dat token kon bereiken. Dat maakt dit een worm en niet een enkele vergiftigde uitgave.

De dragers zijn pakketten die niemand koos

Wij hebben de downloadcijfers uit het npm-register opgevraagd voor de 30 dagen tot en met 3 augustus, de dag voor de inbreuk. keyv haalde 619,7 miljoen downloads. flat-cache 579,8 miljoen. file-entry-cache 571,2 miljoen. cacheable-request 137,0 miljoen, cacheable 30,1 miljoen en cache-manager 16,3 miljoen. Die zes bibliotheken samen komen uit op ongeveer 1,95 miljard downloads in de maand voordat zij werden vergiftigd.

Bijna niemand installeert flat-cache of file-entry-cache doelbewust. Het zijn hulpmiddelen voor tussentijdse opslag die onder analyse- en bouwgereedschap meekomen, meerdere niveaus diep in een afhankelijkhedenboom, in projecten waarvan de verantwoordelijken geen van beide namen ooit hebben getypt. Daar zit het ongemakkelijke deel van de rekensom. De pakketten met het grootste bereik zijn precies die welke ontbreken op de afhankelijkhedenlijst die u hebt bekeken en goedgekeurd, waardoor het toetsen van uw eigen beslissingen bijzonder weinig zegt over dit incident. Het getal dat uw blootstelling voorspelt, is hoe vaak uw bouw op 4 augustus is uitgevoerd.

De schadelijke code zocht de assistent voor kunstmatige intelligentie

Het mechanisme was een preinstall-haak, en dat is van belang omdat die tijdens het oplossen van afhankelijkheden loopt en niet wacht tot uw code iets importeert. De laadbestanden setup.mjs en math_init.js haalden een zelfstandige Bun-uitvoeringsomgeving op en voerden een versluierde tweede fase uit. Wiz herkende het verkeer aan de user agent Bun/1.3.13. De verzamelaar richtte zich op npm-tokens, cloud-inloggegevens, SSH-sleutels, CI-geheimen, cryptomuntportefeuilles en configuratiebestanden van gereedschap voor kunstmatige intelligentie.

Hij schreef zijn persistentie ook in de mappen .claude en .vscode, wat een doelbewuste keuze is over waar ontwikkelaars hun vertrouwen nu leggen. Een editor en een assistent voor kunstmatige intelligentie beschikken over toegang tot de repository, rechten op de opdrachtregel en, steeds vaker, de bevoegdheid om opdrachten uit te voeren. De besturing zat verborgen in een Ethereum-slimcontract, gelezen met een eth_call en met het domein npm-cache[.]com als antwoord, zodat de operatoren hun infrastructuur kunnen verleggen zonder nieuwe schadelijke code te verspreiden. De weggesluisde gegevens gingen naar GitHub-repositories die onder de overgenomen identiteiten waren aangemaakt en de titel Shai-Hulud: Here We Go Again kregen, de naam van de familie waarvan deze code afstamt.

Twee uur is genoeg voor een NIS2-bevinding

Voor een bedrijf in de Europese Unie of het Verenigd Koninkrijk is de nalevingsvraag niet alleen of u geraakt bent, maar of u kunt beschrijven wat er is gebeurd. Twee van de getroffen naamruimten horen bij Deliveroo en Ornikar, een Brits bezorgplatform en een Frans bedrijf voor rijscholen. Geen van beide is een onbekende winkel en geen van beide koos ervoor om deel van dit incident te zijn. NIS2 legt de veiligheid van de toeleveringsketen bij de directie en niet bij het beveiligingsteam, en DORA vraagt financiële instellingen om hetzelfde bewijs over ICT-risico bij derden.

De vastlegging weegt dus even zwaar als het herstel. Stel vast of er op 4 augustus tussen 09:35 en ongeveer 15:00 UTC een bouw is uitgevoerd, het moment waarop het Ethereum-besturingskanaal werd gedocumenteerd terwijl de analyse nog liep. Roteer elke toegang die een uitvoerder kon bereiken, niet alleen het npm-token: cloudsleutels, GitHub-tokens, SSH-sleutels en Kubernetes- en Terraform-toegang. Bouw de uitvoerders opnieuw op in plaats van ze schoon te maken. Schrijf daarna op wat u wanneer hebt geroteerd, want dat document is wat de toezichthouder, de accountant of de verzekeraar zal opvragen. In Nederland is het Nationaal Cyber Security Centrum de instantie waar een meldplichtig incident terechtkomt.