O bump Dependabot a publicat un vierme. 22 pachete.
Un bot deschide un pull request.
Un bot deschide un pull request. Un om îl îmbină 24 de minute mai târziu. 95 de minute după aceea, un vierme a publicat 110 versiuni malițioase ale celor 22 de pachete npm, sub numele său, cu un token pe care l-a găsit în CI-ul său.
Citiți ediția scrisă (engleză) ↗
Ce acoperă acest videoclip
- Un bot, un om, un vierme
- Cum s-a întâmplat, de ce a permis npm, cine este de vină
- Cronologie: cache-ul otrăvit
- 21:48 — bump-ul Dependabot
- De ce funcționează
Transcrierea tradusă
Tradus din narațiunea originală în engleză. Audio-ul și subtitrările disponibile sunt controlate de YouTube.
Un bot, un om, un vierme
0:00 Un bot deschide un pull request; un om îl îmbină douăzeci și patru de minute mai târziu. Nouăzeci și cinci de minute mai târziu, un vierme a publicat o sută zece versiuni ale pachetelor, ca el. Postmortem-ul TanStack are timestamp-urile upstream, al maintainerului downstream are restul, iar Hacker News îi dă unsprezece sute de puncte și un nume: Mini Shai-Hulud. Cum se întâmplă, de ce npm o permite, cine este de vină.
Cum s-a întâmplat, de ce a permis npm, cine este de vină
0:21 Acesta este The Daily Diff, postmortem. 11 mai, dimineață. O fork redenumită deschide un pull request împotriva TanStack Router. Se închide în decurs de o oră, dar un flux de lucru de benchmark și-a rulat deja codul și
Cronologie: cache-ul otrăvit
0:33 a salvat un cache otrăvit sub cheia pe care o va folosi fluxul de lucru de lansare. Nouăsprezece douăzeci. O îmbinare legitimă rulează lansarea. Cache-ul revine, un binar citește memoria runnerului, ridică tokenul de publicare și livrează optzeci și patru de versiuni pe patruzeci și două de pachete, cu proveniență validă. Testele eșuează. Se publică oricum. Nouăsprezece patruzeci și șase, un cercetător StepSecurity înregistrează problema; până la nouă UTC totul este depreciat și avizul este emis.
0:55 Depreciat nu înseamnă dispărut: npm refuză să anuleze publicarea oricărui lucru cu dependențe, așa că rămâne instalabil ore întregi. Douăzeci și unu patruzeci și opt. Într-un proiect de date aviatice cu nouă stele, Dependabot deschide cererea sa de pull obișnuită: actualizează grupul dev-dependencies, treisprezece actualizări. Două sunt versiuni TanStack otrăvite. Douăzeci și două doisprezece: îmbinat. Fluxul de lucru de publicare rulează npm C-I cu tokenul în
21:48 — bump-ul Dependabot
1:15 scope; un script de pregătire îl citește, iar la douăzeci și două șaptesprezece viermele publică ca el. Cinci versiuni ale fiecărui pachet la care ajunge tokenul, chiar și un vechi proiect secundar: un singur token clasic pentru orice. O sută zece versiuni în nouăzeci și cinci de minute. Află prin e-mail, după miezul nopții. De ce funcționează. Unu: npm install rulează scripturile de ciclu de viață ale străinilor implicit, și scriptul de pregătire al unei dependențe git contează.
1:39 Doi: viermele vrea un singur lucru: un token care publică fără un al doilea factor. Apoi întreabă registry-ul ce altceva deține acel maintainer, și republică totul cu el însuși înăuntru. Trei: nimic din lanț nu este o persoană.
De ce funcționează
1:51 Un bot propune, o conductă instalează, iar viermele întoarce favoarea: ale sale ramuri dead-drop sunt numite dependabot slash github-actions slash fremen. git blame. Modelul de instalare npm, cincizeci și cinci la sută: scripturile rulează la instalare, depreciat rămâne instalabil, există tokenuri de ocolire a doi factori. CI-ul TanStack, douăzeci și cinci: un flux de lucru țintă pull request neauditat care rulează cod fork cu acces de scriere la cache. Obiceiul de bump, cincisprezece: treisprezece actualizări îmbinate în douăzeci și patru de minute, token în cameră.
2:17 Dependabot, cinci: atât de încredere încât viermele îi poartă uniforma.
git blame
2:20 Raza de acțiune: patruzeci și două de pachete TanStack. Douăzeci și două downstream, dintr-un proiect cu nouă stele. Peste o sută șaizeci la nivel de ecosistem odată ce viermele ajunge la Mistral. Fiecare versiune upstream a purtat o semnătură validă: construită de oficialul pipeline. Adevărat. Verdict, postmortem: SHIP IT. Amândoi maintainerii postează postmortem-uri cu timestamp în decurs de o zi; în trei, pipeline-ul downstream se instalează cu ignore-scripts, separă build de publish și elimină tokenul de lungă durată.
Raza de acțiune
2:47 Setările implicite npm nu s-au schimbat. Luni: ignore-scripts la instalare și tokenul de publicare în afara jobului care îl rulează. Trimite-mi incidentul despre care încă nu ai voie să vorbești, în comentarii sau la thedailydiff.dev. Și asta e diferența pentru astăzi.
Verdict
3:00 Sunt Niko de la Axrisi. Îmbină responsabil.
Surse
- 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



