Shai Hulud - npm-paket - leveranskedjeattack

Shai-Hulud: Förklaring av npm-paketmasken

TL; DR

Den 14 september 2025 identifierade forskare Shai Hulud, en självreplikerande mask gömd inuti npm-paket, vilket förvandlar en rutinmässig beroendeuppdatering till en fullskalig försörjningskedjan attackFörst upptäckt i @ctrl/litenfärg Paket av Daniel dos Santos Pereira, Shai-Hulud samlar in hemligheter, exfiltrerar dem via GitHub-repos och arbetsflöden och publicerar sig självt i registret med hjälp av stulna inloggningsuppgifter. Inom några dagar hoppade antalet infekterade paket från dussintals till hundratals, vilket bekräftar att Shaihulud är inte bara ytterligare en trojan utan en mask designad för att sprida sig automatiskt över npm-ekosystemet.

Inverkan: Alla utvecklare eller CI-användare som installerar publika npm-paket är i riskzonen.

Omedelbara åtgärder: blockera kända versioner, växla till installationer endast med låsfiler, rotera npm- och GitHub-tokens, granska arbetsflöden och övervaka indikatorer på kompromiss (IoC:er).

Vad hände?

Ocuco-landskapet Shai-Hulud leveranskedjeattack i npm-paket är en av de mest störande incidenterna på senare tid. Till skillnad från isolerade trojaner blandar denna mask stöld av autentiseringsuppgifter, automatiserad exfiltrering och självreplikeringFöljaktligen krympte infektionstidslinjen från veckor till bara timmar.

För DevOps-team är lärdomen tydlig: om varje installation kan exekvera kod, så är varje beroendeuppdatering en potentiell säkerhetsöverträdelse.

Möjliga initiala vektor- och riktade autentiseringsuppgifter

Tidig analys indikerar att attacken troligen började med stulna meriterTill exempel nätfiskekampanjer som förfalskar npm login eller MFA-prompter kan ha fångat utvecklartokens. När angriparna väl fått det första fotfäste spred sig masken genom att bädda in sig i npm-paket och stjäla fler hemligheter från:

  • npm-konfigurationsfiler tycka om .npmrc, som ofta innehåller publiceringstokens.
  • Miljövariabler och konfigurationer med GitHub PAT:er och CI/CD hemligheter.
  • Molnmetadata-slutpunkter (AWS, GCP, Azure) vilket ger kortlivade autentiseringsuppgifter för lateral förflyttning.

Därför blev stöld av autentiseringsuppgifter utgångspunkten. Med giltiga npm-tokens och GitHub-hemligheter kunde Shai-Hulud självreplikera över flera paket och repositorier utan extra mänsklig ansträngning.

Effekten av Shai-Hulud-attacken mot leveranskedjan på ledningen

Shai-Hulud är fortfarande aktiv idag. Denna mask påskyndar nedslagstidslinjen. Det som en gång tog veckor med en trojan utvecklas nu på timmar. Som ett resultat, Spridningen är snabbare och svårare att begränsa. Det går framåt genom att:

  • Stjäl npm-publiceringstokens och GitHub-hemligheter.
  • Publicerar sig själv igen i andra npm-paket.
  • Lägger till skadliga GitHub Actions-arbetsflöden för beständighet.

Vem drabbas:

Alla team som installerar publika npm-paket exponeras. Dessutom löper utvecklare med cachade npm- eller GitHub-tokens hög risk. CI-körare som använder hemligheter med bred omfattning är också sårbara.

Affärsrisk

Affärspåverkan växer snabbt. Stulna tokens kan leda till kontoövertagande, paketkapning och till och med missbruk av molnet. Dessutom gör ihållande GitHub-arbetsflöden det svårare att rensa. Därför, lag måste behandla Shai-Hulud som en pågående incident, inte en stängd.

Hur Shai-Hulud Supply Chain Attack fungerar i npm-paket

Angriparens mål och motiv

Kampanjen optimerar för tre saker:

  • Det första målet är att stjäla inloggningsuppgifter i stor skala från utvecklarbärbara datorer och CI-användare. Detta inkluderar npm-publiceringstokens, GitHub-tokens och molnuppgifter. Faktum är att flera analyser bekräftar systematisk insamling av hemliga data, som att köra TruffleHog och fråga molnmetadata-slutpunkter.
  • Det andra målet är att föröka sig automatiskt genom att missbruka publiceringsrättigheterna för komprometterade utvecklare. Som ett resultat expanderar ett fotfäste snabbt till många, eftersom nya infekterade versioner av andra paket dyker upp utan ytterligare mänsklig ansträngning.
  • Det tredje målet är att bestå och exfiltrera pålitligt genom GitHub-infrastrukturen. Angripare skapar ett offentligt repo med namnet "Shai-Hulud" med en dubbel bas64 data.json, och dessutom planterar de ett arbetsflöde som serialiserar ${{ toJSON(hemligheter) }} och postar den till en statisk webhook.

