# Wysłany przez Dependabot problem spowodował robaka. 22 pakiety.

Published: 2026-09-17

Bot otwiera pull request. Człowiek łączy go 24 minuty później. 95 minut później robak opublikował 110 złośliwych wersji jego 22 pakietów npm, pod jego nazwiskiem, z tokenem, który znalazł w jego CI.

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

## Co obejmuje ten film

- Bot, człowiek, robak
- Jak to się stało, dlaczego npm na to pozwolił, kto ponosi winę
- Oś czasu: zatruta pamięć podręczna
- 21:48 — problem Dependabota
- Dlaczego to działa

## Rozdziały

- 0:00 Bot, człowiek, robak
- 0:20 Jak to się stało, dlaczego npm na to pozwolił, kto ponosi winę
- 0:30 Oś czasu: zatruta pamięć podręczna
- 1:15 21:48 — problem Dependabota
- 1:50 Dlaczego to działa
- 2:20 git blame
- 2:45 Promień rażenia
- 3:00 Werdykt

## Przetłumaczona transkrypcja

Przetłumaczono z oryginalnej narracji angielskiej. Dostępne audio i napisy są kontrolowane przez YouTube.

### Bot, człowiek, robak

0:00 Bot otwiera pull request; człowiek łączy go dwadzieścia cztery minuty później. Dziewięćdziesiąt pięć minut później, robak opublikował sto dziesięć wersji jego pakietów, jako on. Postmortem TanStack ma sygnatury czasowe upstream, konserwatora downstream ma resztę, a Hacker News daje mu jedenaścieście punktów i nazwę: Mini Shai-Hulud. Jak to się dzieje, dlaczego npm na to pozwala, kto ponosi winę.

### Jak to się stało, dlaczego npm na to pozwolił, kto ponosi winę

0:21 To jest The Daily Diff, postmortem. 11 maja, rano. Przemianowany fork otwiera pull request do TanStack Router. Zamyka się w ciągu godziny, ale przepływ pracy benchmark już uruchomił swój kod i

### Oś czasu: zatruta pamięć podręczna

0:33 zapisał zatrutą pamięć podręczną pod kluczem, którego użyje przepływ pracy wydania. Dziewiętnaście dwadzieścia. Legalne połączenie uruchamia wydanie. Pamięć podręczna wraca, binarny plik odczytuje pamięć runnera, pobiera token publikacji i wysyła osiemdziesiąt cztery wersje w czterdziestu dwóch pakietach, z ważnym pochodzeniem. Testy zawodzą. Publikuje mimo to. Dziewiętnaście czterdzieści sześć, badacz StepSecurity zgłasza problem; do dziewiątej UTC wszystko jest przestarzałe, a porada jest dostępna.

0:55 Przestarzałe nie oznacza zniknięte: npm odmawia usunięcia czegokolwiek z zależnościami, więc pozostaje możliwe do zainstalowania przez wiele godzin. Dwadzieścia jeden czterdzieści osiem. W dziewięciogwiazdkowym projekcie danych lotniczych, Dependabot otwiera swój rutynowy pull request: aktualizacja grupy zależności deweloperskich, trzynaście aktualizacji. Dwie to zatrute wersje TanStack. Dwadzieścia dwa dwanaście: połączono. Przepływ pracy publikacji uruchamia npm C-I z tokenem w

### 21:48 — problem Dependabota

1:15 zakresie; skrypt prepare odczytuje go, a o dwudziestu dwóch siedemnastu robak publikuje jako on. Pięć wersji każdego pakietu, do którego token dociera, nawet stary projekt poboczny: jeden klasyczny token do wszystkiego. Sto dziesięć wersji w dziewięćdziesiąt pięć minut. Dowiaduje się o tym e-mailem, po północy. Dlaczego to działa. Po pierwsze: npm install domyślnie uruchamia skrypty cyklu życia nieznajomych, a skrypt prepare zależności git jest wliczany.

1:39 Po drugie: robak chce jednej rzeczy: tokena, który publikuje bez drugiego czynnika. Następnie pyta rejestr, co jeszcze należy do tego konserwatora, i ponownie publikuje wszystko, z sobą w środku. Po trzecie: nic w łańcuchu nie jest osobą.

### Dlaczego to działa

1:51 Bot proponuje, potok instaluje, a robak oddaje przysługę: jego martwe gałęzie noszą nazwy dependabot slash github-actions slash fremen. git blame. Model instalacji npm, pięćdziesiąt pięć procent: skrypty uruchamiane podczas instalacji, przestarzałe pozostaje możliwe do zainstalowania, istnieją tokeny omijające dwuetapową weryfikację. CI TanStack, dwadzieścia pięć: nieaudytowany przepływ pracy celu pull requestu uruchamiający kod forka z dostępem do zapisu do pamięci podręcznej. Nawyk aktualizacji, piętnaście: trzynaście aktualizacji połączonych w dwadzieścia cztery minuty, token w pomieszczeniu.

2:17 Dependabot, pięć: tak zaufany, że robak nosi jego mundur.

### git blame

2:20 Promień rażenia: czterdzieści dwa pakiety TanStack. Dwadzieścia dwa downstream, z projektu z dziewięcioma gwiazdkami. Ponad sto sześćdziesiąt w całym ekosystemie, gdy robak dotrze do Mistrala. Każda wersja upstream nosiła ważny podpis: zbudowana przez oficjalny potok. Prawda. Werdykt, postmortem: SHIP IT. Obaj konserwatorzy publikują postmortemy ze znacznikiem czasu w ciągu jednego dnia; w ciągu trzech, potok downstream instaluje z ignore-scripts, dzieli budowanie od publikacji i usuwa długotrwały token.

### Promień rażenia

2:47 Domyślne ustawienia npm nie uległy zmianie. Poniedziałek: ignore-scripts przy instalacji i token publikacji poza zadaniem, które go uruchamia. Wyślij mi incydent, o którym wciąż nie wolno ci mówić, w komentarzach lub na thedailydiff.dev. I to jest dzisiejsza różnica.

### Werdykt

3:00 Jestem Niko z Axrisi. Łącz odpowiedzialnie.

## Źródła

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