# Záplatování pomocí Dependabota zveřejnilo červa. 22 balíčků.

Published: 2026-09-17

Bot otevře pull request. Člověk jej sloučí o 24 minut později. O 95 minut později červ zveřejnil 110 škodlivých verzí svých 22 npm balíčků pod svým jménem s tokenem, který našel ve svém CI.

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

## Co toto video pokrývá

- Bot, člověk, červ
- Jak se to stalo, proč to npm povolilo, kdo nese vinu
- Časová osa: otrávená cache
- 21:48 — záplatování pomocí Dependabota
- Proč to funguje

## Kapitoly

- 0:00 Bot, člověk, červ
- 0:20 Jak se to stalo, proč to npm povolilo, kdo nese vinu
- 0:30 Časová osa: otrávená cache
- 1:15 21:48 — záplatování pomocí Dependabota
- 1:50 Proč to funguje
- 2:20 git blame
- 2:45 Poloměr výbuchu
- 3:00 Verdikt

## Přeložený přepis

Přeloženo z původního anglického vyprávění. Dostupné audio a titulky jsou řízeny YouTube.

### Bot, člověk, červ

0:00 Bot otevře pull request; člověk jej sloučí o dvacet čtyři minut později. O devadesát pět minut později, červ zveřejnil sto deset verzí svých balíčků, jako on. Postmortem TanStacku má časové údaje od upstreamu, udržovatel downstreamu má zbytek a Hacker News mu dává jedenáct set bodů a jméno: Mini Shai-Hulud. Jak se to stane, proč to npm povolí, kdo nese vinu.

### Jak se to stalo, proč to npm povolilo, kdo nese vinu

0:21 Toto je The Daily Diff, postmortem. 11. května, ráno. Přejmenovaný fork otevře pull request proti TanStack Routeru. Uzavře se do hodiny, ale benchmarkový workflow už spustil svůj kód a

### Časová osa: otrávená cache

0:33 uložil otrávenou cache pod klíčem, který použije release workflow. Devatenáct dvacet. Legitimní sloučení spustí vydání. Cache se vrátí, binární soubor přečte paměť běžce, zvedne publish token a odešle osmdesát čtyři verzí přes čtyřicet dva balíčků s platnou proveniencí. Testy selžou. Přesto se to zveřejní. Devatenáct čtyřicet šest, výzkumník StepSecurity nahlásí problém; do devíti UTC vše je zastaralé a je vydáno upozornění.

0:55 Zastaralé neznamená pryč: npm odmítá zrušit zveřejnění čehokoli se závislostmi, takže zůstává instalovatelné po celé hodiny. Dvacet jedna čtyřicet osm. V devítihvězdičkovém projektu leteckých dat, Dependabot otevírá svůj rutinní pull request: navýšení skupiny dev-dependencies, třináct aktualizací. Dvě jsou otrávené verze TanStacku. Dvacet dva dvanáct: sloučeno. Workflow zveřejnění spustí npm C-I s tokenem v

### 21:48 — záplatování pomocí Dependabota

1:15 rozsahu; prepare skript jej přečte a ve dvacet dva sedmnáct červ zveřejní jako on. Pět verzí každého balíčku, kam token dosáhne, dokonce i starý vedlejší projekt: jeden klasický token na všechno. Sto deset verzí za devadesát pět minut. Zjistí to e-mailem, po půlnoci. Proč to funguje. Jedna: npm install standardně spouští lifecycle skripty cizích lidí, a prepare skript git závislosti se počítá.

1:39 Dvě: červ chce jednu věc: token, který zveřejňuje bez druhého faktoru. Pak se zeptá registru, co dalšího ten udržovatel vlastní, a zveřejní to všechno znovu se sebou uvnitř. Tři: nic v řetězci není osoba.

### Proč to funguje

1:51 Bot navrhuje, pipeline instaluje a červ oplácí laskavost: jeho dead-drop větve jsou pojmenovány dependabot slash github-actions slash fremen. git blame. Instalační model npm, padesát pět procent: skripty se spouštějí při instalaci, zastaralé zůstává instalovatelné, existují tokeny obcházející dvoufaktorové ověřování. CI TanStacku, dvacet pět: neauditovaný pull request target workflow spouštějící kód forku s právem zápisu do cache. Zvyk záplatování, patnáct: třináct aktualizací sloučených za dvacet čtyři minut, token v místnosti.

2:17 Dependabot, pět: tak důvěryhodný, že červ nosí jeho uniformu.

### git blame

2:20 Poloměr výbuchu: čtyřicet dva balíčků TanStacku. Dvacet dva downstream, z projektu s devíti hvězdami. Přes sto šedesát v celém ekosystému, jakmile červ dosáhne Mistralu. Každá upstream verze nesla platný podpis: postavena oficiální pipeline. Pravda. Verdikt, postmortem: SHIP IT. Oba udržovatelé zveřejní postmortemy s časovým razítkem do jednoho dne; do tří, downstream pipeline instaluje s ignore-scripts, rozdělí build od publish a zruší dlouhodobý token.

### Poloměr výbuchu

2:47 Výchozí nastavení npm se nezměnilo. Pondělí: ignore-scripts při instalaci a publish token mimo úlohu, která jej spouští. Pošlete mi incident, o kterém stále nesmíte mluvit, v komentářích, nebo na thedailydiff.dev. A to je dnešní diff.

### Verdikt

3:00 Jsem Niko z Axrisi. Sloučení s odpovědností.

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