# Záplatovanie cez Dependabot šírilo červa. 22 balíkov.

Published: 2026-09-17

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.

Canonical: https://thedailydiff.dev/sk/video/2026-09-17-dependabot-tanstack/

## Č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

## Kapitoly

- 0:00 Bot, človek, červ
- 0:20 Ako sa to stalo, prečo to npm povolilo, kto je na vine
- 0:30 Časová os: otrávená cache
- 1:15 21:48 – oprava cez Dependabot
- 1:50 Prečo to funguje
- 2:20 git blame
- 2:45 Rozsah poškodenia
- 3:00 Verdikt

## 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)](https://tanstack.com/blog/npm-supply-chain-compromise-postmortem) — tanstack.com
- [TanStack "Hardening TanStack After the npm Compromise" (May 12)](https://tanstack.com/blog/incident-followup) — tanstack.com
- [TanStack/router#7383 — the StepSecurity detection issue](https://github.com/TanStack/router/issues/7383) — github.com
- [Downstream incident post, @squawk/\* (May 12)](https://github.com/neilcochran/squawk/discussions/251) — github.com
- [Downstream hardening post (May 14)](https://github.com/neilcochran/squawk/discussions/264) — github.com
- [The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)](https://github.com/neilcochran/squawk/pull/246) — github.com
- [@tan\_stack advisory post, 21:19 UTC](https://x.com/tan_stack/status/2053948103766716630) — x.com
- [StepSecurity — worm internals, bypass\_2fa search, Dependabot-style branch names](https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem) — www.stepsecurity.io
- [Socket](https://socket.dev/blog/tanstack-npm-packages-compromised-mini-shai-hulud-supply-chain-attack) — socket.dev
- [Aikido — "over 160 packages, including Mistral"](https://www.aikido.dev/blog/mini-shai-hulud-is-back-tanstack-compromised) — www.aikido.dev
- [Hacker News (1,097 points)](https://news.ycombinator.com/item?id=48100706) — news.ycombinator.com
