Një Dependabot bump publikoi një krimb. 22 paketa.
Një bot hap një kërkesë tërheqjeje.
Një bot hap një kërkesë tërheqjeje. Një njeri e bashkon atë 24 minuta më vonë. 95 minuta pas kësaj, një krimb ka publikuar 110 versione keqdashëse të 22 paketave të tij npm, nën emrin e tij, me një token që gjeti në CI-në e tij.
Lexoni edicionin e shkruar (anglisht) ↗
Çfarë mbulon kjo video
- Një bot, një njeri, një krimb
- Si ndodhi, pse e lejoi npm, kush merr fajin
- Afati kohor: cache-i i helmuar
- 21:48 — the Dependabot bump
- Pse funksionon
Transkript i përkthyer
Përkthyer nga tregimi origjinal në anglisht. Audio dhe titrat e disponueshme kontrollohen nga YouTube.
Një bot, një njeri, një krimb
0:00 Një bot hap një kërkesë tërheqjeje; një njeri e bashkon atë njëzet e katër minuta më vonë. Nëntëdhjetë e pesë minuta më vonë, një krimb ka publikuar njëqind e dhjetë versione të tij paketa, si ai. Postmortem i TanStack ka kohën e origjinës, mirëmbajtësi i rrjedhës së poshtme ka pjesën tjetër, dhe Hacker News i jep njëmijë e njëqind pikë dhe një emër: Mini Shai-Hulud. Si ndodh, pse e lejon npm, kush merr fajin.
Si ndodhi, pse e lejoi npm, kush merr fajin
0:21 Ky është The Daily Diff, postmortem. 11 maj, mëngjes. Një fork i riemërtuar hap një kërkesë tërheqjeje kundër TanStack Router. Mbyllet brenda orës, por një fluks pune benchmark ka ekzekutuar tashmë kodin e tij dhe
Afati kohor: cache-i i helmuar
0:33 ka ruajtur një cache të helmuar nën çelësin që do të përdorë fluksi i punës së lëshimit. Nëntëmbëdhjetë-njëzet. Një bashkim legjitim ekzekuton lëshimin. Cache-i kthehet, një binar lexon memorien e ekzekutuesit, ngre tokenin e publikimit dhe dërgon tetëdhjetë e katër versione në dyzet e dy paketa, me prejardhje të vlefshme. Testet dështojnë. Publikon gjithsesi. Nëntëmbëdhjetë e dyzet e gjashtë, një studiues i StepSecurity paraqet çështjen; nga ora nëntë UTC gjithçka është e vjetëruar dhe këshilla është jashtë.
0:55 E vjetëruar nuk do të thotë e zhdukur: npm refuzon të çpublikojë çdo gjë me varësi, kështu që mbetet e instalueshme për orë të tëra. Njëzet e një e dyzet e tetë. Në një projekt me nëntë yje të të dhënave të aviacionit, Dependabot hap kërkesën e tij rutinë tërheqjeje: bump dev-dependencies group, trembëdhjetë përditësime. Dy janë versione të helmuara të TanStack. Njëzet e dy e dymbëdhjetë: bashkuar. Fluksi i punës së publikimit ekzekuton npm C-I me tokenin në
21:48 — the Dependabot bump
1:15 fushë; një skript përgatitjeje e lexon atë, dhe në njëzet e dy e shtatëmbëdhjetë krimbi publikon si ai. Pesë versione të çdo pakete që arrin tokeni, edhe një projekt i vjetër anësor: një token klasik për gjithçka. Njëqind e dhjetë versione në nëntëdhjetë e pesë minuta. Ai e zbulon me email, pas mesnate. Pse funksionon. Një: npm install ekzekuton skriptet e ciklit të jetës së të panjohurve si parazgjedhje, dhe skripti i përgatitjes së një varësie git llogaritet.
1:39 Dy: krimbi dëshiron një gjë: një token që publikon pa një faktor të dytë. Pastaj ai pyet regjistrin se çfarë tjetër zotëron ai mirëmbajtës, dhe ripublikon të gjitha me veten brenda. Tre: asgjë në zinxhir nuk është person.
Pse funksionon
1:51 Një bot propozon, një tubacion instalon, dhe krimbi kthen favorin: degët e tij të vdekura janë emërtuar dependabot slash github-actions slash fremen. git blame. Modeli i instalimit të npm, pesëdhjetë e pesë përqind: skriptet ekzekutohen në instalim, e vjetëruar mbetet e instalueshme, ekzistojnë tokena për të anashkaluar verifikimin me dy faktorë. CI e TanStack, njëzet e pesë: një fluks pune target i kërkesave tërheqëse të paaudituar që ekzekuton kodin e fork-ut me akses shkrimi në cache. Zakoni i bump-it, pesëmbëdhjetë: trembëdhjetë përditësime të bashkuara në njëzet e katër minuta, token në dhomë.
2:17 Dependabot, pesë: aq i besueshëm saqë krimbi vesh uniformën e tij.
git blame
2:20 Rrezja e shpërthimit: dyzet e dy paketa TanStack. Njëzet e dy në rrjedhën e poshtme, nga një projekt me nëntë yje. Mbi njëqind e gjashtëdhjetë në të gjithë ekosistemin pasi krimbi arrin Mistral. Çdo version i rrjedhës së sipërme mbante një nënshkrim të vlefshëm: i ndërtuar nga zyrtari tubacion. E vërtetë. Vendimi, postmortem: SHIP IT. Të dy mirëmbajtësit postojnë postmortem me kohë brenda një dite; brenda tre, tubacionet e rrjedhës së poshtme instalohen me ignore-scripts, ndajnë ndërtimin nga publikimi dhe heqin tokenin me jetë të gjatë.
Rrezja e shpërthimit
2:47 Parazgjedhjet e npm nuk kanë lëvizur. E hënë: ignore-scripts në instalim, dhe tokeni i publikimit jashtë punës që e ekzekuton. Më dërgoni incidentin për të cilin ende nuk ju lejohet të flisni, në komente, ose te thedailydiff.dev. Dhe kjo është diferenca për sot.
Vendimi
3:00 Unë jam Niko nga Axrisi. Bashkoheni me përgjegjësi.
Burimet
- 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