Den sannolika vinsten inkluderar långvarig åtkomst till register och källkod, snabb lateral förflyttning till molnkonton och möjligheten att ytterligare beväpna leveranskedjan. Offentlig rapportering visar att privata repo-enheter har blivit offentliga med en "-migration" suffix, vilket ökar dataexponering och momentum

Inuti Shai-Hulud-nyttolasten: bundle.js i npm-paket

Shai-Hulud skickas som en stor, Webpack-bundlad och kraftigt minimerad JavaScript-fil (bundle.js, cirka 3–3.7 MB) som körs från en efterinstallation haka i package.jsonFöljaktligen, Varje installation utlöser nyttolasten automatiskt. Denna design döljer identifierare, komprimerar kontrollflödet och samlar all logik i en enda artefakt som körs under installationen. Analytiker bekräftar konsekvent Webpack-bundling, ovanlig filstorlek och körning vid installationstid.

Obfuskations- och antianalysegenskaper som du kommer att se i exempel:

  • Minimerad modulgraf med numeriska modul-ID:n, glesa kommentarer och ett utplattat kontrollflöde. Dessutom, Denna struktur gör manuell granskning extremt svår.
  • Strängdöljning via base64-lager och konstruktionshjälpmedel. Till exempel, Upprepad base64-kodning och avkodning förekommer vanligtvis runt exfiltreringsrutiner.
  • Dynamisk utskick dig genom eval-style-mönster och genererade funktionskroppar, vilket gör det möjligt för kod att ändra beteende vid körning.
  • OS-filtrering att föredra Linux- och macOS-körning, särskilt på CI-användare och bärbara datorer för utvecklare.

Ur ett funktionellt perspektiv är paketet modulärt. Sammanfattningarna beskriver moduler för OS-upptäckt, skanningar av filsystem och git-hemligheter, åtkomst till moln-SDK, GitHub API-operationer och en propageringsmotor som redigerar andra paket som ansvarig äger. Faktum är att både StepSecurity och ReversingLabs lyfter fram en funktion som automatiskt uppdaterar paket med den skadliga hooken.

Installationstidskörning i Shai-Hulud: Hur npm-paket utlöser masken

Attacken börjar när efterinstallation körs nod bundle.js. Vid denna tidpunkt initieras skriptet och packar upp arbetstillståndet i minnet, vilket sätter grunden för maskens fulla drift.

Upptäckt och skörd

  • Nyttelasten dumpar process.env och skannar lokala filer efter hemligheter med hög entropi och tokenprefix. Dessutom utökar den täckningen genom att köra TruffleHog.
  • Den frågar efter molnmetadata-slutpunkter för att samla in kortlivade autentiseringsuppgifter. Till exempel, ringer till 169.254.169.254 på AWS eller metadata.google.internal på GCP förekommer ofta hos infekterade värdar.
  • Följaktligen, Alla autentiseringsuppgifter som hittas blir omedelbart användbara för att publicera nya npm-paket eller pusha GitHub-arbetsflöden.

exfiltration

  • Masken skapar ett nytt GitHub-arkiv med namnet Shai Hulud och skriver en dubbel base64-kodad data.json med plattformsdetaljer, miljödumpar och hemligheter. Som man kan se är detta högljudda beteende lätt att upptäcka om försvarare vet var de ska leta.
  • Den planterar också ett GitHub Actions-arbetsflöde, ofta på en gren med namnet Shai-hulud, som serialiserar ${{ toJSON(secrets) }} och skickar informationen till en statisk webhook. Dessutom kvarstår detta arbetsflöde tills någon aktivt tar bort det.

Fortplantning

  • Med varje upptäckt npm-token räknar nyttolasten upp alla paket som ägs av den komprometterade utvecklaren. Sedan hämtar den varje tarball, injicerar bundle.js och en postinstall-post och publicerar paketet igen.
  • Som ett resultat kan dussintals infekterade paket dyka upp inom loppet av några timmar, vilket multiplicerar explosionsradien över ekosystemet.

