+− THE DAILY DIFFdev & AI news
SHIP IT

Una actualización de Dependabot publicó un gusano. 22 paquetes.

Un bot abre una solicitud de extracción.

Un bot abre una solicitud de extracción. Un humano la fusiona 24 minutos después. 95 minutos después de eso, un gusano ha publicado 110 versiones maliciosas de sus 22 paquetes npm, bajo su nombre, con un token que encontró en su CI.

Leer la edición escrita (inglés) ↗

Lo que cubre este video

  • Un bot, un humano, un gusano
  • Cómo sucedió, por qué npm lo permitió, quién tiene la culpa
  • Cronología: la caché envenenada
  • 21:48 — la actualización de Dependabot
  • Por qué funciona

Transcripción traducida

Traducido de la narración original en inglés. El audio y los subtítulos disponibles son controlados por YouTube.

Un bot, un humano, un gusano

0:00 Un bot abre una solicitud de extracción; un humano la fusiona veinticuatro minutos después. Noventa y cinco minutos después, un gusano ha publicado ciento diez versiones de sus paquetes, como él. El postmortem de TanStack tiene las marcas de tiempo ascendentes, el mantenedor descendente tiene el resto, y Hacker News le da mil cien puntos y un nombre: Mini Shai-Hulud. Cómo sucede, por qué npm lo permite, quién tiene la culpa.

Cómo sucedió, por qué npm lo permitió, quién tiene la culpa

0:21 Esto es The Daily Diff, postmortem. 11 de mayo, mañana. Una bifurcación renombrada abre una solicitud de extracción contra TanStack Router. Se cierra en una hora, pero un flujo de trabajo de evaluación comparativa ya ha ejecutado su código y

Cronología: la caché envenenada

0:33 guardado una caché envenenada bajo la clave que usará el flujo de trabajo de lanzamiento. Diecinueve-veinte. Una fusión legítima ejecuta el lanzamiento. La caché regresa, un binario lee la memoria del corredor, toma el token de publicación y envía ochenta y cuatro versiones en cuarenta y dos paquetes, con procedencia válida. Las pruebas fallan. Publica de todos modos. Diecinueve cuarenta y seis, un investigador de StepSecurity presenta el problema; para las nueve UTC todo está obsoleto y el aviso ha sido emitido.

0:55 Obsoleto no es desaparecido: npm se niega a despublicar cualquier cosa con dependientes, por lo que permanece instalable durante horas. Veintiuno cuarenta y ocho. En un proyecto de datos de aviación de nueve estrellas, Dependabot abre su solicitud de extracción de rutina: actualiza el grupo de dependencias de desarrollo, trece actualizaciones. Dos son versiones envenenadas de TanStack. Veintidós-doce: fusionado. El flujo de trabajo de publicación ejecuta npm C-I con el token en

21:48 — la actualización de Dependabot

1:15 alcance; un script de preparación lo lee, y a las veintidós-diecisiete el gusano publica como él. Cinco versiones de cada paquete al que llega el token, incluso un viejo proyecto paralelo: un token clásico para todo. Ciento diez versiones en noventa y cinco minutos. Se entera por correo electrónico, después de medianoche. Por qué funciona. Uno: npm install ejecuta los scripts del ciclo de vida de extraños por defecto, y el script de preparación de una dependencia de git cuenta.

1:39 Dos: el gusano quiere una cosa: un token que publique sin un segundo factor. Luego le pregunta al registro qué más posee ese mantenedor, y vuelve a publicar todo con él mismo dentro. Tres: nada en la cadena es una persona.

Por qué funciona

1:51 Un bot propone, una tubería instala, y el gusano devuelve el favor: sus ramas de punto de entrega son nombradas dependabot slash github-actions slash fremen. git blame. El modelo de instalación de npm, cincuenta y cinco por ciento: los scripts se ejecutan en la instalación, lo obsoleto permanece instalable, existen tokens de bypass de dos factores. CI de TanStack, veinticinco: un flujo de trabajo objetivo de solicitud de extracción no auditado que ejecuta código bifurcado con acceso de escritura a la caché. El hábito de actualización, quince: trece actualizaciones fusionadas en veinticuatro minutos, token en la sala.

2:17 Dependabot, cinco: tan confiable que el gusano lleva su uniforme.

git blame

2:20 Radio de acción: cuarenta y dos paquetes TanStack. Veintidós descendientes, de un proyecto con nueve estrellas. Más de ciento sesenta en todo el ecosistema una vez que el gusano llega a Mistral. Cada versión ascendente llevaba una firma válida: construida por el oficial tubería. Verdadero. Veredicto, postmortem: SHIP IT. Ambos mantenedores publican postmortems con marca de tiempo en un día; en tres, la tubería descendente se instala con ignore-scripts, separa la construcción de la publicación y elimina el token de larga duración.

Radio de acción

2:47 Los valores predeterminados de npm no se han movido. Lunes: ignore-scripts en la instalación, y el token de publicación fuera del trabajo que lo ejecuta. Envíenme el incidente del que todavía no se les permite hablar, en los comentarios, o en thedailydiff.dev. Y esa es la diferencia de hoy.

Veredicto

3:00 Soy Niko de Axrisi. Fusione responsablemente.

Fuentes

  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

Videos relacionados