TL; DR
Pe 14 septembrie 2025, cercetătorii au identificat Shai Hulud, un vierme autoreplicant ascuns în interior pachete npm, transformând o actualizare de rutină a dependenței într-una la scară completă atacul lanțului de aprovizionareObservat pentru prima dată în @ctrl/tinycolor pachet de Daniel dos Santos Pereira, Shai-Hulud recoltează secrete, le exfiltrează prin repozitorii și fluxuri de lucru GitHub și se republică în registru folosind acreditări furate. În câteva zile, numărul de pachete infectate a crescut de la zeci la sute, confirmând că Shaihulud nu este doar un alt troian, ci un vierme conceput să se răspândească automat în ecosistemul npm.
Impact: Orice dezvoltator sau rulator CI care instalează pachete npm publice este expus riscului.
Acțiuni imediate: blocați versiunile cunoscute, treceți la instalări doar cu fișiere de blocare, rotiți token-urile npm și GitHub, auditați fluxurile de lucru și monitorizați Indicatorii de Compromis (IoC).
Ce se întâmplă?
Atac Shai-Hulud asupra lanțului de aprovizionare în pachete NPM este unul dintre cele mai perturbatoare incidente din memoria recentă. Spre deosebire de troienii izolați, acest vierme combină furtul de acreditări, exfiltrarea automată și autoreplicareaPrin urmare, intervalul de timp pentru infectare s-a redus de la săptămâni la doar câteva ore.
Pentru echipele DevOps, lecția este clară: dacă fiecare instalare poate executa cod, atunci fiecare actualizare a dependenței reprezintă un potențial punct de breșă.
Vector inițial posibil și acreditări vizate
Analiza timpurie indică faptul că atacul a început probabil cu acreditări furateDe exemplu, campaniile de phishing care falsifică adresa NPM login sau este posibil ca prompturile MFA să fi capturat token-uri de dezvoltator. Odată ce atacatorii au obținut primul punct de sprijin, viermele s-a răspândit prin integrarea în pachete npm și furtul mai multor secrete din:
- fișiere de configurare npm precum
.npmrc, conținând adesea jetoane de publicare. - Variabile de mediu și configurații cu PAT-uri GitHub și CI/CD secrete.
- Puncte finale de metadate în cloud (AWS, GCP, Azure) oferind acreditări de scurtă durată pentru mișcarea laterală.
Prin urmare, furtul de acreditări a devenit rampa de lansare. Cu token-uri npm valide și secrete GitHub, Shai-Hulud se putea autoreplica în mai multe pachete și depozite fără efort uman suplimentar.
Impactul executiv al atacului asupra lanțului de aprovizionare Shai-Hulud
Shai-Hulud este încă activ și astăzi. Acest vierme accelerează cronologia impactului. Ceea ce odinioară dura săptămâni la un troian se desfășoară acum în câteva ore. Drept urmare, răspândirea este mai rapidă și mai greu de ținut sub control. Avansează prin:
- Furtul de token-uri de publicare NPM și secrete GitHub.
- Se republică în alte pachete npm.
- Adăugarea de fluxuri de lucru GitHub Actions malițioase pentru persistență.
Cine este afectat:
Orice echipă care instalează pachete npm publice este expusă. Mai mult, dezvoltatorii cu token-uri npm sau GitHub în cache se confruntă cu riscuri ridicate. Runner-ii CI care utilizează secrete cu scop larg sunt, de asemenea, vulnerabili.
Riscul de afaceri
Impactul asupra afacerii crește rapid. Token-urile furate pot duce la preluarea conturilor, deturnarea pachetelor și chiar la utilizarea abuzivă a cloud-ului. În plus, persistența în fluxurile de lucru GitHub face mai dificilă curățarea acestora. Prin urmare,, echipele trebuie să trateze Shai-Hulud ca pe un incident în desfășurare, nu ca pe unul închis.
Cum funcționează atacul Shai-Hulud asupra lanțului de aprovizionare în pachetele npm
Obiectivele și motivul atacatorului
Campania se optimizează pentru trei lucruri:
- Primul obiectiv este să fura acreditări la scară largă de la laptopurile dezvoltatorilor și de la rulourile CI. Aceasta include token-uri de publicare npm, token-uri GitHub și acreditări cloud. De fapt, analize multiple confirmă recoltarea sistematică a secretelor, cum ar fi rularea TruffleHog și interogarea punctelor finale de metadate cloud.
- Al doilea obiectiv este de a propaga automat prin abuzul drepturilor de publicare ale administratorilor compromiși. Drept urmare, o bază se extinde rapid în mai multe, deoarece apar noi versiuni infectate ale altor pachete fără efort uman suplimentar.
- Al treilea obiectiv este de a persistă și exfiltrează în mod fiabil prin infrastructura GitHub. Atacatorii creează un depozit public numit „Shai-Hulud” cu o bază dublă64 data.jsonși, în plus, plantează un flux de lucru care serializează ${{ toJSON(secrete) }} și îl postează într-un webhook static.
Probabilul beneficiu include acces pe termen lung la registre și cod sursă, transfer lateral rapid către conturi cloud și opțiunea de a transforma și mai mult lanțul de aprovizionare în armă. Rapoartele publice arată că depozitele private au fost transferate către public cu un... „-migrație” sufix, care crește expunerea și impulsul datelor
În interiorul încărcăturii utile Shai-Hulud: pachet.js în pachetele npm
Navele Shai-Hulud sunt mari, incluse în pachetele Webpack și puternic minimizate Fișier JavaScript (pachet.js, aproximativ 3–3.7 MB) care se execută dintr-un postinstalare agăța pachet.jsonPrin urmare, Fiecare instalare declanșează automat sarcina utilă. Acest design ascunde identificatorii, comprimă fluxul de control și împinge toată logica într-un singur artefact care se execută în timpul instalării. Analiștii confirmă în mod constant gruparea Webpack, dimensiunea neobișnuită a fișierelor și execuția în timpul instalării.
Trăsături de ofuscare și anti-analiză pe care le veți observa în mostre:
- Grafic de modul minimizat cu ID-uri numerice de module, comentarii rare și flux de control aplatizat. Mai mult,, Această structură face extrem de dificilă revizuirea manuală.
- Ascunderea șirurilor de caractere prin straturi base64 și instrumente auxiliare de construcție. De exemplu, Codificarea și decodarea base64 repetate apar de obicei în jurul rutinelor de exfiltrare.
- Dispecerizare dinamică prin eval-modele de stil și corpuri de funcții generate, permițând astfel codului să își schimbe comportamentul în timpul execuției.
- Filtrarea sistemului de operare să prefere execuția Linux și macOS, în special pe rulote CI și laptopuri pentru dezvoltatori.
Din punct de vedere funcțional, pachetul este modular. Descrierea descrie module pentru descoperirea sistemului de operare, scanarea sistemului de fișiere și a secretelor git, accesul la SDK-ul cloud, operațiunile API GitHub și un motor de propagare care editează alte pachete deținute de administrator. De fapt, StepSecurity și ReversingLabs evidențiază ambele o funcție care actualizează automat pachetele cu hook-ul malițios.
Execuția în timpul instalării în Shai-Hulud: Cum declanșează pachetele npm viermele
Atacul începe când nodul de rulare postinstalare pachet.js. În acest moment, scriptul inițializează și despachetează starea de funcționare în memorie, pregătind terenul pentru funcționarea completă a viermelui.
Descoperire și recoltare
- Sarcina utilă generează fișierul process.env și scanează fișierele locale pentru secrete cu entropie ridicată și prefixe de tokenuri. În plus, extinde acoperirea prin rularea TruffleHog.
- Interoghează punctele finale de metadate din cloud pentru a colecta acreditări de scurtă durată. De exemplu, apelează la
169.254.169.254pe AWS saumetadata.google.internalpe GCP apar adesea la gazdele infectate. - În consecință, Orice acreditări găsite devin imediat utilizabile pentru a publica noi pachete npm sau a trimite fluxuri de lucru GitHub.
Exfiltrarea
- Viermele creează un nou depozit GitHub numit Shai Hulud și scrie o codificare dublă în base64
data.jsoncu detalii despre platformă, dump-uri de mediu și secrete. După cum se poate observa, acest comportament zgomotos este ușor de observat dacă apărătorii știu unde să caute. - De asemenea, plantează un flux de lucru GitHub Actions, adesea pe o ramură numită shai-hulud, care serializează
${{ toJSON(secrets) }}și postează datele către un webhook static. În plus, acest flux de lucru persistă până când cineva îl elimină în mod activ.
Propagare
- Cu orice token npm descoperit, sarcina utilă enumeră toate pachetele deținute de administratorul compromis. Apoi, preia fiecare fișier tar, injectează fișierul bundle.js și o intrare postinstalare și republică pachetul.
- Drept urmare, zeci de pachete infectate pot apărea în câteva ore, multiplicând raza exploziei în întregul ecosistem.
Persistență și expunere
Viermele menține active fluxurile de lucru rău intenționate și, în mai multe cazuri, transformă depozitele private în depozite publice cu un „-migrație” sufix. Per total, acest lucru asigură că atacatorul își menține un punct de sprijin și maximizează scurgerea de date.
Notă cheie de detectare
Această utilizare neobișnuită a ${{ toJSON(secrets) }} în fluxurile de lucru Acțiuni este rară. Prin urmare, Echipele ar trebui să îl trateze ca pe un indicator de semnal înalt în timpul vânătoarelor.
Model de flux de lucru igienizat pe care ar trebui să-l cauți
Această utilizare neobișnuită a la JSON(secrete) „În Acțiuni” este un indicator de semnal ridicat în acest incident.
Pseudocod de propagare la nivel înalt (sigur, descriptiv)
Analiștii au observat această buclă la scară largă, ceea ce explică saltul rapid de la zeci la sute de pachete infectate.
De ce este acesta un vierme într-un ecosistem de pachete
Un vierme este un malware care se răspândește de la sine, fără a necesita pași manuali din partea operatorului în fiecare etapă. În sistemele de operare, viermii exploatează de obicei vulnerabilitățile rețelei pentru a se muta de la o mașină la alta. În schimb, Shai-Hulud operează în interiorul registrului npm. Calea sa eficientă este prin reutilizarea credențială.
Viermele profită de token-urile de publicare npm furate. De îndată ce obține acreditări valide, republică versiunile infectate sub alte pachete deținute de același administrator. Ulterior, aceste pachete sunt instalate de dezvoltatori sau rulotatori CI neavizați, iar ciclul se repetă.
Din acest motiv, analiștii de securitate, inclusiv Citire întunecată, clasifică Shai-Hulud ca fiind vierme autoreplicant mai degrabă decât un simplu troian sau un incident de typosquatting. Diferența este importantă: un troian compromite de obicei o gazdă, dar un vierme își amplifică impactul automat într-un ecosistem.
Fișă informativă „Cum funcționează”
Pentru a rezuma ciclul de viață al lui Shai-Hulud, iată o înșelătorieciso defalcare a principalelor sale etape:
- Un pachet cu postinstalare este instalat și
bundle.jsexecută. - Sarcina utilă elimină variabilele de mediu, scanează fișierele și istoricul git, rulează TruffleHogși interoghează serviciile de metadate din cloud. Prin urmare, orice secret găsit devine imediat util.
- Exfiltrarea are loc în două moduri: în primul rând, prin crearea unui depozit public numit Shai Hulud cu o codificare dublă în base64
data.jsonîn al doilea rând, prin implementarea unui flux de lucru GitHub Actions care postează${{ toJSON(secrets) }}către un webhook. - Folosind orice token npm furat, viermele republică toate celelalte pachete deținute de administratorul compromis cu același hook malițios. În acest fel, infecția se multiplică rapid.
- În cele din urmă, atacatorul deține mai multe secrete, mai multe pachete de răspândit și persistență în conturile și repozitoriile GitHub.
Cum să eviți practic această clasă de atac
Shai-Hulud este un semnal de alarmă. Un vierme care fură jetoane și se republică singur nu este un risc viitor, ci este activ în... ecosistemul pachetelor npm astăzi. Pentru a preveni acest tip de atacul lanțului de aprovizionare, echipele au nevoie de controale programabile, automatizate și aplicate direct în CI/CD pipelineAcestea sunt aceleași apărări pe care le puteți implementa deja cu Xygeni.
Oprește artefactele rele la poartă
Ar trebui să scanați pachetele și fișierele tar npm înainte ca acestea să ajungă la dezvoltatori sau la joburi CI. bundle.js fișiere, postinstalare suspectă hooksși markerii de ofuscare servesc drept semnale de alarmă timpurii. Mai mult, impunerea unor perioade de răcire și a unor versiuni fixate în pipelines previne consumul automat al versiunilor proaspete, neverificate.
căli CI/CD în mod implicit
Guardrails in CI/CD sunt esențiale. Acestea resping îmbinările sau instalările care introduc scripturi sau fișiere binare noi. În același timp, blochează fluxurile de lucru care serializează secrete sau încearcă postări externe. Echipele ar trebui să solicite, de asemenea, instalări doar pentru fișierele de blocare (npm ci) în toate pipelineastfel încât seturile de dependențe să rămână reproductibile și sigure.
Reduce raza exploziei jetonului
Secretele nu trebuie să devină puncte unice de eșec. Scanați continuu codul, configurațiile și pipeline ieșire pentru credențiale expuseJetoanele ar trebui să aibă un domeniu de aplicare restrâns, având în vedere durata de viață scurtă, și să fie rotite automat atunci când se detectează o expunere. Ca regulă generală, orice jeton utilizat pe o gazdă care a executat o postinstalare suspectă trebuie tratat ca fiind compromis.
Observați comportamentul viermilor din timp
Detectarea anomaliilor este esențial. De exemplu, creșterile bruște ale evenimentelor de publicare npm, fluxurile de lucru noi care apar fără motiv sau depozitele publice noi pline cu fișiere codificate ciudat pot semnala activitatea viermilor. Prin urmare, echipele ar trebui să declanșeze rapid alerte și să izoleze orice mentenator sau rulator care prezintă aceste semne de avertizare.
Remediază rapid fără a strica versiunile
Viteza și siguranța trebuie să meargă împreună. Automatizat pull requests poate înlocui pachetele npm compromise cu versiuni verificate. În plus, accesibilitate și exploatabilitatea Analiza asigură că actualizările rămân minime și stabile. În cele din urmă, reconstruiți rulourile CI afectate din imagini curate odată ce expunerea este confirmată, împiedicând răspândirea atacului.
Indicatori de compromis (IoC)
Când analizează Shai-Hulud, echipele ar trebui să fie atente la ambele IoC-uri statice în fișiere și IoC-uri comportamentale in pipelineÎmpreună, aceste semnale ajută la detectarea timpurie a infecțiilor și la reacționarea înainte ca viermele să se răspândească mai mult.
IoC-uri statice
Următoarele digesturi SHA-256 se potrivesc observate bundle.js probe:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
- dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c
În plus, fiți atenți la aceste tipare recurente:
- A
bundle.jsla rădăcina pachetului. "postinstall": "node bundle.js"în interiorulpackage.json.- Depozite numite Shai Hulud.
- Fluxuri de lucru GitHub care conțin
${{ toJSON(secrets) }}.
IoC-uri comportamentale
Dincolo de semnăturile fișierelor, activitatea viermilor se dezvăluie prin comportament. De exemplu:
- Izbucniri bruște de evenimente de publicare npm de la un singur administrator.
- Noi fluxuri de lucru care transmit date către endpoint-uri externe.
- Cererile POST de ieșire declanșate de executanții CI.
- Depozite publice create recent cu fișiere blob codificate.
Vânătoare rapidă
Concluzie: Lecții din Shai-Hulud
Atacul lanțului de aprovizionare Shai-Hulud în pachetele npm arată cât de fragil a devenit lanțul de aprovizionare cu software de astăzi. Acest vierme a făcut mai mult decât să adauge cod malițios. A furat token-uri, a trimis date și apoi s-a republicat automat. Din această cauză, atacul s-a răspândit în ore în loc de săptămâni.
Pentru dezvoltatori și echipele DevOps, lecțiile sunt clare:
- Fiecare instalare rulează cod. Chiar și un pachet npm obișnuit poate ascunde un vierme postinstalare.
- Fiecare jeton are o valoare mare. Odată furat, poate fi folosit pentru a răspândi mai departe programe malware.
- Fiecare pipeline necesită verificări. Fără guardrails În ceea ce privește dependențele, fluxurile de lucru și secretele, un singur compromis poate afecta rapid producția.
Prin urmare, oprirea atacurilor precum Shai-Hulud necesită controale automate și ușor de aplicat. Echipele ar trebui să scaneze pachetele npm înainte de instalări, să utilizeze versiuni de fișiere de blocare, să detecteze activități ciudate de publicare și să mențină token-urile cu durată scurtă de viață. Acești pași nu mai sunt opționali. În schimb, ei reprezintă fundamentul rezilienței în mediul modern. pipelines.
La Xygeni, considerăm atacul Shai-Hulud asupra lanțului de aprovizionare ca un avertisment pentru întregul ecosistem open source. Calea sustenabilă de urmat este de a aduce securitatea lanțului de aprovizionare direct în procesul de dezvoltare, în punctul în care codul, pachetele npm și... pipelinese conectează.
Mai jos este lista completă a pachetelor și versiunilor npm raportate ca fiind compromise în Shai-Hulud. Folosește-o pentru a verifica fișierele de blocare, registrele și CI-urile. pipelines pentru expunere.
Lista pachetelor compromise
📦 Previzualizare a pachetelor npm compromise
| Nume pachet | Versiune | Data publicării |
|---|---|---|
| json-rules-engine-simplified | 0.2.1 | 2025-09-14T17:58:51.203Z |
| pilot de avion | 0.8.8 | 2025-09-14T18:35:07.600Z |
| mcp-knowledge-graph | 1.2.1 | 2025-09-14T18:35:09.494Z |
| șervețel de aer | 0.3.1 | 2025-09-14T18:35:09.521Z |
| poartă de salt | 0.0.2 | 2025-09-14T18:35:09.651Z |
| TVI-CLI | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/fereastră-de-apelare inversă | 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/manager-de-configurare | 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/validare | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
➡️ Vezi lista completă a pachetelor compromise
| Nume pachet | Versiune | Data publicării |
|---|---|---|
| json-rules-engine-simplified | 0.2.1 | 2025-09-14T17:58:51.203Z |
| pilot de avion | 0.8.8 | 2025-09-14T18:35:07.600Z |
| mcp-knowledge-graph | 1.2.1 | 2025-09-14T18:35:09.494Z |
| șervețel de aer | 0.3.1 | 2025-09-14T18:35:09.521Z |
| poartă de salt | 0.0.2 | 2025-09-14T18:35:09.651Z |
| TVI-CLI | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/fereastră-de-apelare inversă | 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/manager-de-configurare | 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/validare | 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/scalar | 0.1.7 | 2025-09-14T20:45:56.386Z |
| încărcare-fișier-ng2 | 7.0.3 | 2025-09-15T02:44:29.555Z |
| gestionarea notificărilor condensatorului | 0.0.2 | 2025-09-15T04:54:48.431Z |
| condensator-plugin-vonage | 1.0.2 | 2025-09-15T04:54:48.501Z |
| plugin-condensator-healthapp | 0.0.2 | 2025-09-15T04:54:48.704Z |
| permisiuni android pentru condensator | 0.0.4 | 2025-09-15T04:54:48.753Z |
| kit de apeluri VoIP | 1.0.2 | 2025-09-15T04:54:49.223Z |
| condensator-plugin-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/server-http | 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-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-context | 2.0.21 | 2025-09-15T05:21:19.814Z |
| @art-ws/openapi | 0.1.9 | 2025-09-15T05:21:19.969Z |
| @art-ws/aplicație-web | 1.0.3 | 2025-09-15T05:21:20.383Z |
| @art-ws/ssl-info | 1.0.9 | 2025-09-15T05:21:20.927Z |