Persistens och exponering

  • Masken håller skadliga arbetsflöden vid liv och, i flera fall, gör privata arkiv offentliga med en "-migration" suffix. Sammantaget säkerställer detta att angriparen behåller ett fotfäste och maximerar dataläckage.

Anmärkning om nyckeldetektering
Denna ovanliga användning av ${{ toJSON(secrets) }} i Actions-arbetsflöden är sällsynta. Därför, Lag bör behandla det som en stark indikator under jakter.

Sanerat arbetsflödesmönster du bör leta efter

Denna ovanliga användning av till JSON (hemligheter) i Åtgärder är en tydlig indikator i den här incidenten.

Pseudokod för utbredning på hög nivå (säker, beskrivande)

Analytiker observerade denna loop i stor skala, vilket förklarar det snabba hoppet från dussintals till hundratals infekterade paket.

Varför detta är en mask i ett paketekosystem

En mask är skadlig kod som sprider sig av sig själv utan att kräva manuella steg från operatören i varje steg. I operativsystem utnyttjar maskar vanligtvis nätverkssårbarheter för att förflytta sig från en maskin till en annan. Shai-Hulud däremot opererar inuti npm-registret. Dess effektiva väg går genom återanvändning av referenser.

Masken utnyttjar stulna npm-publiceringstokens. Så snart den får giltiga autentiseringsuppgifter publicerar den om infekterade versioner under andra paket som ägs av samma utvecklare. Därefter installeras dessa paket av intet ont anande utvecklare eller CI-användare, och cykeln upprepas.

Av denna anledning, säkerhetsanalytiker, inklusive Mörk läsning, klassificera Shai-Hulud som en självreplikerande mask snarare än en enkel trojan eller en typosquatting-incident. Skillnaden är viktig: en trojan angriper vanligtvis en värd, men en mask förstärker automatiskt dess inverkan över ett ekosystem.

Fusklappen "Hur det fungerar"

För att sammanfatta Shai-Huluds livscykel, här är en nackdelcisen fördelning av dess huvudsteg:

  • Ett paket med efterinstallation är installerad, och bundle.js verkställer.
  • Nyttelasten dumpar miljövariabler, skannar filer och git-historik, kör Tryffelgrisoch frågar efter molnmetadatatjänster. Följaktligen blir alla hittade hemligheter omedelbart användbara.
  • Exfiltrering sker på två sätt: för det första genom att skapa ett offentligt repository med namnet Shai Hulud med en dubbel base64-kodad data.jsonför det andra, genom att skapa ett GitHub Actions-arbetsflöde som publicerar ${{ toJSON(secrets) }} till en webhook.
  • Genom att använda en stulen npm-token publicerar masken om alla andra paket som ägs av den komprometterade utvecklaren med samma skadliga hook. På så sätt multipliceras infektionen snabbt.
  • Slutligen innehar angriparen fler hemligheter, fler paket att sprida igenom, och persistens inuti GitHub-konton och -arkiv.

Hur man undviker den här typen av attack, praktiskt taget

Shai-Hulud är en väckarklocka. En mask som stjäl tokens och publicerar sig själv på nytt är inte en framtida risk, den lever i npm-paketens ekosystem idag. För att förhindra den här typen av försörjningskedjan attack, team behöver kontroller som är programmerbara, automatiserade och verkställbara direkt i CI/CD pipelines. Det här är samma försvar som du redan kan implementera med Xygeni.

Stoppa dåliga artefakter vid grinden

Du bör skanna npm-paket och tarballs innan de når utvecklare eller CI-jobb. bundle.js filer, misstänkt efterinstallation hooksoch obfuskationsmarkörer fungerar alla som tidiga varningssignaler. Dessutom, att tillämpa avkylningsperioder och fastnålade versioner i pipelines förhindrar att färska, okontrollerade utsläpp konsumeras automatiskt.

Harden CI/CD som standard

Guardrails in CI/CD är viktiga. De avvisar sammanslagningar eller installationer som introducerar nya skript eller binärfiler. Samtidigt blockerar de arbetsflöden som serialiserar hemligheter eller försöker publicera externa inlägg. Team bör också kräva installationer endast för låsfiler (npm ci) över alla pipelines så att beroendemängder förblir reproducerbara och säkra.

Minska radien för tokenexplosioner

Hemligheter får inte bli enskilda felpunkter. Skanna kontinuerligt kod, konfigurationer och pipeline utgång för exponerade inloggningsuppgifterTokens bör begränsas av snävt, ha korta livslängder och roteras automatiskt när exponering upptäcks. Som regel ska alla tokens som används på en värd som körde en misstänkt postinstallation behandlas som komprometterade.

