+− THE DAILY DIFFdev & AI news
SHIP IT

Unha actualización de Dependabot publicou un° verme. 22 paquetes.

Un bot abre unha solicitude de «pull».

Un bot abre unha solicitude de «pull». Un humano fusiónaa 24 minutos despois. 95 minutos despois diso, un verme publicou 110 versións maliciosas dos seus 22 paquetes npm, baixo o seu nome, cun token que atopou no seu CI.

Ler a edición escrita (inglés) ↗

Que abrangue este vídeo

  • Un bot, un humano, un verme
  • Como pasou, por que npm o permitiu, quen ten a culpa
  • Cronoloxía: a caché envelenada
  • 21:48 — a actualización de Dependabot
  • Por que funciona

Transcrición traducida

Traducido da narración orixinal en inglés. O audio e os subtítulos dispoñibles son controlados por YouTube.

Un bot, un humano, un verme

0:00 Un bot abre unha solicitude de extracción; un humano fúsioa vinte e catro minutos despois. Noventa e cinco minutos despois, un verme publicou cento dez versións dos seus paquetes, coma el. O análise post-mortem de TanStack ten as marcas de tempo iniciais, o mantedor secundario ten o resto, e Hacker News dálle mil cen puntos e un nome: Mini Shai-Hulud. Como acontece, por que npm o permite, quen ten a culpa.

Como pasou, por que npm o permitiu, quen ten a culpa

0:21 Este é The Daily Diff, post-mortem. 11 de maio, pola mañá. Unha bifurcación renomeada abre unha solicitude de extracción contra TanStack Router. Pechase antes da hora, pero un fluxo de traballo de «benchmark» xa executou o seu código e

Cronoloxía: a caché envelenada

0:33 gardou unha caché envelenada baixo a chave que usará o fluxo de traballo de «release». Dezanove e vinte. Unha fusión lexítima executa a versión. A caché volve, un binario le a memoria do «runner», toma o token de publicación e envía oitenta e catro versións a través de corenta e dous paquetes, con procedencia válida. As probas fallan. Publica igual. Dezanove corenta e seis, un investigador de StepSecurity presenta o problema; ás nove UTC todo está obsoleto e o aviso sae.

0:55 Obsoleto non é eliminado: npm rexeita despublicar calquera cousa con dependentes, polo que permanece instalable durante horas. Vinte e un corenta e oito. Nun proxecto de datos de aviación de nove estrelas, Dependabot abre a súa solicitude de extracción rutineira: actualizar o grupo de dependencias de desenvolvemento, trece actualizacións. Dúas son versións envelenadas de TanStack. Vinte e dous e doce: fusionado. O fluxo de traballo de publicación executa npm C-I co token en

21:48 — a actualización de Dependabot

1:15 alcance; un script de preparación leo, e ás vinte e dous e dezasete o verme publica coma el. Cinco versións de cada paquete ao que chega o token, mesmo un vello proxecto paralelo: un token clásico para todo. Cento dez versións en noventa e cinco minutos. Descúbreo por correo electrónico, despois da medianoite. Por que funciona. Un: npm install executa os scripts de ciclo de vida de estraños por defecto, e un script de preparación dunha dependencia git conta.

1:39 Dous: o verme quere unha cousa: un token que publique sen un segundo factor. Logo pregúntalle ao rexistro que máis posúe ese mantedor, e republica todo con el mesmo dentro. Tres: nada na cadea é unha persoa.

Por que funciona

1:51 Un bot propón, un «pipeline» instala, e o verme devolve o favor: os seus ramos de «dead-drop» chámanse dependabot slash github-actions slash fremen. git blame. O modelo de instalación de npm, cincuenta e cinco por cento: os scripts execútanse na instalación, o obsoleto permanece instalable, existen tokens de «bypass» de dous factores. CI de TanStack, vinte e cinco: un fluxo de traballo de «pull request target» non auditado que executa código bifurcado con acceso de escritura á caché. O hábito de actualización, quince: trece actualizacións fusionadas en vinte e catro minutos, token na sala.

2:17 Dependabot, cinco: tan confiable que o verme viste o seu uniforme.

git blame

2:20 Radio de explosión: corenta e dous paquetes TanStack. Vinte e dous «downstream», dun proxecto con nove estrelas. Máis de cento sesenta en todo o ecosistema unha vez que o verme chega a Mistral. Cada versión anterior levaba unha sinatura válida: construída polo oficial pipeline. Certo. Veredicto, post-mortem: SHIP IT. Ambos mantedores publican análises post-mortem con marca de tempo nun día; en tres, o «pipeline downstream» instala con ignore-scripts, divide a construción da publicación e elimina o token de longa duración.

Radio de explosión

2:47 Os valores predeterminados de npm non se moveron. Luns: ignore-scripts na instalación, e o token de publicación fóra do traballo que o executa. Envíame o incidente do que aínda non se che permite falar, nos comentarios, ou en thedailydiff.dev. E esa é a diferenza de hoxe.

Veredicto

3:00 Son Niko de Axrisi. Fusión responsable.

Fontes

  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 relacionados