TL; DR
Raziskovalci so 14. septembra 2025 ugotovili Shai Hulud, samopodvajajoči se črv, skrit v notranjosti npm paketi, s čimer se rutinska posodobitev odvisnosti spremeni v celovito napad na dobavno verigoPrvič opažen v @ctrl/drobnabarva Paket Daniela dos Santosa Pereire, Shai-Hulud, zbira skrivnosti, jih izvleče prek repozitorij in delovnih tokov GitHub ter se ponovno objavi v registru z uporabo ukradenih poverilnic. V nekaj dneh se je število okuženih paketov povečalo z več deset na več sto, kar potrjuje, da Šajhulud ni le še en trojanski konj, temveč črv, zasnovan za samodejno širjenje po ekosistemu npm.
Učinek: Vsak razvijalec ali izvajalec CI, ki namešča javne npm pakete, je ogrožen.
Takojšnji ukrepi: blokirajte znane različice, preklopite na namestitve samo z zaklenjenimi datotekami, rotirajte žetone npm in GitHub, revidirajte delovne procese in spremljajte indikatorje kompromitacije (IoC).
Kaj se zgodi?
Naš Napad na dobavno verigo Shai-Hulud v paketih npm je eden najbolj motečih incidentov v novejšem času. Za razliko od izoliranih trojanskih konjev ta črv meša kraja poverilnic, avtomatizirana eksfiltracija in samoreplikacijaPosledično se je časovnica okužbe skrajšala s tednov na le nekaj ur.
Za ekipe DevOps je lekcija jasna: če lahko vsaka namestitev izvaja kodo, potem je vsaka posodobitev odvisnosti potencialna točka kršitve.
Možni začetni vektorji in ciljne poverilnice
Zgodnja analiza kaže, da se je napad verjetno začel z ukradene poverilniceNa primer, phishing kampanje, ki ponarejajo npm login ali pa so pozivi MFA morda zajeli razvijalske žetone. Ko so napadalci pridobili to prvo oporo, se je črv širil tako, da se je vdelal v pakete npm in ukradel še več skrivnosti iz:
- konfiguracijske datoteke npm kot
.npmrc, ki pogosto vsebujejo žetone za objavo. - Spremenljivke okolja in konfiguracije z GitHub PAT-i in CI/CD skrivnosti.
- Končne točke metapodatkov v oblaku (AWS, GCP, Azure), kar daje kratkotrajne poverilnice za lateralno gibanje.
Zato je kraja poverilnic postala izstrelišče. Z veljavnimi žetoni npm in skrivnostmi GitHub se je Shai-Hulud lahko sam repliciral v več paketov in repozitorijev brez dodatnega človeškega truda.
Vpliv napada na dobavno verigo Shai-Hulud na vodstvo
Shai-Hulud je še danes aktiven. Ta črv pospeši časovnico vpliva. Kar je nekoč pri trojancu trajalo več tednov, se zdaj odvija v nekaj urah. Posledično, širjenje je hitrejše in težje ga je zadržati. Napreduje z:
- Kraja žetonov za objavo npm in skrivnosti GitHub-a.
- Ponovna objava v drugih npm paketih.
- Dodajanje zlonamernih delovnih tokov dejanj GitHub za vztrajnost.
Kdo je prizadet:
Vsaka ekipa, ki namešča javne npm pakete, je izpostavljena. Poleg tega se razvijalci s predpomnjenimi npm ali GitHub žetoni soočajo z visokim tveganjem. Ranljivi so tudi izvajalci neomejene izbire, ki uporabljajo široko dostopne skrivnosti.
Poslovno tveganje
Vpliv na poslovanje hitro narašča. Ukradeni žetoni lahko vodijo do prevzema računa, ugrabitve paketov in celo zlorabe oblaka. Poleg tega vztrajanje v delovnih procesih GitHub otežuje čiščenje. ZatoEkipe morajo Shai-Hulud obravnavati kot tekoči incident, ne kot zaključenega.
Kako deluje napad na dobavno verigo Shai-Hulud v paketih npm
Cilji in motiv napadalca
Kampanja je optimizirana za tri stvari:
- Prvi cilj je, da kradejo poverilnice v velikem obsegu iz prenosnih računalnikov razvijalcev in izvajalcev CI. To vključuje žetone za objavo npm, žetone GitHub in poverilnice za oblak. Pravzaprav več analiz potrjuje sistematično zbiranje tajnih podatkov, kot je izvajanje TruffleHog in poizvedovanje po končnih točkah metapodatkov v oblaku.
- Drugi cilj je, da samodejno širi z zlorabo pravic objavljanja ogroženih vzdrževalcev. Posledično se eno oporišče hitro razširi v mnoga, saj se nove okužene različice drugih paketov pojavljajo brez dodatnega človeškega truda.
- Tretji cilj je, da vztrajajo in zanesljivo izstopajo prek infrastrukture GitHub. Napadalci ustvarijo javno skladišče z imenom »Shai-Hulud« z dvojno bazo64 data.jsonin poleg tega vzpostavijo delovni tok, ki serializira ${{ toJSON(skrivnosti) }} in ga objavi v statičnem spletnem kavlju.
Verjetna korist vključuje dolgotrajen dostop do registrov in izvorne kode, hiter lateralni premik v račune v oblaku in možnost nadaljnjega orožja v dobavni verigi. Javna poročila kažejo, da so se zasebna skladišča preusmerila v javna z ... "-migracija" pripona, ki poveča izpostavljenost podatkov in zagon
Znotraj koristnega tovora Shai-Hulud: bundle.js v npm paketih
Shai-Hulud ladje kot velik, povezan z Webpackom in močno minimiziran Datoteka JavaScript (bundle.js, približno 3–3.7 MB) ki se izvaja iz po namestitvi priklopiti paket.jsonPosledično, Vsaka namestitev samodejno sproži koristni tovor. Ta zasnova skrije identifikatorje, stisne pretok nadzora in vso logiko potisne v en sam artefakt, ki se izvede med namestitvijo. Analitiki dosledno potrjujejo združevanje Webpackov, nenavadno velikost datotek in izvajanje med namestitvijo.
Lastnosti zamegljevanja in antianalize, ki jih boste opazili v vzorcih:
- Zmanjšan graf modulov z numeričnimi ID-ji modulov, redkimi komentarji in sploščenim tokom krmiljenja. Poleg tega, Zaradi te strukture je ročni pregled izjemno težaven.
- Skrivanje nizov prek slojev base64 in pomočnikov pri gradnji. Na primer, Ponavljajoče se kodiranje in dekodiranje base64 se običajno pojavi okoli rutin za izločanje.
- Dinamično odpošiljanje skozi eval-stilni vzorci in generirana telesa funkcij, kar omogoča kodi spreminjanje vedenja med izvajanjem.
- Filtriranje operacijskih sistemov dati prednost izvajanju v Linuxu in macOS-u, zlasti na napravah z neomejeno vgrajeno tehnologijo in prenosnikih za razvijalce.
Z funkcionalnega vidika je sveženj modularen. V opisih so opisani moduli za odkrivanje operacijskega sistema, skeniranje datotečnega sistema in skrivnih podatkov git, dostop do oblačnega SDK-ja, delovanje GitHub API-ja in mehanizem za razmnoževanje, ki ureja druge pakete, ki so v lasti vzdrževalca. Pravzaprav StepSecurity in ReversingLabs poudarjata funkcijo, ki samodejno posodablja pakete z zlonamerno kodo.
Izvajanje med namestitvijo v Shai-Huludu: Kako npm paketi sprožijo črva
Napad se začne, ko po namestitvi se izvede vozlišče bundle.js. Na tej točki se skript inicializira in razpakira delovno stanje v pomnilniku, kar pripravi oder za polno delovanje črva.
Odkrivanje in žetev
- Delovni tovor izpiše datoteko process.env in pregleda lokalne datoteke za skrivnosti z visoko entropijo in predpone žetonov. Poleg tega razširja pokritost z zagonom TruffleHog.
- Poizveduje po končnih točkah metapodatkov v oblaku za zbiranje kratkotrajnih poverilnic. Na primer, kliče na
169.254.169.254na AWS oz.metadata.google.internalna GCP se pogosto pojavijo pri okuženih gostiteljih. - Zato Vsaka najdena poverilnica postane takoj uporabna za objavo novih npm paketov ali za pospeševanje delovnih procesov GitHub.
Eksfiltracija
- Črv ustvari nov repozitorij GitHub z imenom Shai Hulud in zapiše dvojno kodirano base64
data.jsons podrobnostmi o platformi, izpiski okolja in skrivnostmi. Kot je razvidno, je to hrupno vedenje enostavno opaziti, če branilci vedo, kam iskati. - Prav tako vgradi delovni tok dejanj GitHub, pogosto na vejo z imenom šaj-hulud, ki serializira
${{ toJSON(secrets) }}in objavi podatke v statičnem spletnem kavlju. Poleg tega ta potek dela traja, dokler ga nekdo aktivno ne odstrani.
Razmnoževanje
- Z vsakim odkritim žetonom npm koristni tok našteje vse pakete, ki so v lasti ogroženega vzdrževalca. Nato pridobi vsako tarball datoteko, vstavi bundle.js in vnos po namestitvi ter ponovno objavi paket.
- Posledično se lahko v nekaj urah pojavi na desetine okuženih paketov, kar pomnoži polmer eksplozije v ekosistemu.
Vztrajnost in izpostavljenost
Črv ohranja zlonamerne delovne procese in v več primerih zasebna skladišča pretvori v javna z "-migracija" pripona. Skupaj to zagotavlja, da napadalec ohrani oporo in poveča uhajanje podatkov.
Opomba o zaznavanju ključa
Ta nenavadna uporaba ${{ toJSON(secrets) }} v delovnih tokovih dejanj je redek. Zato Ekipe bi ga morale med lovom obravnavati kot indikator visokega signala.
Saniziran vzorec poteka dela, ki ga morate iskati
Ta nenavadna uporaba do JSON(skrivnosti) v Dejanjih je v tem incidentu pomemben kazalnik.
Psevdokoda za visokonivojsko propagacijo (varna, opisna)
Analitiki so to zanko opazovali v velikem obsegu, kar pojasnjuje hiter skok z več deset na več sto okuženih paketov.
Zakaj je to črv v ekosistemu paketov
Črv je zlonamerna programska oprema, ki se širi sama, ne da bi na vsaki stopnji potrebovala ročne korake operaterja. V operacijskih sistemih črvi običajno izkoriščajo ranljivosti omrežja za premikanje z enega računalnika na drugega. Nasprotno pa Shai-Hulud deluje znotraj registra npm. Njegova učinkovita pot je skozi ponovna uporaba poverilnic.
Črv izkorišča ukradene žetone za objavo npm. Takoj ko pridobi veljavne poverilnice, ponovno objavi okužene različice v drugih paketih, ki so v lasti istega vzdrževalca. Nato te pakete namestijo nič hudega sluteči razvijalci ali izvajalci CI in cikel se ponovi.
Zaradi tega varnostni analitiki, vključno z Temno branje, uvrstite Šaj-Huludara kot samoreplicirajoči se črv namesto preprostega trojanca ali tipografske napake. Razlika je pomembna: trojanec običajno ogrozi enega gostitelja, črv pa samodejno okrepi svoj vpliv v celotnem ekosistemu.
Goljufiv list »Kako deluje«
Če povzamemo življenjski cikel Shai-Huluda, je tukaj ena prevaracisrazčlenitev njegovih glavnih korakov:
- Paket z po namestitvi je nameščen in
bundle.jsizvrši. - Delovni tovor izpiše okoljske spremenljivke, pregleda datoteke in zgodovino gita, zažene TruffleHogin poizveduje po storitvah metapodatkov v oblaku. Posledično postane vsaka najdena skrivnost takoj uporabna.
- Izločanje se zgodi na dva načina: prvič, z ustvarjanjem javnega repozitorija z imenom Shai Hulud z dvojnim kodiranjem base64
data.json; drugič, z uvedbo poteka dela dejanj GitHub, ki objavlja${{ toJSON(secrets) }}na spletni kavelj. - Z uporabo katerega koli ukradenega žetona npm črv ponovno objavi vse druge pakete v lasti ogroženega vzdrževalca z istim zlonamernim kavljem. Na ta način se okužba hitro množi.
- Končno ima napadalec več skrivnosti, več paketov za širjenje in vztrajnost znotraj računov in repozitorijev GitHub.
Kako se tej vrsti napadov praktično izogniti
Shai-Hulud je opozorilni znak. Črv, ki krade žetone in se ponovno objavi, ni tveganje za prihodnost, ampak je aktiven v ekosistem paketov npm danes. Da bi preprečili tovrstne napad na dobavno verigoekipe potrebujejo kontrole, ki jih je mogoče programirati, avtomatizirati in izvajati neposredno v CI/CD pipelineTo so iste obrambe, ki jih lahko že izvajate z Ksigeni.
Ustavite slabe artefakte pri vratih
Pakete npm in tarballe morate pregledati, preden pridejo do razvijalcev ali projektov CI. Prevelike bundle.js datoteke, sumljive po namestitvi hooksin označevalci zakrivanja služijo kot zgodnji opozorilni znaki. Poleg tega je uveljavljanje obdobij mirovanja in pripetih različic v pipelines preprečuje samodejno uporabo svežih, nepreverjenih izdaj.
Harden CI/CD privzeto
Guardrails in CI/CD so bistveni. Zavračajo združitve ali namestitve, ki uvajajo nove skripte ali binarne datoteke. Hkrati blokirajo delovne procese, ki serializirajo skrivnosti ali poskušajo zunanje objave. Ekipe bi morale zahtevati tudi namestitve samo z zaklenjenimi datotekami (npm ci) po vseh pipelinetako da nabori odvisnosti ostanejo ponovljivi in varni.
Zmanjšajte polmer eksplozije žetonov
Skrivnosti ne smejo postati posamezne točke odpovedi. Neprekinjeno pregledujte kodo, konfiguracije in pipeline izhod za izpostavljene poverilniceŽetoni morajo biti ozko omejeni, imeti kratko življenjsko dobo in se samodejno rotirati, ko je zaznana izpostavljenost. Praviloma je treba vsak žeton, uporabljen na gostitelju, ki je izvedel sumljivo postinstallacijo, obravnavati kot ogrožen.
Zgodaj opazite vedenje črvov
Detekcija anomalije je ključnega pomena. Na primer, nenadni porasti dogodkov objavljanja npm, novi delovni tokovi, ki se pojavijo brez razloga, ali nova javna skladišča, polna čudno kodiranih datotek, lahko kažejo na aktivnost črvov. Zato bi morale ekipe hitro sprožiti opozorila in izolirati vse vzdrževalce ali izvajalce, ki kažejo te opozorilne znake.
Hitro popravi brez prekinitve gradnje
Hitrost in varnost morata iti z roko v roki. Avtomatizirano pull requests lahko ogrožene npm pakete zamenja s preverjenimi različicami. Poleg tega dosegljivost in izkoriščenost Analiza zagotavlja, da nadgradnje ostanejo minimalne in stabilne. Nazadnje, ko je izpostavljenost potrjena, ponovno zgradite prizadete izvajalce CI iz čistih slik, kar prepreči nadaljnje širjenje napada.
Kazalniki kompromisa (IoC)
Pri analizi Shai-Huluda morajo ekipe biti pozorne na oboje statični IoC-ji v datotekah in vedenjske IoC-je in pipelines. Ti signali skupaj pomagajo pri zgodnjem odkrivanju okužb in odzivanju, preden se črv razširi naprej.
Statični IoC-ji
Naslednje ujemanje prebavnih podatkov SHA-256 je bilo opaženo bundle.js vzorci:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
- dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c
Poleg tega bodite pozorni na te ponavljajoče se vzorce:
- A
bundle.jsv korenu paketa. "postinstall": "node bundle.js"v notranjostipackage.json.- Imenovana skladišča Shai Hulud.
- Delovni tokovi GitHub, ki vsebujejo
${{ toJSON(secrets) }}.
Vedenjski IoC-ji
Poleg podpisov datotek se aktivnost črvov razkriva tudi skozi vedenje. Na primer:
- Nenadni izbruhi dogodkov objave npm s strani enega vzdrževalca.
- Novi delovni tokovi, ki podatke pošiljajo na zunanje končne točke.
- Odhodne zahteve POST, sprožene s strani izvajalcev CI.
- Nedavno ustvarjena javna skladišča s kodiranimi blob-i.
Hitri lov
Zaključek: Lekcije od Shai-Huluda
Naš Napad na dobavno verigo Shai-Hulud v npm paketih kaže, kako krhka je postala današnja dobavna veriga programske opreme. Ta črv je naredil več kot le dodajanje zlonamerne kode. Kradel je žetone, pošiljal podatke in se nato samodejno znova objavil. Zaradi tega se je napad razširil v nekaj urah namesto v tednih.
Za razvijalce in DevOps ekipe so lekcije jasne:
- Vsaka namestitev zažene kodo. Tudi v običajnem npm paketu se lahko skriva črv po namestitvi.
- Vsak žeton ima visoko vrednost. Ko je ukraden, ga je mogoče uporabiti za nadaljnje širjenje zlonamerne programske opreme.
- Tudi vsak pipeline potrebuje preglede. Brez guardrails glede odvisnosti, delovnih procesov in skrivnosti lahko en sam kompromis hitro vpliva na produkcijo.
Zato zaustavitev napadov, kot je Shai-Hulud, zahteva samodejne in enostavne kontrole. Ekipe bi morale pred namestitvijo pregledati pakete npm, uporabljati gradnje z zaklepnimi datotekami, zaznavati nenavadne dejavnosti objavljanja in ohranjati žetone kratkotrajne. Ti koraki niso več neobvezni. Namesto tega so temelj odpornosti v sodobnem pipelines.
V podjetju Xygeni napad na dobavno verigo Shai-Hulud vidimo kot opozorilo za celoten ekosistem odprte kode. Trajnostna pot naprej je, da varnost dobavne verige vključimo neposredno v proces razvoja, na točki, ko se koda, paketi npm in pipelines povezavo.
Spodaj je celoten seznam paketov in različic npm, ki so bili v Shai-Huludu prijavljeni kot ogroženi. Uporabite ga za preverjanje datotek zaklepanja, registrov in CI. pipelineza izpostavljenost.
Seznam ogroženih paketov
📦 Predogled ogroženih npm paketov
| Ime paket | različica | Datum objave |
|---|---|---|
| poenostavljeno-pravil-json | 0.2.1 | 2025-09-14T17:58:51.203Z |
| letalski pilot | 0.8.8 | 2025-09-14T18:35:07.600Z |
| graf-znanja-mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| poveljnik letalstva | 0.3.1 | 2025-09-14T18:35:09.521Z |
| skakalna vrata | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tv-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/okno-povratnega-klica | 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/upravljalnik-konfiguracije | 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 |
➡️ Oglejte si celoten seznam ogroženih paketov
| Ime paket | različica | Datum objave |
|---|---|---|
| poenostavljeno-pravil-json | 0.2.1 | 2025-09-14T17:58:51.203Z |
| letalski pilot | 0.8.8 | 2025-09-14T18:35:07.600Z |
| graf-znanja-mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| poveljnik letalstva | 0.3.1 | 2025-09-14T18:35:09.521Z |
| skakalna vrata | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tv-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/okno-povratnega-klica | 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/upravljalnik-konfiguracije | 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 |
| nalaganje-datoteke-ng2 | 7.0.3 | 2025-09-15T02:44:29.555Z |
| upravljalnik obvestil o kondenzatorju | 0.0.2 | 2025-09-15T04:54:48.431Z |
| vtičnik-kondenzatorja-vonage | 1.0.2 | 2025-09-15T04:54:48.501Z |
| vtičnik-kondenzator-zdravstvena-aplikacija | 0.0.2 | 2025-09-15T04:54:48.704Z |
| dovoljenja za kondenzator za Android | 0.0.4 | 2025-09-15T04:54:48.753Z |
| VoIP-klicni komplet | 1.0.2 | 2025-09-15T04:54:49.223Z |
| vtičnik-kondenzatorja-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-strežnik | 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-vozlišče | 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/spletna-aplikacija | 1.0.3 | 2025-09-15T05:21:20.383Z |
| @art-ws/ssl-info | 1.0.9 | 2025-09-15T05:21:20.927Z |




