TL; DR
14. september 2025 identifiserte forskere Shai Hulud, en selvreplikerende orm gjemt inni npm-pakker, og gjør en rutinemessig avhengighetsoppdatering om til en fullskala forsyningskjedeangrepFørst observert i @ctrl/litenfarge pakke av Daniel dos Santos Pereira, Shai-Hulud høster hemmeligheter, eksfiltrerer dem gjennom GitHub-repoer og arbeidsflyter, og publiserer seg selv på nytt i registeret ved hjelp av stjålne legitimasjonsdetaljer. I løpet av få dager hoppet antallet infiserte pakker fra dusinvis til hundrevis, noe som bekrefter at Shaihulud er ikke bare en annen trojaner, men en orm designet for å spre seg automatisk over npm-økosystemet.
Innvirkning: Enhver utvikler eller CI-bruker som installerer offentlige npm-pakker er i faresonen.
Umiddelbare handlinger: blokkere kjente versjoner, bytte til kun-låsefiler-installasjoner, rotere npm- og GitHub-tokener, revidere arbeidsflyter og overvåke indikatorer på kompromiss (IoC-er).
Hva skjer?
Ocuco Shai-Hulud forsyningskjedeangrep i npm-pakker er en av de mest forstyrrende hendelsene i nyere tid. I motsetning til isolerte trojanere blander denne ormen legitimasjonstyveri, automatisert eksfiltrering og selvreplikeringFølgelig krympet smittetidslinjen fra uker til bare timer.
For DevOps-team er lærdommen klar: hvis hver installasjon kan kjøre kode, er hver avhengighetsoppdatering et potensielt sikkerhetsbrudd.
Mulig initial vektor og målrettet legitimasjon
Tidlig analyse indikerer at angrepet sannsynligvis startet med stjålet legitimasjonFor eksempel phishing-kampanjer som forfalsker npm login eller MFA-ledetekster kan ha fanget utviklertokener. Når angriperne fikk det første fotfestet, spredte ormen seg ved å bygge seg inn i npm-pakker og stjele flere hemmeligheter fra:
- npm-konfigurasjonsfiler i likhet med
.npmrc, som ofte inneholder publiseringstokener. - Miljøvariabler og konfigurasjoner med GitHub PAT-er og CI/CD hemmeligheter.
- Endepunkter for skymetadata (AWS, GCP, Azure) som gir kortvarig legitimasjon for lateral bevegelse.
Derfor ble legitimasjonstyveri starten. Med gyldige npm-tokens og GitHub-hemmeligheter kunne Shai-Hulud selvreplikere på tvers av flere pakker og repositorier uten ekstra menneskelig innsats.
Konsekvensene av Shai-Hulud-forsyningskjedeangrepet for ledelsen
Shai-Hulud er fortsatt aktiv i dag. Denne ormen fremskynder nedslagstidslinjen. Det som en gang tok uker med en trojaner, utfolder seg nå i løpet av timer. Som et resultat, spredningen er raskere og vanskeligere å begrense. Den går videre ved å:
- Stjeler npm-publiseringstokener og GitHub-hemmeligheter.
- Publiserer seg selv på nytt i andre npm-pakker.
- Legger til ondsinnede GitHub Actions-arbeidsflyter for utholdenhet.
Hvem er berørt:
Alle team som installerer offentlige npm-pakker er eksponert. Dessuten står utviklere med hurtigbufrede npm- eller GitHub-tokens overfor høy risiko. CI-kjørere som bruker hemmeligheter med bredt omfang er også sårbare.
Forretningsrisiko
Forretningspåvirkningen vokser raskt. Stjålne tokens kan føre til kontoovertakelse, pakkekapring og til og med misbruk av skyen. I tillegg gjør vedvarende GitHub-arbeidsflyter det vanskeligere å rydde opp. Derfor, må lagene behandle Shai-Hulud som en pågående hendelse, ikke en lukket en.
Hvordan Shai-Hulud Supply Chain-angrepet fungerer i npm-pakker
Angriperens mål og motiv
Kampanjen optimaliserer for tre ting:
- Det første målet er å stjele legitimasjon i stor skala fra utviklerbærbare datamaskiner og CI-brukere. Dette inkluderer npm-publiseringstokener, GitHub-tokener og skylegitimasjon. Faktisk bekrefter flere analyser systematisk innsamling av hemmeligheter, som å kjøre TruffleHog og spørre skymetadata-endepunkter.
- Det andre målet er å forplanter seg automatisk ved å misbruke publiseringsrettighetene til kompromitterte vedlikeholdere. Som et resultat utvides ett fotfeste raskt til mange, siden nye infiserte versjoner av andre pakker dukker opp uten ytterligere menneskelig innsats.
- Det tredje målet er å vedvarer og eksfiltrerer pålitelig gjennom GitHub-infrastrukturen. Angripere oppretter et offentlig repo kalt «Shai-Hulud» med en dobbel base64 data.json, og i tillegg planter de en arbeidsflyt som serialiserer ${{ toJSON(hemmeligheter) }} og legger den ut på en statisk webhook.
Den sannsynlige gevinsten inkluderer langvarig tilgang til registre og kildekode, rask lateral overføring til skykontoer og muligheten til å bevæpne forsyningskjeden ytterligere. Offentlig rapportering viser at private repositorier er gjort offentlige med en «-migrasjon» suffiks, som øker dataeksponering og momentum
Inne i Shai-Hulud-nyttelasten: bundle.js i npm-pakker
Shai-Hulud sender som en stor, Webpack-bundlet og sterkt minimert JavaScript-fil (bundle.js, omtrent 3–3.7 MB) som utføres fra en etterinstallasjon hekte inn pakke.jsonFølgelig, Hver installasjon utløser nyttelasten automatisk. Denne designen skjuler identifikatorer, komprimerer kontrollflyten og samler all logikk i én artefakt som kjøres under installasjonen. Analytikere bekrefter konsekvent Webpack-bundling, uvanlig filstørrelse og utførelse på installasjonstidspunktet.
Tilslørings- og antianalysetrekk du vil se i eksempler:
- Minimert modulgraf med numeriske modul-ID-er, spredte kommentarer og flatere kontrollflyt. Dessuten, Denne strukturen gjør manuell gjennomgang ekstremt vanskelig.
- Strengskjuling via base64-lag og konstruksjonshjelpere. For eksempel, gjentatt base64-koding og -dekoding forekommer vanligvis rundt eksfiltreringsrutiner.
- Dynamisk utsendelse gjennom eval-stilmønstre og genererte funksjonslegemer, og dermed muliggjør koden endring av oppførsel under kjøretid.
- OS-filtrering å foretrekke Linux- og macOS-kjøring, spesielt på CI-kjørere og bærbare datamaskiner for utviklere.
Fra et funksjonelt perspektiv er pakken modulær. Sammendrag beskriver moduler for OS-oppdagelse, skanning av filsystemer og git-hemmeligheter, tilgang til skybaserte SDK-er, GitHub API-operasjoner og en forplantningsmotor som redigerer andre pakker som vedlikeholderen eier. Faktisk fremhever både StepSecurity og ReversingLabs en funksjon som automatisk oppdaterer pakker med den ondsinnede hooken.
Utførelse på installasjonstid i Shai-Hulud: Hvordan npm-pakker utløser ormen
Angrepet begynner når etterinstallasjon kjører node bundle.js. På dette tidspunktet initialiserer og pakker skriptet ut arbeidstilstanden i minnet, noe som legger grunnlaget for ormens fulle drift.
Oppdagelse og høsting
- Nyttelasten dumper process.env og skanner lokale filer for hemmeligheter med høy entropi og tokenprefikser. I tillegg utvider den dekningen ved å kjøre TruffleHog.
- Den spør etter skymetadata-endepunkter for å samle inn kortvarige legitimasjonsdetaljer. Eksempelvis samtaler til
169.254.169.254på AWS ellermetadata.google.internalpå GCP forekommer ofte hos infiserte verter. - Følgelig All påloggingsinformasjon som finnes blir umiddelbart brukbar for å publisere nye npm-pakker eller sende ut GitHub-arbeidsflyter.
exfiltration
- Ormen oppretter et nytt GitHub-repo med navnet Shai Hulud og skriver en dobbel base64-kodet
data.jsonmed plattformdetaljer, miljødumper og hemmeligheter. Som man kan se, er denne støyende oppførselen lett å oppdage hvis forsvarerne vet hvor de skal lete. - Den planter også en GitHub Actions-arbeidsflyt, ofte på en gren med navnet Shai-hulud, som serialiserer
${{ toJSON(secrets) }}og legger ut dataene til en statisk webhook. Videre vedvarer denne arbeidsflyten inntil noen aktivt fjerner den.
Forplantning
- Med et oppdaget npm-token lister nyttelasten opp alle pakker som eies av den kompromitterte vedlikeholderen. Deretter henter den hver tarball, injiserer bundle.js og en postinstall-oppføring, og publiserer pakken på nytt.
- Som et resultat kan dusinvis av infiserte pakker dukke opp i løpet av få timer, noe som multipliserer eksplosjonsradiusen over hele økosystemet.
Persistens og eksponering
Ormen holder ondsinnede arbeidsflyter i live, og i flere tilfeller gjør den private arkivene offentlige med en «-migrasjon» suffiks. Alt i alt sikrer dette at angriperen opprettholder et fotfeste og maksimerer datalekkasje.
Merknad om nøkkeldeteksjon
Denne uvanlige bruken av ${{ toJSON(secrets) }} i Handlinger er arbeidsflyter sjeldne. Derfor, Lag bør behandle det som en indikator på høyt signal under jakter.
Rensifisert arbeidsflytmønster du bør se etter
Denne uvanlige bruken av til JSON (hemmeligheter) i Handlinger er en høyt signalindikator i denne hendelsen.
Pseudokode for forplantning på høyt nivå (sikker, beskrivende)
Analytikere observerte denne løkken i stor skala, noe som forklarer det raske hoppet fra dusinvis til hundrevis av infiserte pakker.
Hvorfor dette er en orm i et pakkeøkosystem
En orm er skadelig programvare som sprer seg av seg selv uten å kreve manuelle trinn fra operatøren i hvert trinn. I operativsystemer utnytter ormer vanligvis nettverkssårbarheter for å bevege seg fra en maskin til en annen. I motsetning til dette opererer Shai-Hulud inne i npm-registeret. Den effektive veien er gjennom legitimasjon gjenbruk.
Ormen utnytter stjålne npm-publiseringstokener. Så snart den får gyldig legitimasjon, publiserer den infiserte versjoner på nytt under andre pakker eid av samme vedlikeholder. Deretter installeres disse pakkene av intetanende utviklere eller CI-kjørere, og syklusen gjentas.
Av denne grunn, sikkerhetsanalytikere, inkludert Mørk lesning, klassifisere Shai-Hulud som en selvreplikerende orm snarere enn en enkel trojaner eller en typosquatting-hendelse. Forskjellen er viktig: en trojaner kompromitterer vanligvis én vert, men en orm forsterker automatisk dens innvirkning på tvers av et økosystem.
«Slik fungerer det»-jukselapp
For å oppsummere Shai-Huluds livssyklus, her er en ulempecisen oversikt over hovedtrinnene:
- En pakke med etterinstallasjon er installert, og
bundle.jshenretter. - Nyttelasten dumper miljøvariabler, skanner filer og git-historikk, kjører Trøffelgris, og spør etter skybaserte metadatatjenester. Følgelig blir enhver hemmelighet som blir funnet umiddelbart nyttig.
- Eksfiltrering skjer på to måter: for det første ved å opprette et offentlig repositori med navnet Shai Hulud med en dobbel base64-kodet
data.jsonfor det andre, ved å plante en GitHub Actions-arbeidsflyt som legger ut${{ toJSON(secrets) }}til en webhook. - Ved å bruke et stjålet npm-token, publiserer ormen alle andre pakker som eies av den kompromitterte vedlikeholderen med den samme ondsinnede hooken. På denne måten multipliserer infeksjonen seg raskt.
- Til slutt har angriperen flere hemmeligheter, flere pakker å spre gjennom, og utholdenhet inne i GitHub-kontoer og -repositorier.
Hvordan unngå denne typen angrep, praktisk talt
Shai-Hulud er en vekker. En orm som stjeler tokens og publiserer seg selv på nytt er ikke en fremtidig risiko, den lever i npm-pakker økosystem i dag. For å forhindre denne typen forsyningskjedeangrep, team trenger kontroller som er programmerbare, automatiserte og håndheves direkte i CI/CD pipelines. Dette er de samme forsvarsmekanismene du allerede kan implementere med Xygeni.
Stopp dårlige gjenstander ved porten
Du bør skanne npm-pakker og tarballer før de når utviklere eller CI-jobber. bundle.js filer, mistenkelig etterinstallasjon hooks, og obfuskasjonsmarkører fungerer alle som tidlige røde flagg. Dessuten håndheving av nedkjølingsperioder og festede versjoner i pipelines forhindrer at ferske, ukontrollerte utgivelser blir konsumert automatisk.
Harden CI/CD som standard
Guardrails in CI/CD er essensielle. De avviser sammenslåinger eller installasjoner som introduserer nye skript eller binærfiler. Samtidig blokkerer de arbeidsflyter som serialiserer hemmeligheter eller forsøker eksterne innlegg. Team bør også kreve installasjoner som kun er låst til filer (npm ci) på tvers av alle pipelines slik at avhengighetssettene forblir reproduserbare og trygge.
Reduser radiusen for tokeneksplosjonen
Hemmeligheter må ikke bli enkeltstående feilpunkter. Skann kontinuerlig kode, konfigurasjoner og pipeline utgang for eksponert legitimasjonTokener bør begrenses med et snevert omfang, gis korte levetider og roteres automatisk når eksponering oppdages. Som regel bør alle tokener som brukes på en vert som utførte en mistenkelig etterinstallasjon, behandles som kompromittert.
Se ormens oppførsel tidlig
Anomali påvisning er nøkkelen. For eksempel kan plutselige topper i npm-publiseringshendelser, nye arbeidsflyter som dukker opp uten grunn, eller nye offentlige repositorier fylt med merkelige kodede filer, alle signalisere ormaktivitet. Derfor bør team raskt varsle og isolere eventuelle vedlikeholdere eller løpere som viser disse varseltegnene.
Reparer raskt uten å ødelegge bygg
Hastighet og sikkerhet må gå hånd i hånd. Automatisert pull requests kan erstatte kompromitterte npm-pakker med verifiserte versjoner. I tillegg tilgjengelighet og utnyttbarhet Analyse sikrer at oppgraderingene forblir minimale og stabile. Til slutt, gjenoppbygg berørte CI-løpere fra rene bilder når eksponeringen er bekreftet, for å forhindre at angrepet sprer seg ytterligere.
Indikatorer for kompromiss (IoCs)
Når lagene analyserer Shai-Hulud, bør de se etter begge deler. statiske IoC-er i filer og atferdsmessige IoC-er in pipelines. Sammen bidrar disse signalene til å oppdage infeksjoner tidlig og reagere før ormen sprer seg ytterligere.
Statiske IoC-er
Følgende SHA-256-sammendragssamsvar observert bundle.js prøver:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
- dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c
I tillegg bør du se etter disse tilbakevendende mønstrene:
- A
bundle.jsved pakkeroten. "postinstall": "node bundle.js"innsidenpackage.json.- Navngitte arkiver Shai Hulud.
- GitHub-arbeidsflyter som inneholder
${{ toJSON(secrets) }}.
Atferdsmessige IoC-er
Utover filsignaturer, viser ormaktivitet seg gjennom atferd. For eksempel:
- Plutselige utbrudd av npm publiserer hendelser fra én vedlikeholder.
- Nye arbeidsflyter som sender data til eksterne endepunkter.
- Utgående POST-forespørsler utløst fra CI-kjørere.
- Nylig opprettede offentlige repoer med kodede blobs.
Raske jakter
Konklusjon: Lærdommer fra Shai-Hulud
Ocuco Shai-Hulud forsyningskjedeangrep i npm-pakker viser hvor skjør dagens programvareforsyningskjede har blitt. Denne ormen gjorde mer enn å legge til ondsinnet kode. Den stjal tokens, sendte ut data og publiserte seg selv på nytt automatisk. På grunn av dette spredte angrepet seg i løpet av timer i stedet for uker.
For utviklere og DevOps-team er lærdommene klare:
- Hver installasjon kjører kode. Selv en vanlig npm-pakke kan skjule en postinstallasjonsorm.
- Hver token har høy verdi. Når den er stjålet, kan den brukes til å spre skadelig programvare videre.
- Hver pipeline trenger sjekker. Uten guardrails På avhengigheter, arbeidsflyter og hemmeligheter kan ett kompromiss raskt ramme produksjonen.
Derfor krever det å stoppe angrep som Shai-Hulud kontroller som er automatiske og enkle å håndheve. Team bør skanne npm-pakker før installasjoner, bruke lockfile-bygg, oppdage merkelig publiseringsaktivitet og holde tokens kortvarige. Disse trinnene er ikke lenger valgfrie. I stedet er de grunnlaget for robusthet i moderne pipelines.
Hos Xygeni ser vi på Shai-Hulud-forsyningskjedeangrepet som en advarsel for hele økosystemet med åpen kildekode. Den bærekraftige veien videre er å bringe forsyningskjedesikkerhet direkte inn i utviklingsprosessen, på det punktet hvor kode, npm-pakker og ... pipelines koble til.
Nedenfor finner du en fullstendig liste over npm-pakker og -versjoner som er rapportert som kompromittert i Shai-Hulud. Bruk den til å sjekke låsefiler, registre og CI. pipelines for eksponering.
Liste over kompromitterte pakker
📦 Forhåndsvisning av kompromitterte npm-pakker
| Pakkenavn | Versjon | Publiseringsdato |
|---|---|---|
| json-regelmotor-forenklet | 0.2.1 | 2025-09-14T17:58:51.203Z |
| luftpilot | 0.8.8 | 2025-09-14T18:35:07.600Z |
| mcp-kunnskapsgraf | 1.2.1 | 2025-09-14T18:35:09.494Z |
| luftsjef | 0.3.1 | 2025-09-14T18:35:09.521Z |
| jumpgate | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/tilbakeringingsvindu | 1.1.4 | 2025-09-14T20:31:38.479Z |
| @tnf-dev/api | 1.0.8 | 2025-09-14T20:31:39.547Z |
| @tnf-dev/js | 1.0.8 | 2025-09-14T20:31:41.251Z |
| @tnf-dev/mui | 1.0.8 | 2025-09-14T20:31:41.259Z |
| @tnf-dev/core | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/react-table | 6.10.20 | 2025-09-14T20:37:08.597Z |
| @hestjs/demo | 0.1.2 | 2025-09-14T20:45:52.348Z |
| @nexe/eslint-config | 0.1.1 | 2025-09-14T20:45:53.625Z |
| @hestjs/eslint-config | 0.1.2 | 2025-09-14T20:45:55.044Z |
| @nexe/konfigurasjonsbehandler | 0.1.1 | 2025-09-14T20:45:55.066Z |
| @nexe/logger | 0.1.3 | 2025-09-14T20:45:55.170Z |
| @hestjs/logger | 0.1.6 | 2025-09-14T20:45:55.197Z |
| @hestjs/validering | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
➡️ Se fullstendig liste over kompromitterte pakker
| Pakkenavn | Versjon | Publiseringsdato |
|---|---|---|
| json-regelmotor-forenklet | 0.2.1 | 2025-09-14T17:58:51.203Z |
| luftpilot | 0.8.8 | 2025-09-14T18:35:07.600Z |
| mcp-kunnskapsgraf | 1.2.1 | 2025-09-14T18:35:09.494Z |
| luftsjef | 0.3.1 | 2025-09-14T18:35:09.521Z |
| jumpgate | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/tilbakeringingsvindu | 1.1.4 | 2025-09-14T20:31:38.479Z |
| @tnf-dev/api | 1.0.8 | 2025-09-14T20:31:39.547Z |
| @tnf-dev/js | 1.0.8 | 2025-09-14T20:31:41.251Z |
| @tnf-dev/mui | 1.0.8 | 2025-09-14T20:31:41.259Z |
| @tnf-dev/core | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/react-table | 6.10.20 | 2025-09-14T20:37:08.597Z |
| @hestjs/demo | 0.1.2 | 2025-09-14T20:45:52.348Z |
| @nexe/eslint-config | 0.1.1 | 2025-09-14T20:45:53.625Z |
| @hestjs/eslint-config | 0.1.2 | 2025-09-14T20:45:55.044Z |
| @nexe/konfigurasjonsbehandler | 0.1.1 | 2025-09-14T20:45:55.066Z |
| @nexe/logger | 0.1.3 | 2025-09-14T20:45:55.170Z |
| @hestjs/logger | 0.1.6 | 2025-09-14T20:45:55.197Z |
| @hestjs/validering | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
| @hestjs/cqrs | 0.1.6 | 2025-09-14T20:45:55.966Z |
| @hestjs/skalar | 0.1.7 | 2025-09-14T20:45:56.386Z |
| ng2-filopplasting | 7.0.3 | 2025-09-15T02:44:29.555Z |
| kondensator-varslingshåndterer | 0.0.2 | 2025-09-15T04:54:48.431Z |
| kondensator-plugin-vonage | 1.0.2 | 2025-09-15T04:54:48.501Z |
| kondensator-plugin-helseapp | 0.0.2 | 2025-09-15T04:54:48.704Z |
| kondensatorandroidtillatelser | 0.0.4 | 2025-09-15T04:54:48.753Z |
| VoIP-anropssett | 1.0.2 | 2025-09-15T04:54:49.223Z |
| kondensator-plugin-ihealth | 1.1.8 | 2025-09-15T04:55:08.113Z |
| @kunst-ws/felles | 2.0.22 | 2025-09-15T05:21:15.411Z |
| @art-ws/config-eslint | 2.0.4 | 2025-09-15T05:21:17.199Z |
| ngx-ws | 1.1.5 | 2025-09-15T05:21:17.514Z |
| @kunst-ws/slf | 2.0.15 | 2025-09-15T05:21:17.524Z |
| @art-ws/http-server | 2.0.21 | 2025-09-15T05:21:17.745Z |
| pm2-gelf-json | 1.0.4 | 2025-09-15T05:21:18.413Z |
| @kunst-ws/di | 2.0.28 | 2025-09-15T05:21:18.488Z |
| @art-ws/di-node | 2.0.13 | 2025-09-15T05:21:18.849Z |
| @art-ws/config-ts | 2.0.7 | 2025-09-15T05:21:19.408Z |
| @art-ws/db-kontekst | 2.0.21 | 2025-09-15T05:21:19.814Z |
| @kunst-ws/åpenapi | 0.1.9 | 2025-09-15T05:21:19.969Z |
| @art-ws/web-app | 1.0.3 | 2025-09-15T05:21:20.383Z |
| @art-ws/ssl-info | 1.0.9 | 2025-09-15T05:21:20.927Z |




