En Dependabot-oppdatering publiserte en orm. 22 pakker.
En bot åpner en pull-forespørsel.
En bot åpner en pull-forespørsel. Et menneske slår den sammen 24 minutter senere. 95 minutter etter det har en orm publisert 110 skadelige versjoner av hans 22 npm-pakker, under hans navn, med et token den fant i hans CI.
Les den skriftlige utgaven (engelsk) ↗
Hva denne videoen dekker
- En bot, et menneske, en orm
- Hvordan det skjedde, hvorfor npm tillot det, hvem får skylden
- Tidslinje: den forgiftede cachen
- 21:48 — Dependabot-oppdateringen
- Hvorfor det fungerer
Oversatt transkripsjon
Oversatt fra den originale engelske fortellingen. Tilgjengelig lyd og undertekster kontrolleres av YouTube.
En bot, et menneske, en orm
0:00 En bot åpner en pull-forespørsel; et menneske slår den sammen tjuefire minutter senere. Nittifem minutter senere har en orm publisert hundre og ti versjoner av hans pakker, som ham. TanStacks postmortem har tidsstemplene fra oppstrømmen, nedstrømsvedlikeholderens har resten, og Hacker News gir den elleve hundre poeng og et navn: Mini Shai-Hulud. Hvordan det skjer, hvorfor npm tillater det, hvem får skylden.
Hvordan det skjedde, hvorfor npm tillot det, hvem får skylden
0:21 Dette er The Daily Diff, postmortem. 11. mai, morgen. En omdøpt fork åpner en pull-forespørsel mot TanStack Router. Den lukkes innen en time, men en benchmark-arbeidsflyt har allerede kjørt koden og
Tidslinje: den forgiftede cachen
0:33 lagret en forgiftet cache under nøkkelen som utgivelsesarbeidsflyten vil bruke. Nitten-tjue. En legitim sammenslåing kjører utgivelsen. Cachen kommer tilbake, en binær fil leser minnet til runneren, løfter publiseringstokenet og sender åttifire versjoner fordelt på førtito pakker, med gyldig herkomst. Tester feiler. Den publiseres likevel. Nitten førtiseks, en StepSecurity-forsker arkiverer problemet; innen klokken ni UTC er alt avviklet og advarselen er ute.
0:55 Avviklet er ikke borte: npm nekter å avpublisere noe med avhengigheter, så det forblir installerbart i timevis. Tjueniførtiåtte. I et ni-stjerners luftfartsdata-prosjekt, Dependabot åpner sin rutinemessige pull-forespørsel: oppdater dev-dependencies-gruppen, tretten oppdateringer. To er forgiftede TanStack-versjoner. Tjue-to-tolv: slått sammen. Publiseringarbeidsflyten kjører npm C-I med tokenet i
21:48 — Dependabot-oppdateringen
1:15 omfang; et forberedelsesskript leser det, og klokka tjueto-sytten publiserer ormen som ham. Fem versjoner av hver pakke tokenet når, selv et gammelt sideprosjekt: ett klassisk token for alt. Hundre og ti versjoner på nittifem minutter. Han finner det ut via e-post, etter midnatt. Hvorfor det fungerer. Én: npm install kjører fremmedes livssyklusskripter som standard, og et git-avhengighetens forberedelsesskript teller.
1:39 To: ormen vil ha én ting: et token som publiserer uten en andre faktor. Så spør den registret hva annet den vedlikeholderen eier, og publiserer alt på nytt med seg selv inni. Tre: ingenting i kjeden er en person.
Hvorfor det fungerer
1:51 En bot foreslår, en pipeline installerer, og ormen gjengjelder tjenesten: dens dead-drop-grener er navngitt dependabot slash github-actions slash fremen. git blame. npms installasjonsmodell, femtifem prosent: skript kjøres ved installasjon, avviklet forblir installerbart, tofaktors-bypass-tokens eksisterer. TanStacks CI, tjuefem: en uanmeldt pull request target workflow som kjører fork-kode med skrivetilgang til cachen. Oppdateringsvanen, femten: tretten oppdateringer slått sammen på tjuefire minutter, token i rommet.
2:17 Dependabot, fem: så betrodd at ormen bærer dens uniform.
git blame
2:20 Skadeomfang: førtito TanStack-pakker. Tjueto nedstrøms, fra et prosjekt med ni stjerner. Over hundre og seksti økosystem-bredt når ormen når Mistral. Hver oppstrømsversjon hadde en gyldig signatur: bygget av den offisielle pipeline. Sant. Dom, postmortem: SHIP IT. Begge vedlikeholderne poster tidsstemplede postmortems innen en dag; innen tre, installerer nedstrøms-pipelinen med ignore-scripts, deler bygg fra publisering, og dropper det langlivede tokenet.
Skadeomfang
2:47 npms standardinnstillinger har ikke flyttet seg. Mandag: ignore-scripts ved installasjon, og publiseringstokenet ut av jobben som kjører den. Send meg hendelsen du fortsatt ikke får snakke om, i kommentarene, eller på thedailydiff.dev. Og det er diffen for i dag.
Dom
3:00 Jeg er Niko fra Axrisi. Slå sammen ansvarlig.
Kilder
- TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
- TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
- TanStack/router#7383 — the StepSecurity detection issuegithub.com
- Downstream incident post, @squawk/* (May 12)github.com
- Downstream hardening post (May 14)github.com
- The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
- @tan_stack advisory post, 21:19 UTCx.com
- StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
- Socketsocket.dev
- Aikido — "over 160 packages, including Mistral"www.aikido.dev
- Hacker News (1,097 points)news.ycombinator.com



