Et Dependabot bump publicerede en orm. 22 pakker.
En bot åbner en pull-anmodning.
En bot åbner en pull-anmodning. Et menneske fletter den 24 minutter senere. 95 minutter derefter har en orm publiceret 110 ondsindede versioner af hans 22 npm-pakker, under hans navn, med et token den fandt i hans CI.
Læs den skriftlige udgave (engelsk) ↗
Hvad denne video dækker
- En bot, et menneske, en orm
- Hvordan det skete, hvorfor npm tillod det, hvem der får skylden
- Tidslinje: den forgiftede cache
- 21:48 — Dependabot bumpet
- Hvorfor det virker
Oversat udskrift
Oversat fra den originale engelske fortælling. Tilgængelig lyd og undertekster styres af YouTube.
En bot, et menneske, en orm
0:00 En bot åbner en pull-anmodning; et menneske fletter den fireogtyve minutter senere. Femoghalvfems minutter efter har en orm publiceret hundrede og ti versioner af hans pakker, som ham. TanStacks postmortem har de opstrøms tidsstempler, den nedstrøms vedligeholders har resten, og Hacker News giver det elleve hundrede point og et navn: Mini Shai-Hulud. Hvordan det sker, hvorfor npm tillader det, hvem der får skylden.
Hvordan det skete, hvorfor npm tillod det, hvem der får skylden
0:21 Dette er The Daily Diff, postmortem. 11. maj, morgen. En omdøbt fork åbner en pull-anmodning mod TanStack Router. Den lukkes inden for en time, men en benchmark-workflow har allerede kørt sin kode og
Tidslinje: den forgiftede cache
0:33 gemt en forgiftet cache under den nøgle, release-workflowet vil bruge. Nitten-tyve. En legitim fletning kører udgivelsen. Cachen kommer tilbage, en binær fil læser runnerens hukommelse, løfter publish-tokenet og sender fireogfirs versioner på tværs af toogfyrre pakker, med gyldig herkomst. Tests fejler. Den udgives alligevel. Nitten seksogfyrre, en StepSecurity-forsker indgiver problemet; ved ni UTC er alt afskrevet, og rådgivningen er ude.
0:55 Afskrevet er ikke væk: npm nægter at afpublicere noget med afhængigheder, så det forbliver installerbart i timevis. Enogtyve otteogfyrre. I et ni-stjernet luftfartsdata-projekt, Dependabot åbner sin rutinemæssige pull-anmodning: bump dev-dependencies gruppen, tretten opdateringer. To er forgiftede TanStack-versioner. Toogtyve-tolv: flettet. Publish-workflowet kører npm C-I med tokenet i
21:48 — Dependabot bumpet
1:15 scope; et prepare-script læser det, og kl. toogtyve-sytten publicerer ormen som ham. Fem versioner af hver pakke, tokenet når, selv et gammelt sideprojekt: et klassisk token til alt. Hundrede og ti versioner på femoghalvfems minutter. Han finder ud af det via e-mail, efter midnat. Hvorfor det virker. Én: npm install kører fremmede livscyklus-scripts som standard, og et git-afhængigheds prepare-script tæller.
1:39 To: ormen vil have én ting: et token, der publicerer uden en anden faktor. Derefter spørger den registret, hvad ellers den vedligeholder ejer, og genpublicerer det hele med sig selv indeni. Tre: intet i kæden er en person.
Hvorfor det virker
1:51 En bot foreslår, en pipeline installerer, og ormen returnerer tjenesten: dens dead-drop grene er navngivet dependabot slash github-actions slash fremen. git blame. npm's install-model, femoghalvtreds procent: scripts kører ved install, afskrevet forbliver installerbart, to-faktor-bypass tokens findes. TanStacks CI, femogtyve: en ikke-auditeret pull-anmodning target workflow kører fork-kode med skriveadgang til cachen. Bump-vanen, femten: tretten opdateringer flettet på fireogtyve minutter, token i rummet.
2:17 Dependabot, fem: så betroet at ormen bærer dens uniform.
git blame
2:20 Skadesradius: toogfyrre TanStack-pakker. Toogtyve nedstrøms, fra et projekt med ni stjerner. Over hundrede og tres økosystem-bredt, når ormen når Mistral. Hver opstrøms version bar en gyldig signatur: bygget af den officielle pipeline. Sandt. Dom, postmortem: SHIP IT. Begge vedligeholdere poster tidsstemplede postmortems inden for en dag; inden for tre, installerer den nedstrøms pipeline med ignore-scripts, deler bygge fra udgive og dropper det langlivede token.
Skadesradius
2:47 npm's standardindstillinger har ikke flyttet sig. Mandag: ignore-scripts ved install, og publish-tokenet ud af jobbet, der kører det. Send mig den hændelse, du stadig ikke må tale om, i kommentarerne, eller på thedailydiff.dev. Og det er diffen for i dag.
Dom
3:00 Jeg er Niko fra Axrisi. Flet ansvarligt.
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



