TL; DR
Istraživači su 14. rujna 2025. identificirali Shai Hulud, crv koji se sam replicira skriven unutra npm paketi, pretvarajući rutinsko ažuriranje ovisnosti u potpuno napad na lanac opskrbePrvi put uočen u @ctrl/miniboja Paket Daniela dos Santosa Pereire, Shai-Hulud prikuplja tajne, izvlači ih kroz GitHub repozitorije i tijekove rada te se ponovno objavljuje u registru koristeći ukradene vjerodajnice. U roku od nekoliko dana, broj zaraženih paketa skočio je s desetaka na stotine, potvrđujući da Šajhulud nije samo još jedan trojanac, već crv dizajniran za automatsko širenje po npm ekosustavu.
Udarac: Svaki programer ili CI runner koji instalira javne npm pakete je u opasnosti.
Neposredne radnje: blokirati poznate verzije, prebaciti se na instalacije samo s lockfile datotekama, rotirati npm i GitHub tokene, revidirati tijekove rada i pratiti indikatore kompromitiranja (IoC-ove).
Što se događa?
The Shai-Hulud napad na lanac opskrbe u npm paketima jedan je od najrazornijih incidenata u novijoj povijesti. Za razliku od izoliranih trojanaca, ovaj crv miješa krađa vjerodajnica, automatizirano izvlačenje i samoreplikacijaPosljedično, vremenski okvir zaraze smanjio se s tjedana na samo nekoliko sati.
Za DevOps timove, lekcija je jasna: ako svaka instalacija može izvršavati kod, onda je svako ažuriranje ovisnosti potencijalna točka proboja.
Mogući početni vektor i ciljane ovlasti
Rana analiza ukazuje na to da je napad vjerojatno započeo s ukradene vjerodajniceNa primjer, phishing kampanje lažiranja npm-a login ili su MFA upiti možda uhvatili tokene programera. Nakon što su napadači stekli taj prvi uporište, crv se širio ugrađujući se u npm pakete i krađom više tajni iz:
- npm konfiguracijske datoteke poput
.npmrc, često sadrže tokene za objavljivanje. - Varijable okoline i konfiguracije s GitHub PAT-ovima i CI/CD tajne.
- Krajnje točke metapodataka u oblaku (AWS, GCP, Azure) što daje kratkotrajne vjerodajnice za lateralno kretanje.
Stoga je krađa vjerodajnica postala odskočna daska. S valjanim npm tokenima i GitHub tajnama, Shai-Hulud se mogao samostalno replicirati na više paketa i repozitorija bez dodatnog ljudskog napora.
Utjecaj napada na lanac opskrbe Shai-Hulud na rukovodstvo
Shai-Hulud je i danas aktivan. Ovaj crv ubrzava vremenski okvir utjecaja. Ono što je nekada trajalo tjednima s trojancem sada se odvija u satima. Kao rezultat toga, širenje je brže i teže ga je suzbiti. Napreduje se putem:
- Krađa npm tokena za objavu i GitHub tajni.
- Ponovno objavljivanje sebe u drugim npm paketima.
- Dodavanje zlonamjernih GitHub Actions radnih procesa za trajnost.
Tko je pogođen:
Svaki tim koji instalira javne npm pakete je izložen riziku. Štoviše, programeri s predmemoriranim npm ili GitHub tokenima suočavaju se s visokim rizikom. CI pokretači koji koriste široko dostupne tajne također su ranjivi.
Poslovni rizik
Utjecaj na poslovanje brzo raste. Ukradeni tokeni mogu dovesti do preuzimanja računa, otmice paketa, pa čak i zlouporabe oblaka. Osim toga, upornost u GitHub tijekovima rada otežava čišćenje. StogaTimovi moraju tretirati Shai-Hulud kao tekući incident, a ne kao zatvoreni.
Kako Shai-Hulud napad na lanac opskrbe funkcionira u npm paketima
Ciljevi i motiv napadača
Kampanja optimizira za tri stvari:
- Prvi cilj je krađa vjerodajnica u velikim količinama s prijenosnih računala razvojnih programera i CI runera. To uključuje npm tokene za objavljivanje, GitHub tokene i vjerodajnice za oblak. Zapravo, višestruke analize potvrđuju sustavno prikupljanje tajnih podataka, kao što je pokretanje TruffleHoga i ispitivanje krajnjih točaka metapodataka u oblaku.
- Drugi cilj je da automatski širiti zlouporabom prava objavljivanja kompromitiranih održavatelja. Kao rezultat toga, jedno uporište se brzo širi u mnoga, budući da se nove zaražene verzije drugih paketa pojavljuju bez dodatnog ljudskog napora.
- Treći cilj je da pouzdano perzistirati i izlučiti se putem GitHub infrastrukture. Napadači stvaraju javni repozitorij pod nazivom „Shai-Hulud“ s dvostrukom bazom64 data.json, a uz to i postavljaju tijek rada koji serijalizira ${{ toJSON(tajne) }} i objavljuje ga na statički webhook.
Vjerojatna korist uključuje dugotrajan pristup registrima i izvornom kodu, brzo lateralno kretanje prema računima u oblaku i mogućnost daljnjeg naoružavanja lanca opskrbe. Javna izvješća pokazuju da su privatni repozitorij prebačeni u javne s... "-migracija" sufiks, koji povećava izloženost podacima i zamah
Unutar tereta Shai-Huluda: snop.js u npm paketima
Shai-Hulud brodovi kao veliko, uključeno u Webpack i jako minificirano JavaScript datoteka (snop.js, oko 3–3.7 MB) koji se izvršava iz nakon instalacije zakačiti paket.jsonPosljedično, Svaka instalacija automatski pokreće korisni teret. Ovaj dizajn skriva identifikatore, komprimira tijek upravljanja i gura svu logiku u jedan artefakt koji se izvršava tijekom instalacije. Analitičari dosljedno potvrđuju grupiranje Webpackova, neobičnu veličinu datoteke i izvršavanje tijekom instalacije.
Osobine zamagljivanja i antianalize koje ćete vidjeti u uzorcima:
- Minimizirani graf modula s numeričkim ID-ovima modula, rijetkim komentarima i izravnanim tokom upravljanja. Štoviše, Ova struktura izuzetno otežava ručni pregled.
- Skrivanje niza putem base64 slojeva i pomoćnih alata za konstrukciju. Na primjer, Ponavljano base64 kodiranje i dekodiranje obično se pojavljuje oko rutina za izvlačenje.
- Dinamička otprema kroz eval-stil obrasce i generirana tijela funkcija, što omogućuje kodu promjenu ponašanja tijekom izvođenja.
- Filtriranje OS-a preferirati izvršavanje Linuxa i macOS-a, posebno na CI runnerima i prijenosnim računalima za razvojne programere.
S funkcionalnog gledišta, paket je modularan. U opisima su opisani moduli za otkrivanje OS-a, skeniranje datotečnog sustava i tajnih podataka Git-a, pristup cloud SDK-u, operacije GitHub API-ja i mehanizam za propagaciju koji uređuje druge pakete u vlasništvu održavatelja. Zapravo, StepSecurity i ReversingLabs ističu funkciju koja automatski ažurira pakete sa zlonamjernim udicom.
Izvršavanje za vrijeme instalacije u Shai-Huludu: Kako npm paketi pokreću crva
Napad počinje kada nakon instalacije pokreće čvor snop.js. U ovom trenutku, skripta inicijalizira i raspakirava radno stanje u memoriji, postavljajući temelje za puni rad crva.
Otkriće i žetva
- Payload ispisuje process.env i skenira lokalne datoteke za tajne datoteke visoke entropije i prefikse tokena. Osim toga, proširuje pokrivenost pokretanjem TruffleHog-a.
- Ispituje krajnje točke metapodataka u oblaku kako bi prikupio kratkotrajne vjerodajnice. Na primjer, poziva na
169.254.169.254na AWS-u ilimetadata.google.internalna GCP-u se često pojavljuju kod zaraženih domaćina. - Prema tome, Svaka pronađena vjerodajnica postaje odmah upotrebljiva za objavljivanje novih npm paketa ili pokretanje GitHub tijeka rada.
Eksfiltracija
- Crv stvara novi GitHub repozitorij pod nazivom Shai Hulud i piše dvostruko base64 kodirano
data.jsons detaljima platforme, datotekama okruženja i tajnama. Kao što se može vidjeti, ovo bučno ponašanje lako je uočiti ako branitelji znaju gdje tražiti. - Također postavlja tijek rada GitHub Actions, često na granu pod nazivom šaj-hulud, koji se serijalizira
${{ toJSON(secrets) }}i objavljuje podatke na statički webhook. Nadalje, ovaj tijek rada traje sve dok ga netko aktivno ne ukloni.
Razmnožavanje
- S otkrivenim npm tokenom, korisni teret nabraja sve pakete u vlasništvu kompromitiranog održavatelja. Zatim dohvaća svaki tarball, ubrizgava bundle.js i postinstall unos te ponovno objavljuje paket.
- Kao rezultat toga, deseci zaraženih paketa mogu se pojaviti u roku od nekoliko sati, umnožavajući radijus eksplozije u ekosustavu.
Upornost i izloženost
Crv održava zlonamjerne tijekove rada živima i, u nekoliko slučajeva, pretvara privatne repozitorije u javne s "-migracija" sufiks. Sveukupno, ovo osigurava da napadač zadrži uporište i maksimizira curenje podataka.
Napomena o otkrivanju ključa
Ova neobična upotreba ${{ toJSON(secrets) }} u tijekovima rada Akcije je rijedak. Prema tome, Timovi bi ga trebali tretirati kao pokazatelj visokog signala tijekom lova.
Sanitizirani obrazac tijeka rada koji biste trebali tražiti
Ova neobična upotreba do JSON(tajne) u Djelovanjima je pokazatelj visokog signala u ovom incidentu.
Pseudokod za propagaciju visoke razine (siguran, deskriptivan)
Analitičari su primijetili ovu petlju u velikim razmjerima, što objašnjava brzi skok s desetaka na stotine zaraženih paketa.
Zašto je ovo crv u ekosustavu paketa
Crv je zlonamjerni softver koji se širi samostalno bez potrebe za ručnim koracima operatera u svakoj fazi. U operativnim sustavima crvi obično iskorištavaju mrežne ranjivosti za prelazak s jednog računala na drugo. Nasuprot tome, Shai-Hulud djeluje unutar npm registra. Njegov učinkovit put je kroz ponovna upotreba vjerodajnica.
Crv iskorištava ukradene npm tokene za objavljivanje. Čim dobije valjane vjerodajnice, ponovno objavljuje zaražene verzije pod drugim paketima u vlasništvu istog održavatelja. Nakon toga, te pakete instaliraju ništa ne sluteći programeri ili CI pokretači i ciklus se ponavlja.
Zbog toga, sigurnosni analitičari, uključujući Mračno čitanje, klasificiraju Shai-Huluda kao samoreplicirajući crv a ne jednostavan trojanac ili tiposquatting incident. Razlika je važna: trojanac obično ugrožava jednog domaćina, ali crv automatski pojačava svoj utjecaj u cijelom ekosustavu.
"Kako to funkcionira" šalabahter
Da sažmemo životni ciklus Shai-Huluda, evo jedne prevarecisraščlamba njegovih glavnih koraka:
- Paket s nakon instalacije je instaliran, i
bundle.jsizvršava. - Korisni teret ispisuje varijable okruženja, skenira datoteke i git povijest, pokreće TruffleHogi upituje usluge metapodataka u oblaku. Posljedično, svaka pronađena tajna postaje odmah korisna.
- Izvlačenje se događa na dva načina: prvo, stvaranjem javnog repozitorija pod nazivom Shai Hulud s dvostrukim base64 kodiranjem
data.jsondrugo, postavljanjem tijeka rada GitHub Actions koji objavljuje${{ toJSON(secrets) }}na webhook. - Koristeći bilo koji ukradeni npm token, crv ponovno objavljuje sve ostale pakete u vlasništvu kompromitiranog održavatelja s istim zlonamjernim udicom. Na taj se način infekcija brzo množi.
- Konačno, napadač ima više tajni, više paketa za širenje i upornost unutar GitHub računa i repozitorija.
Kako praktično izbjeći ovu vrstu napada
Shai-Hulud je poziv na buđenje. Crv koji krade tokene i ponovno se objavljuje nije budući rizik, već je aktivan u ekosustav npm paketa danas. Kako bi se spriječila ova vrsta napad na lanac opskrbetimovima su potrebne kontrole koje se mogu programabilno upravljati, automatizirati i provoditi izravno u CI/CD pipelines. To su iste obrane koje već možete implementirati s Xygeni.
Zaustavite loše artefakte na vratima
Trebali biste skenirati npm pakete i tarballove prije nego što stignu do programera ili CI poslova. Predimenzionirano bundle.js datoteke, sumnjive nakon instalacije hooksi oznake zamagljivanja služe kao rani znakovi upozorenja. Štoviše, provođenje razdoblja hlađenja i prikvačenih verzija u pipelines sprječava automatsku konzumaciju svježih, neprovjerenih izdanja.
stvrdnuti CI/CD po defaultu
Guardrails in CI/CD su bitni. Odbijaju spajanja ili instalacije koje uvode nove skripte ili binarne datoteke. Istovremeno blokiraju tijekove rada koji serijaliziraju tajne datoteke ili pokušavaju vanjske objave. Timovi bi također trebali zahtijevati instalacije samo s lockfile datotekama (npm ci) u svim pipelinetako da skupovi ovisnosti ostaju reproducibilni i sigurni.
Smanjite radijus eksplozije žetona
Tajne ne smiju postati pojedinačne točke kvara. Neprestano skenirajte kod, konfiguracije i pipeline izlaz za izložene vjerodajniceTokeni bi trebali biti usko ograničeni, s obzirom na kratak životni vijek, i automatski rotirani kada se otkrije izloženost. U pravilu, svaki token korišten na hostu koji je izvršio sumnjivu postinstalaciju, tretirajte kao kompromitirani.
Rano uočite ponašanje crva
Otkrivanje anomalija je ključno. Na primjer, iznenadni porasti u npm događajima objavljivanja, novi tijekovi rada koji se pojavljuju bez razloga ili novi javni repozitorij ispunjeni čudnim kodiranim datotekama mogu signalizirati aktivnost crva. Stoga bi timovi trebali brzo izdati upozorenja i izolirati sve održavatelje ili pokretače koji pokazuju ove znakove upozorenja.
Brzo popravi bez prekida izgradnje
Brzina i sigurnost moraju ići zajedno. Automatizirano pull requests može zamijeniti kompromitirane npm pakete provjerenim verzijama. Osim toga, dostupnost i iskoristivost Analiza osigurava minimalne i stabilne nadogradnje. Konačno, ponovno izgradite pogođene CI runnere iz čistih slika nakon što se potvrdi izloženost, sprječavajući daljnje širenje napada.
Pokazatelji kompromitiranja (IoC)
Prilikom analize Shai-Huludara, timovi bi trebali paziti na oboje statički IoC-ovi u datotekama i bihevioralni IoC-ovi in pipelineZajedno, ovi signali pomažu u ranom otkrivanju infekcija i reagiranju prije nego što se crv dalje proširi.
Statički IoC-ovi
Sljedeća SHA-256 sažetaka podudaraju se bundle.js uzorci:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
- dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c
Osim toga, obratite pozornost na ove ponavljajuće obrasce:
- A
bundle.jsu korijenu paketa. "postinstall": "node bundle.js"upackage.json.- Nazvani repozitoriji Shai Hulud.
- GitHub tijekovi rada koji sadrže
${{ toJSON(secrets) }}.
Bihevioralni IoC-ovi
Osim potpisa datoteka, aktivnost crva otkriva se i kroz ponašanje. Na primjer:
- Iznenadni naleti npm publish događaja od strane jednog održavatelja.
- Novi tijekovi rada koji šalju podatke na vanjske krajnje točke.
- Izlazni POST zahtjevi pokrenuti od strane CI runnera.
- Nedavno kreirana javna spremišta s kodiranim blobovima.
Brzi lovovi
Zaključak: Pouke od Shai-Huludara
The Napad na lanac opskrbe Shai-Huluda u npm paketima pokazuje koliko je današnji lanac opskrbe softverom postao krhak. Ovaj crv je učinio više od samog dodavanja zlonamjernog koda. Krao je tokene, slao podatke, a zatim se automatski ponovno objavljivao. Zbog toga se napad proširio za nekoliko sati umjesto tjedana.
Za developere i DevOps timove, lekcije su jasne:
- Svaka instalacija pokreće kod. Čak i običan npm paket može skrivati postinstall crva.
- Svaki token ima visoku vrijednost. Nakon krađe, može se koristiti za daljnje širenje zlonamjernog softvera.
- Svaki pipeline potrebne provjere. Bez guardrails na ovisnostima, tijekovima rada i tajnama, jedan kompromis može brzo utjecati na produkciju.
Stoga, zaustavljanje napada poput Shai-Huluda zahtijeva automatske i jednostavne kontrole za provedbu. Timovi bi trebali skenirati npm pakete prije instalacija, koristiti lockfile verzije, otkrivati čudne aktivnosti objavljivanja i kratkotrajno koristiti tokene. Ovi koraci više nisu opcionalni. Umjesto toga, oni su temelj otpornosti u modernom pipelines.
U Xygeniju, napad Shai-Huluda na lanac opskrbe vidimo kao upozorenje za cijeli ekosustav otvorenog koda. Održivi put naprijed je izravno uključivanje sigurnosti lanca opskrbe u proces razvoja, u trenutku kada se kod, npm paketi i pipelines povezivanjem.
U nastavku je potpuni popis npm paketa i verzija prijavljenih kao kompromitiranih u Shai-Huludu. Koristite ga za provjeru lockfileova, registara i CI-ja. pipelines za izloženost.
Popis kompromitiranih paketa
📦 Pregled kompromitiranih npm paketa
| Naziv paketa | Verzija | Datum objavljivanja |
|---|---|---|
| json-pravila-pojednostavljeno | 0.2.1 | 2025-09-14T17:58:51.203Z |
| pilot zrakoplova | 0.8.8 | 2025-09-14T18:35:07.600Z |
| mcp-graf-znanja | 1.2.1 | 2025-09-14T18:35:09.494Z |
| zapovjednik zrakoplovstva | 0.3.1 | 2025-09-14T18:35:09.521Z |
| skok u rupu | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tv-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/prozor-povratnog-poziva | 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/config-manager | 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/validacija | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
➡️ Pogledajte cijeli popis kompromitiranih paketa
| Naziv paketa | Verzija | Datum objavljivanja |
|---|---|---|
| json-pravila-pojednostavljeno | 0.2.1 | 2025-09-14T17:58:51.203Z |
| pilot zrakoplova | 0.8.8 | 2025-09-14T18:35:07.600Z |
| mcp-graf-znanja | 1.2.1 | 2025-09-14T18:35:09.494Z |
| zapovjednik zrakoplovstva | 0.3.1 | 2025-09-14T18:35:09.521Z |
| skok u rupu | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tv-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/prozor-povratnog-poziva | 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/config-manager | 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/validacija | 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-prijenos-datoteke | 7.0.3 | 2025-09-15T02:44:29.555Z |
| rukovatelj obavijestima o kondenzatoru | 0.0.2 | 2025-09-15T04:54:48.431Z |
| kondenzator-plug-vonage | 1.0.2 | 2025-09-15T04:54:48.501Z |
| dodatak-za-kondenzator-zdravstvenu-aplikaciju | 0.0.2 | 2025-09-15T04:54:48.704Z |
| dopuštenja za kondenzator i Android | 0.0.4 | 2025-09-15T04:54:48.753Z |
| VoIP-komplet za pozive | 1.0.2 | 2025-09-15T04:54:49.223Z |
| dodatak-kondenzator-ihealth | 1.1.8 | 2025-09-15T04:55:08.113Z |
| @art-ws/common | 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 |
| @art-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 |
| @art-ws/di | 2.0.28 | 2025-09-15T05:21:18.488Z |
| @art-ws/di-čvor | 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 |
| @art-ws/openapi | 0.1.9 | 2025-09-15T05:21:19.969Z |
| @art-ws/web-aplikacija | 1.0.3 | 2025-09-15T05:21:20.383Z |
| @art-ws/ssl-info | 1.0.9 | 2025-09-15T05:21:20.927Z |




