Záplatovanie cez Dependabot šírilo červa. 22 balíkov.
Bot otvorí požiadavku na zlúčenie.
Bot otvorí požiadavku na zlúčenie. Človek ju zlúči o 24 minút neskôr. 95 minút nato červ publikoval 110 škodlivých verzií jeho 22 npm balíkov, pod jeho menom, s tokenom, ktorý našiel v jeho CI.
Prečítajte si písanú edíciu (anglicky) ↗
Čo toto video pokrýva
- Bot, človek, červ
- Ako sa to stalo, prečo to npm povolilo, kto je na vine
- Časová os: otrávená cache
- 21:48 – oprava cez Dependabot
- Prečo to funguje
Preložený prepis
Preložené z pôvodného anglického rozprávania. Dostupný zvuk a titulky sú kontrolované službou YouTube.
Bot, človek, červ
0:00 Bot otvorí požiadavku na zlúčenie; človek ju zlúči o dvadsaťštyri minút neskôr. O deväťdesiatpäť minút nato červ publikoval sto desať verzií jeho balíkov, ako on. TanStack postmortem má časové pečiatky z upstreamu, downstream udržiavateľ má zvyšok a Hacker News mu dáva jedenásťsto bodov a meno: Mini Shai-Hulud. Ako sa to stane, prečo to npm povoľuje, kto je na vine.
Ako sa to stalo, prečo to npm povolilo, kto je na vine
0:21 Toto je The Daily Diff, postmortem. 11. mája, ráno. Premenovaný fork otvorí požiadavku na zlúčenie voči TanStack Router. Uzavrie sa do hodiny, ale workflow benchmarku už spustil svoj kód a
Časová os: otrávená cache
0:33 uložil otrávenú cache pod kľúčom, ktorý použije workflow vydania. Devätnásť-dvadsať. Legitimné zlúčenie spustí vydanie. Cache sa vráti, binárka prečíta pamäť bežca, zdvihne publish token a odošle osemdesiatštyri verzií naprieč štyridsiatimi-dvomi balíkmi, s platným pôvodom. Testy zlyhajú. Napriek tomu sa publikuje. Devätnásť štyridsaťšesť, výskumník StepSecurity nahlási problém; do deviatich UTC je všetko zastarané a je vydané upozornenie.
0:55 Zastarané neznamená, že je preč: npm odmieta zrušiť publikovanie čohokoľvek so závislosťami, takže zostáva inštalovateľné celé hodiny. Dvadsaťjeden štyridsaťosem. V deväťhviezdičkovom projekte leteckých dát, Dependabot otvorí svoju rutinnú požiadavku na zlúčenie: aktualizovať skupinu dev-dependencies, trinásť aktualizácií. Dve sú otrávené verzie TanStack. Dvadsaťdva-dvanásť: zlúčené. Workflow publikovania spustí npm C-I s tokenom v
21:48 – oprava cez Dependabot
1:15 rozsahu; prepare skript ho prečíta a o dvadsaťdva-sedemnásť červ publikuje ako on. Päť verzií každého balíka, ku ktorému sa token dostane, dokonca aj starý vedľajší projekt: jeden klasický token pre všetko. Sto desať verzií za deväťdesiatpäť minút. Zistí to e-mailom, po polnoci. Prečo to funguje. Jeden: npm install štandardne spúšťa životné skripty cudzích ľudí, a prepare skript git závislosti sa počíta.
1:39 Dva: červ chce jednu vec: token, ktorý publikuje bez druhého faktora. Potom sa spýta registru, čo ďalšie ten udržiavateľ vlastní, a znova to všetko publikuje so sebou vnútri. Tri: nič v reťazci nie je osoba.
Prečo to funguje
1:51 Bot navrhuje, pipeline inštaluje a červ vracia láskavosť: jeho dead-drop vetvy sú pomenované dependabot lomka github-actions lomka fremen. git blame. Inštalačný model npm, päťdesiatpäť percent: skripty sa spúšťajú pri inštalácii, zastarané zostáva inštalovateľné, existujú tokeny obchádzajúce dvojfaktor. CI TanStack, dvadsaťpäť: neauditovaný pull request target workflow spúšťajúci kód forku s prístupom na zápis do cache. Zvyk aktualizovať, pätnásť: trinásť aktualizácií zlúčených za dvadsaťštyri minút, token v miestnosti.
2:17 Dependabot, päť: tak dôveryhodný, že červ nosí jeho uniformu.
git blame
2:20 Rozsah poškodenia: štyridsaťdva balíkov TanStack. Dvadsaťdva downstream, z projektu s deviatimi hviezdičkami. Viac ako sto šesťdesiat v celom ekosystéme, keď červ dosiahne Mistral. Každá upstream verzia niesla platný podpis: vytvorená oficiálnym pipeline. Pravda. Verdikt, postmortem: SHIP IT. Obaja udržiavatelia zverejnia postmortemy s časovou pečiatkou do jedného dňa; do troch, downstream pipeline inštaluje s ignore-scripts, rozdelí build od publikovania a zruší dlho-žijúci token.
Rozsah poškodenia
2:47 Predvolené nastavenia npm sa nepohli. Pondelok: ignore-scripts pri inštalácii a publish token mimo úlohy, ktorá ho spúšťa. Pošlite mi incident, o ktorom stále nemôžete hovoriť, v komentároch, alebo na thedailydiff.dev. A to je dnešný rozdiel.
Verdikt
3:00 Som Niko z Axrisi. Zlučujte zodpovedne.
Zdroje
- 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



