Masken med giltigt kvitto – därför stoppar proveniens inte npm-maskarna
Shai-Hulud-masken kunde publicera paket med giltig proveniens via betrodda byggflöden. Proveniens visar var ett paket byggdes, inte att det är ofarligt.
Av Redaktionen

I september 2025 fick GitHub veta att en mask spred sig i npm, det register där världens JavaScript-utvecklare hämtar och publicerar sina programbibliotek. Masken, som fick namnet Shai-Hulud, stal inloggningsuppgifter från utvecklarnas datorer och använde dem för att publicera nya, infekterade versioner av deras andra paket. Över 500 paket fick tas bort.
Ett år senare har masken fått efterföljare, och registret har ändrat sina regler flera gånger om. Den mest lärorika detaljen kommer från Microsofts analys av en av de nya vågorna i augusti 2026: paket som masken publicerade genom betrodda byggflöden kunde bära giltig proveniens. Det kvitto som skulle visa att ett paket är äkta var också äkta.
Ett paket som publicerar sig självt
Ett modernt JavaScript-projekt kan bestå av hundratals eller tusentals paket som andra har skrivit. När en utvecklare installerar dem kan paketen köra egna skript, till exempel för att kompilera kod. Det är den vägen masken tar sig in.
Enligt Microsofts genomgång av den variant som kallas ChainDrop lägger masken till en så kallad preinstall-krok, ett skript som körs automatiskt innan installationen ens är klar. Skriptet startar ett obfuskerat program som letar efter inloggningsuppgifter för npm, GitHub, molntjänster och infrastruktur: i filer, miljövariabler, kommandoradsverktyg och i minnet hos de servrar som kör GitHubs byggflöden.
Hittar masken en giltig npm-nyckel börjar den föröka sig. Den listar alla paket som den kapade identiteten har rätt att publicera, hämtar den senaste versionen av varje, lägger in skadekoden och kroken, höjer det sista versionsnumret ett steg och publicerar igen. För den som använder paketet ser det ut som en vanlig buggrättning. Microsoft räknade till mer än 400 drabbade paket hos flera utgivare som inte hade med varandra att göra.
Den ursprungliga vägen in pekar enligt Microsoft på stulna inloggningsuppgifter för någon som underhåller ett paket. Därefter sprids masken med de nycklar den själv stjäl, och i vissa fall med de tillfälliga behörigheter som GitHubs byggflöden får för att publicera.
Kvittot som var äkta
Efter den första vågen 2025 presenterade GitHub en plan som byggde på två idéer. Långlivade nycklar skulle fasas ut, och publicering skulle i stället ske genom betrodd publicering, trusted publishing. Då publicerar ett byggflöde i till exempel GitHub Actions paketet med en kortlivad, kryptografiskt signerad token som är knuten till just det flödet och inte kan återanvändas. Det finns ingen nyckel att stjäla från en utvecklares dator.
Publiceras paketet från ett publikt repo får det dessutom automatiskt proveniens, en signerad uppgift om vilket repo och vilket byggflöde som skapade det. Den som installerar paketet kan kontrollera att det byggdes där det påstår sig ha byggts.
Det masken utnyttjade är att proveniens svarar på frågan var ett paket byggdes, inte om det är ofarligt. npm säger det själv i sin dokumentation: proveniens garanterar inte att paketet saknar skadlig kod, utan ger en verifierbar länk till källkoden och bygginstruktionerna, som utvecklare sedan kan granska. När masken lyckades köra i ett byggflöde som var konfigurerat som betrodd utgivare blev publiceringen, med Microsofts ord, en publicering från en legitim arbetsflödesidentitet. Kvittot var korrekt. Det var bygget som var förgiftat.
Det betyder inte att proveniens är meningslös. Ett paket som brukar ha proveniens men plötsligt publiceras utan, från en stulen nyckel på en annan dator, avviker från mönstret, och det kan vara en varningssignal. Men en kapad identitet som är äkta ger ett äkta kvitto.
Varför siffrorna inte stämmer överens
Uppgifterna om hur stort angreppet är går isär, och det beror delvis på vad som räknas. Microsoft anger mer än 400 paket. Singapores cybersäkerhetsmyndighet CSA skrev i sin varning den 6 augusti 2026 att kampanjen hade drabbat över 1 300 paketversioner med sammanlagt 2 miljarder nedladdningar per månad. Ett paket kan ha flera infekterade versioner, och nedladdningssiffran gäller paketens vanliga trafik, inte antalet infekterade installationer.
Varianterna fortsätter dessutom att komma. Enligt säkerhetsföretaget JFrog, som tidningen The Register återgav den 26 oktober 2026, har en ny mask ur den så kallade Miasma-familjen i hemlighet beväpnat 42 repon hos 11 ägare. Den gömde skadekoden i så stora filer, omkring 13 megabyte, att de undgick de sök- och API-funktioner hos GitHub som normalt används för att hitta den här typen av intrång, och den raderar användarens hemkatalog om den stulna GitHub-nyckeln återkallas.
Registret drar i handbromsen
Under 2026 har GitHub ändrat npm i flera steg. Tillsammans pekar ändringarna åt samma håll: tilliten flyttas tillbaka från automatiken till en människa.
Skripten stängs av
I npm version 12, som enligt GitHub var allmänt tillgänglig i juli 2026, körs beroendenas installationsskript inte längre om de inte uttryckligen tillåts. Det gäller just de preinstall-, install- och postinstall-krokar som masken använder, och även automatiska kompileringar med verktyget node-gyp. Microsoft rekommenderar uppgraderingen i sin analys.
En människa godkänner
Sedan september är utgångsläget att betrodda utgivare stegar nya versioner i stället för att publicera dem direkt. En stegad version blir synlig först när en människa har godkänt den med tvåfaktorsinloggning, och knappen för att godkänna är spärrad tills registrets skanning efter skadlig kod är klar. Direkt publicering måste väljas till, och GitHub rekommenderar att avstå från det. Runt januari 2027 räknar GitHub med att de nycklar som i dag kan kringgå tvåfaktorsinloggning inte längre får publicera direkt, utan bara stega.
Namn räcker inte
Den 2 oktober började okontrollerade konfigurationer för betrodd publicering att upphöra efter 48 timmar, om de inte har använts för en lyckad publicering. GitHubs motivering är risken att lita på ett repo- eller projektnamn som byter ägare. Enligt The Hacker News hade säkerhetsföretaget Bloom Security i juni rapporterat att tilliten var knuten till repots namn, inte till dess permanenta id, och att över 1 500 paket gick att kapa på det sättet. Samtidigt slutade npm godta publiceringsnycklar från byggflöden som startas av kommentarer i ärenden.
Utvecklarens verktyg som ny attackyta
Den nya vågen har också en detalj som pekar framåt. Med stulna GitHub-uppgifter lägger ChainDrop in konfigurationsfiler för AI-assistenten Claude och för utvecklingsmiljön VS Code i repona, enligt Microsoft för att senare aktivitet i de verktygen ska kunna starta skadekoden igen, långt efter att den ursprungliga installationen är borttagen. Masken som JFrog beskrev i oktober planterade enligt The Register motsvarande krokar för Claude, Gemini, Cursor och VS Code.
Det flyttar frågan bortom paketregistret. Inställningsfiler för kodassistenter och utvecklingsmiljöer ligger i samma repo som koden, och enligt Microsofts analys räcker de för att starta skadekoden på nytt. När AI-agenter får allt större frihet att köra kod på utvecklarens dator blir deras inställningar en plats där en angripare kan gömma sig.
Vad tillit i öppen källkod kostar
Npm byggdes för att det skulle vara så enkelt som möjligt att dela kod. Det är också det som gör en mask möjlig: ett paket som installeras automatiskt, kör skript automatiskt och kan publiceras automatiskt. Varje åtgärd som GitHub har infört lägger tillbaka en paus i den kedjan, ett skript som inte körs förrän någon har sagt ja eller en version som inte syns förrän en människa har godkänt den.
Pausen har ett pris. Den gör släpp långsammare och lägger mer arbete på de underhållare som redan bär ekosystemet. Men erfarenheten från de senaste fjorton månaderna är tydlig. Signaturer och proveniens kan visa var något kommer ifrån. Att bygget var rent kan de inte visa. Det kräver fortfarande att någon tittar.
FAQ
Vad är Shai-Hulud-masken?
En självspridande skadekod i JavaScript-registret npm som upptäcktes i september 2025. Den stjäl inloggningsuppgifter från utvecklare och byggservrar och använder dem för att publicera infekterade versioner av andra paket. Nya varianter har dykt upp under 2026.
Betyder giltig proveniens att ett paket är säkert?
Nej. Proveniens visar vilket repo och vilket byggflöde som skapade paketet. npm skriver själv att det inte garanterar att paketet saknar skadlig kod. Enligt Microsoft kunde paket som masken publicerade genom betrodda byggflöden bära giltig proveniens.
Hur sprider sig masken mellan paket?
Med en stulen npm-nyckel listar den alla paket som identiteten får publicera, lägger in skadekoden och en preinstall-krok, höjer versionsnumret ett steg och publicerar igen.
Vad har npm ändrat efter angreppen?
I npm version 12 körs beroendenas installationsskript inte utan tillstånd. Betrodda utgivare stegar nu nya versioner som standard, och de blir synliga först efter ett mänskligt godkännande. Okontrollerade konfigurationer för betrodd publicering upphör efter 48 timmar.
Varför anger källorna olika antal drabbade paket?
De räknar olika saker. Microsoft anger mer än 400 paket, medan Singapores cybersäkerhetsmyndighet anger över 1 300 paketversioner. Ett paket kan ha flera infekterade versioner.
// Källor och referenser
- ChainDrop supply chain compromise: Anatomy of a self-propagating worm, Microsoft Security Blog, 4 aug. 2026.
- Ongoing npm Supply Chain Attack Affecting Keyv and Related Packages ("Shai-Hulud" Worm), AD-2026-009, Cyber Security Agency of Singapore, 6 aug. 2026.
- Our plan for a more secure npm supply chain, GitHub, 22 sep. 2025.
- Widespread Supply Chain Compromise Impacting npm Ecosystem, CISA, 23 sep. 2025.
- npm install-time security and GAT bypass2fa deprecation, GitHub Changelog, 8 juli 2026.
- Multiple trusted publishing configurations for npm, GitHub Changelog, 3 sep. 2026.
- Unvalidated npm trusted publishing configurations now expire, GitHub Changelog, 2 okt. 2026.
- Generating provenance statements, npm Docs.
- Trusted publishing for npm packages, npm Docs.
- GitHub Tightens npm Publishing After Flaw Left 1,500+ Packages Vulnerable to Hijacking, The Hacker News, 13 okt. 2026.
- Worm armed 42 GitHub repos by hiding a payload too big to fail, The Register, 26 okt. 2026.
Få AI-burkens nya analyser via e-post
Du får först ett mejl där du bekräftar adressen. Varje nyhetsbrev har en länk för att avsluta prenumerationen.
Adressen sparas av AI-burken och används bara för nyhetsbrevet. Läs integritetspolicyn