+− THE DAILY DIFFdev & AI news
SHIP IT

En Dependabot-bump publicerade en mask. 22 paket.

En bot öppnar en pull-förfrågan.

En bot öppnar en pull-förfrågan. En människa slår ihop den 24 minuter senare. 95 minuter efter det har en mask publicerat 110 skadliga versioner av hans 22 npm-paket, under hans namn, med en token den hittade i hans CI.

Läs den skrivna upplagan (engelska) ↗

Vad den här videon täcker

  • En bot, en människa, en mask
  • Hur det hände, varför npm tillät det, vem som får skulden
  • Tidslinje: den förgiftade cachen
  • 21:48 — Dependabot-bumpen
  • Varför det fungerar

Översatt transkription

Översatt från den ursprungliga engelska berättelsen. Tillgängligt ljud och undertexter styrs av YouTube.

En bot, en människa, en mask

0:00 En bot öppnar en pull-förfrågan; en människa slår ihop den tjugofyra minuter senare. Nittiofem minuter senare har en mask publicerat etthundra tio versioner av hans paket, som honom. TanStacks efterdyningar har de uppströms tidsstämplarna, den nedströms underhållarens har resten, och Hacker News ger det elvahundra poäng och ett namn: Mini Shai-Hulud. Hur det händer, varför npm tillåter det, vem som får skulden.

Hur det hände, varför npm tillät det, vem som får skulden

0:21 Detta är The Daily Diff, efterdyningar. 11 maj, morgon. En omdöpt fork öppnar en pull-förfrågan mot TanStack Router. Den stängs inom en timme, men ett benchmark-workflow har redan kört sin kod och

Tidslinje: den förgiftade cachen

0:33 sparat en förgiftad cache under nyckeln som release-workflowen kommer att använda. Nitton-tjugo. En legitim sammanslagning kör releasen. Cachen kommer tillbaka, en binär läser körarens minne, lyfter publiceringstoken och skickar åttiofyra versioner över fyrtiotvå paket, med giltig härkomst. Tester misslyckas. Den publicerar ändå. Nitton fyrtiosex, en StepSecurity-forskare lämnar in ärendet; klockan nio UTC är allt föråldrat och rådet är ute.

0:55 Föråldrat är inte borta: npm vägrar att avpublicera något med beroenden, så det förblir installerbart i timmar. Tjugoett fyrtioåtta. I ett nio-stjärnigt luftfartsdata-projekt, Dependabot öppnar sin rutinmässiga pull-förfrågan: bumpa dev-dependencies-gruppen, tretton uppdateringar. Två är förgiftade TanStack-versioner. Tjugotvå-tolv: sammanslagen. Publicerings-workflowet kör npm C-I med token i

21:48 — Dependabot-bumpen

1:15 omfång; ett förberedelseskript läser den, och klockan tjugotvå-sjutton publicerar masken som honom. Fem versioner av varje paket som token når, till och med ett gammalt sidoprojekt: en klassisk token för allt. Etthundra tio versioner på nittiofem minuter. Han får reda på det via e-post, efter midnatt. Varför det fungerar. Ett: npm install kör främlingars livscykelskript som standard, och ett git-beroendes förberedelseskript räknas.

1:39 Två: masken vill ha en sak: en token som publicerar utan en andra faktor. Sedan frågar den registret vad mer den underhållaren äger, och återpublicerar alltihop med sig själv inuti. Tre: ingenting i kedjan är en person.

Varför det fungerar

1:51 En bot föreslår, en pipeline installerar, och masken återgäldar tjänsten: dess dead-drop-grenar heter dependabot slash github-actions slash fremen. git blame. npms installationsmodell, femtiofem procent: skript körs vid installation, föråldrat förblir installerbart, tvåfaktors-bypass-tokens existerar. TanStacks CI, tjugofem: ett oauktoriserat pull request target workflow som kör fork-kod med skrivåtkomst till cachen. Bump-vanan, femton: tretton uppdateringar sammanfogade på tjugofyra minuter, token i rummet.

2:17 Dependabot, fem: så betrodd att masken bär dess uniform.

git blame

2:20 Skaderadie: fyrtiotvå TanStack-paket. Tjugotvå nedströms, från ett projekt med nio stjärnor. Över hundra sextio ekosystembrett när masken når Mistral. Varje uppströms version hade en giltig signatur: byggd av den officiella pipelinen. Sant. Dom, efterdyningar: SHIP IT. Båda underhållarna publicerar tidsstämplade efterdyningar inom en dag; inom tre, installeras den nedströms pipelinen med ignore-scripts, delar upp bygge från publicering och släpper den långlivade token.

Skaderadie

2:47 npms standardinställningar har inte flyttats. Måndag: ignore-scripts vid installation, och publiceringstoken ut ur jobbet som kör den. Skicka mig incidenten du fortfarande inte får prata om, i kommentarerna, eller på thedailydiff.dev. Och det är skillnaden för idag.

Dom

3:00 Jag är Niko från Axrisi. Slå ihop ansvarsfullt.

Källor

  1. TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
  2. TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
  3. TanStack/router#7383 — the StepSecurity detection issuegithub.com
  4. Downstream incident post, @squawk/* (May 12)github.com
  5. Downstream hardening post (May 14)github.com
  6. The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
  7. @tan_stack advisory post, 21:19 UTCx.com
  8. StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
  9. Socketsocket.dev
  10. Aikido — "over 160 packages, including Mistral"www.aikido.dev
  11. Hacker News (1,097 points)news.ycombinator.com

Relaterade videor