Se maskbeteende tidigt

Anomali upptäckt är nyckeln. Till exempel kan plötsliga toppar i npm-publiceringshändelser, nya arbetsflöden som dyker upp utan anledning eller nya publika repos fyllda med konstiga kodade filer alla signalera maskaktivitet. Därför bör team snabbt utfärda varningar och isolera alla underhållare eller löpare som visar dessa varningstecken.

Fixa snabbt utan att förstöra byggen

Hastighet och säkerhet måste gå hand i hand. Automatiserad pull requests kan ersätta komprometterade npm-paket med granskade versioner. Dessutom nåbarhet och utnyttjandebarhet Analys säkerställer att uppgraderingarna förblir minimala och stabila. Slutligen, återskapa drabbade CI-löpare från rena bilder när exponeringen har bekräftats, för att förhindra att attacken sprider sig ytterligare.

Indikatorer för kompromiss (IoC)

När man analyserar Shai-Hulud bör lagen vara uppmärksamma på båda. statiska IoC:er i filer och beteendemässiga IoC:er in pipelines. Tillsammans hjälper dessa signaler till att upptäcka infektioner tidigt och reagera innan masken sprider sig ytterligare.

Statiska IoC:er

Följande SHA-256-sammanfattningar observerades bundle.js prover:

  • 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
  • 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
  • dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c

Var dessutom uppmärksam på dessa återkommande mönster:

  • A bundle.js vid paketets rot.
  • "postinstall": "node bundle.js" inuti package.json.
  • Namngivna arkiv Shai Hulud.
  • GitHub-arbetsflöden som innehåller ${{ toJSON(secrets) }}.

Beteendemässiga IoC:er

Utöver filsignaturer visar sig maskaktivitet genom beteende. Till exempel:

  • Plötsliga utbrott av npm publicerar händelser från en utvecklare.
  • Nya arbetsflöden som skickar data till externa slutpunkter.
  • Utgående POST-förfrågningar utlösta från CI-körare.
  • Nyligen skapade offentliga databaser med kodade blobbar.

Snabba jakter

Slutsats: Lärdomar från Shai-Hulud

Ocuco-landskapet Shai-Hulud leveranskedjeattack i npm-paket visar hur bräcklig dagens programvaruleveranskedja har blivit. Denna mask gjorde mer än att bara lägga till skadlig kod. Den stal tokens, skickade ut data och publicerade sig sedan automatiskt igen. På grund av detta spred sig attacken på timmar istället för veckor.

För utvecklare och DevOps-team är lärdomarna tydliga:

  • Varje installation kör kod. Även ett vanligt npm-paket kan dölja en postinstall-mask.
  • Varje token har ett högt värde. När den väl är stulen kan den användas för att sprida skadlig kod ytterligare.
  • Var pipeline behöver kontroller. Utan guardrails på beroenden, arbetsflöden och hemligheter kan en enda kompromiss snabbt drabba produktionen.

Därför krävs det kontroller som är automatiska och enkla att genomdriva för att stoppa attacker som Shai-Hulud. Team bör skanna npm-paket före installationer, använda lockfile-byggen, upptäcka konstig publiceringsaktivitet och hålla tokens kortlivade. Dessa steg är inte längre valfria. Istället är de grunden för motståndskraft i moderna ... pipelines.

På Xygeni ser vi Shai-Hulud-attacken mot leveranskedjan som en varning för hela ekosystemet med öppen källkod. Den hållbara vägen framåt är att integrera leveranskedjans säkerhet direkt i utvecklingsprocessen, vid den punkt där kod, npm-paket och ... pipelines anslut.

Nedan finns en fullständig lista över npm-paket och versioner som rapporterats som komprometterade i Shai-Hulud. Använd den för att kontrollera dina låsfiler, register och CI. pipelines för exponering.

Lista över komprometterade paket

📦 Förhandsvisning av komprometterade npm-paket

