+− THE DAILY DIFFdev & AI news
SHIP IT

Un "bump" de Dependabot va publicar un cuc. 22 paquets.

Un bot obre una sol·licitud d'extracció.

Un bot obre una sol·licitud d'extracció. Un humà la fusiona 24 minuts després. 95 minuts després, un cuc ha publicat 110 versions malicioses dels seus 22 paquets npm, sota el seu nom, amb un testimoni que va trobar en el seu CI.

Llegeix l'edició escrita (anglès) ↗

Què cobreix aquest vídeo

  • Un bot, un humà, un cuc
  • Com va passar, per què npm ho va permetre, qui en té la culpa
  • Cronologia: la memòria cau enverinada
  • 21:48 — el "bump" de Dependabot
  • Per què funciona

Transcripció traduïda

Traduït de la narració original en anglès. L'àudio i els subtítols disponibles estan controlats per YouTube.

Un bot, un humà, un cuc

0:00 Un bot obre una sol·licitud d'extracció; un humà la fusiona vint-i-quatre minuts després. Noranta-cinc minuts després, un cuc ha publicat cent deu versions dels seus paquets, com ell. L'anàlisi "postmortem" de TanStack té les marques de temps ascendents, el del mantenidor descendent té la resta, i Hacker News li dóna mil cent punts i un nom: Mini Shai-Hulud. Com passa, per què npm ho permet, qui en té la culpa.

Com va passar, per què npm ho va permetre, qui en té la culpa

0:21 Això és The Daily Diff, "postmortem". 11 de maig, matí. Una bifurcació reanomenada obre una sol·licitud d'extracció contra TanStack Router. Es tanca en menys d'una hora, però un flux de treball de referència ja ha executat el seu codi i

Cronologia: la memòria cau enverinada

0:33 ha guardat una memòria cau enverinada sota la clau que utilitzarà el flux de treball de llançament. Divuit quaranta. Una fusió legítima executa el llançament. La memòria cau torna, un binari llegeix la memòria del "runner", aixeca el testimoni de publicació i envia vuitanta-quatre versions a través de quaranta-dos paquets, amb procedència vàlida. Les proves fallen. Es publica igualment. Divuit quaranta-sis, un investigador de StepSecurity presenta l'incidència; a les nou UTC tot està obsolet i l'avís ha sortit.

0:55 Obsolet no és desaparegut: npm es nega a despublicar qualsevol cosa amb dependents, així que es manté instal·lable durant hores. Vint-i-una quaranta-vuit. En un projecte de dades d'aviació de nou estrelles, Dependabot obre la seva sol·licitud d'extracció rutinària: actualitzar el grup de dependències de desenvolupament, tretze actualitzacions. Dues són versions de TanStack enverinades. Vint-i-dues dotze: fusionat. El flux de treball de publicació executa npm C-I amb el testimoni en

21:48 — el "bump" de Dependabot

1:15 abast; un script de preparació el llegeix, i a les vint-i-dues-disset el cuc publica com ell. Cinc versions de cada paquet al qual arriba el testimoni, fins i tot un antic projecte secundari: un testimoni clàssic per a tot. Cent deu versions en noranta-cinc minuts. S'assabenta per correu electrònic, després de mitjanit. Per què funciona. Un: npm install executa scripts de cicle de vida d'estrangers per defecte, i un script de preparació d'una dependència de git compta.

1:39 Dos: el cuc vol una cosa: un testimoni que publiqui sense un segon factor. Llavors pregunta al registre què més posseeix aquest mantenidor, i ho republica tot amb ell mateix dins. Tres: res de la cadena és una persona.

Per què funciona

1:51 Un bot proposa, una "pipeline" instal·la, i el cuc torna el favor: les seves branques "dead-drop" es diuen dependabot barra inclinada github-actions barra inclinada fremen. git blame. Model d'instal·lació d'npm, cinquanta-cinc per cent: els scripts s'executen a la instal·lació, el que està obsolet es manté instal·lable, existeixen testimonis de salt de doble factor. CI de TanStack, vint-i-cinc: un flux de treball de destinació de sol·licitud d'extracció no auditat que executa codi de bifurcació amb accés d'escriptura a la memòria cau. L'hàbit d'actualitzar, quinze: tretze actualitzacions fusionades en vint-i-quatre minuts, testimoni a la sala.

2:17 Dependabot, cinc: tan confiat que el cuc porta el seu uniforme.

git blame

2:20 Radi de blast: quaranta-dos paquets de TanStack. Vint-i-dos a la baixa, d'un projecte amb nou estrelles. Més de cent seixanta a tot l'ecosistema un cop el cuc arriba a Mistral. Cada versió ascendent portava una signatura vàlida: construïda per l'oficial pipeline. Cert. Veredicte, "postmortem": SHIP IT. Ambdós mantenidors publiquen "postmortems" amb marca de temps en un dia; en tres, la "pipeline" descendent s'instal·la amb ignore-scripts, separa la construcció de la publicació i elimina el testimoni de llarga durada.

Radi de blast

2:47 Els valors predeterminats d'npm no s'han mogut. Dilluns: ignore-scripts a la instal·lació, i el testimoni de publicació fora del treball que l'executa. Envieu-me l'incident del qual encara no se us permet parlar, als comentaris, o a thedailydiff.dev. I això és el "diff" d'avui.

Veredicte

3:00 Sóc en Niko d'Axrisi. Mergeu amb responsabilitat.

Fonts

  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

Vídeos relacionats