+− THE DAILY DIFFdev & AI news
SHIP IT

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

Bot otwiera pull request.

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.

Przeczytaj wydanie pisemne (angielski) ↗

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

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

  1. TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
  2. TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
  3. TanStack/router#7383 — the StepSecurity detection issuegithub.com
  4. Downstream incident post, @squawk/* (May 12)github.com
  5. Downstream hardening post (May 14)github.com
  6. The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
  7. @tan_stack advisory post, 21:19 UTCx.com
  8. StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
  9. Socketsocket.dev
  10. Aikido — "over 160 packages, including Mistral"www.aikido.dev
  11. Hacker News (1,097 points)news.ycombinator.com

Powiązane filmy