Paket Namn Version Publiceringsdatum
json-rules-engine-simplified0.2.12025-09-14T17:58:51.203Z
flygpilot0.8.82025-09-14T18:35:07.600Z
mcp-kunskapsgraf1.2.12025-09-14T18:35:09.494Z
flygchef0.3.12025-09-14T18:35:09.521Z
hoppgrind0.0.22025-09-14T18:35:09.651Z
tvi-cli0.1.52025-09-14T18:35:10.996Z
@thangved/återuppringningsfönster1.1.42025-09-14T20:31:38.479Z
@tnf-dev/api1.0.82025-09-14T20:31:39.547Z
@tnf-dev/js1.0.82025-09-14T20:31:41.251Z
@tnf-dev/mui1.0.82025-09-14T20:31:41.259Z
@tnf-dev/core1.0.82025-09-14T20:31:42.728Z
@teselagen/react-table6.10.202025-09-14T20:37:08.597Z
@hestjs/demo0.1.22025-09-14T20:45:52.348Z
@nexe/eslint-konfiguration0.1.12025-09-14T20:45:53.625Z
@hestjs/eslint-konfiguration0.1.22025-09-14T20:45:55.044Z
@nexe/konfigurationshanterare0.1.12025-09-14T20:45:55.066Z
@nexe/logger0.1.32025-09-14T20:45:55.170Z
@hestjs/logger0.1.62025-09-14T20:45:55.197Z
@hestjs/validering0.1.62025-09-14T20:45:55.595Z
@hestjs/kärna0.2.12025-09-14T20:45:55.888Z
➡️ Visa fullständig lista över komprometterade paket
Paket Namn Version Publiceringsdatum
json-rules-engine-simplified0.2.12025-09-14T17:58:51.203Z
flygpilot0.8.82025-09-14T18:35:07.600Z
mcp-kunskapsgraf1.2.12025-09-14T18:35:09.494Z
flygchef0.3.12025-09-14T18:35:09.521Z
hoppgrind0.0.22025-09-14T18:35:09.651Z
tvi-cli0.1.52025-09-14T18:35:10.996Z
@thangved/återuppringningsfönster1.1.42025-09-14T20:31:38.479Z
@tnf-dev/api1.0.82025-09-14T20:31:39.547Z
@tnf-dev/js1.0.82025-09-14T20:31:41.251Z
@tnf-dev/mui1.0.82025-09-14T20:31:41.259Z
@tnf-dev/core1.0.82025-09-14T20:31:42.728Z
@teselagen/react-table6.10.202025-09-14T20:37:08.597Z
@hestjs/demo0.1.22025-09-14T20:45:52.348Z
@nexe/eslint-konfiguration0.1.12025-09-14T20:45:53.625Z
@hestjs/eslint-konfiguration0.1.22025-09-14T20:45:55.044Z
@nexe/konfigurationshanterare0.1.12025-09-14T20:45:55.066Z
@nexe/logger0.1.32025-09-14T20:45:55.170Z
@hestjs/logger0.1.62025-09-14T20:45:55.197Z
@hestjs/validering0.1.62025-09-14T20:45:55.595Z
@hestjs/kärna0.2.12025-09-14T20:45:55.888Z
@hestjs/cqrs0.1.62025-09-14T20:45:55.966Z
@hestjs/skalär0.1.72025-09-14T20:45:56.386Z
ng2-filuppladdning7.0.32025-09-15T02:44:29.555Z
kondensator-meddelandehanterare0.0.22025-09-15T04:54:48.431Z
kondensator-plugin-vonage1.0.22025-09-15T04:54:48.501Z
kondensator-plugin-hälsoapp0.0.22025-09-15T04:54:48.704Z
kondensatorandroidbehörigheter0.0.42025-09-15T04:54:48.753Z
VoIP-samtalskit1.0.22025-09-15T04:54:49.223Z
kondensator-plugin-ihealth1.1.82025-09-15T04:55:08.113Z
@art-ws/gemensam2.0.222025-09-15T05:21:15.411Z
@art-ws/config-eslint2.0.42025-09-15T05:21:17.199Z
ngx-ws1.1.52025-09-15T05:21:17.514Z
@art-ws/slf2.0.152025-09-15T05:21:17.524Z
@art-ws/http-server2.0.212025-09-15T05:21:17.745Z
pm2-gelf-json1.0.42025-09-15T05:21:18.413Z
@art-ws/di2.0.282025-09-15T05:21:18.488Z
@art-ws/di-node2.0.132025-09-15T05:21:18.849Z
@art-ws/config-ts2.0.72025-09-15T05:21:19.408Z
@art-ws/db-kontext2.0.212025-09-15T05:21:19.814Z
@art-ws/openapi0.1.92025-09-15T05:21:19.969Z
@art-ws/webbapp1.0.32025-09-15T05:21:20.383Z
@art-ws/ssl-info1.0.92025-09-15T05:21:20.927Z
sca-tools-programvara-verktyg-för-kompositionsanalys
Prioritera, åtgärda och säkra dina programvarurisker
Skaffa ditt gratiskonto.
Inga kreditkort krävs.

Säkra din programvaruutveckling och leverans

med Xygeni-produktsviten