Código malicioso en crates de Rust con 245 millones de descargas — y se ejecutaba al compilar, no en runtime
Credenciales comprometidas de un mantenedor publicaron versiones envenenadas de arrayref, internment y append-only-vec en crates.io, conectadas a una dependencia typosquat llamada proc-macro1 que ejecutaba malware durante cargo build. Esto es exactamente lo que debes revisar y qué versiones evitar.
Tres crates de Rust muy utilizados distribuyeron malware en crates.io el 20 de agosto: arrayref 0.3.10, internment 0.8.7 y append-only-vec 0.1.9. Las tres versiones salieron de la cuenta comprometida del mantenedor David Roundy — usuario de crates.io desde octubre de 2009 — y solo arrayref acumula unos 245 millones de descargas históricas. El equipo de respuesta de seguridad de Rust recibió el aviso a las 07:15 UTC y retiró los paquetes rápido: las versiones maliciosas estuvieron en línea entre 86 y 107 minutos.
Lo que hace notable este ataque es el mecanismo de entrega. Las versiones envenenadas añadían una dependencia llamada proc-macro1, un typosquat del omnipresente proc-macro2. Su build script reconstruía la dirección del servidor de mando y control a partir de fragmentos en base64, desactivaba la validación de certificados TLS, elegía un payload según tu sistema operativo y arquitectura de CPU, y lo ejecutaba durante cargo build, cargo check o cargo test. No hacía falta llamar a una sola función del crate infectado. Bastaba con compilarlo — lo que pone en el radar a los runners de CI, los portátiles de desarrollo y a cualquiera que use cargo install.
El implante de segunda fase persistía mediante claves Run del registro en Windows, LaunchAgents en macOS y servicios de usuario de systemd en Linux. Según los investigadores de Wiz, roba credenciales de navegador de Chrome, Brave y Edge consultando sus bases de datos SQLite de inicios de sesión. Wiz también encontró un “solapamiento sustancial” con operaciones norcoreanas previas contra la cadena de suministro, incluidos los ataques a Mastra en npm y a axios — aunque ningún proveedor ha atribuido formalmente el incidente a un actor concreto.
El equipo de seguridad de Rust fue explícito en que Roundy es víctima, no autor: “No creemos que el autor de arrayref actuara con malicia, pero su equipo o sus credenciales están probablemente comprometidos”.
Qué hacer, en concreto:
- Revisa tu caché local. Busca en
~/.cargo/registry/cachearrayref 0.3.10, internment 0.8.7 o append-only-vec 0.1.9. Si aparece alguna, trata la máquina como comprometida: rota credenciales y revisa los mecanismos de persistencia de arriba. - Audita los logs de CI en busca de builds entre las 05:30 y las 09:00 UTC del 20 de agosto que resolvieran versiones recién publicadas de estos crates.
- Fija arrayref en 0.3.9 o anterior hasta que llegue una versión limpia.
El apunte estructural incómodo: Cargo no tiene un equivalente al periodo de enfriamiento de npm, que retrasa la resolución automática de versiones recién publicadas. Una respuesta en 90 minutos es genuinamente buena — y aun así no bastó para evitar que builds recientes descargaran el veneno. Hasta que el ecosistema incorpore una ventana de retardo o la atestación obligatoria de publicaciones, “comprometer el portátil de un mantenedor” seguirá siendo un ataque viable contra una cadena de dependencias con un cuarto de billón de descargas.
Fuentes
Lecturas relacionadas
- Ciberseguridad RCE en Gitea explotado activamente: CVE-2026-60004 permite ejecutar comandos con solo acceso de escritura — actualiza ya a 1.27.1
- Ciberseguridad 'Agentjacking': Un Reporte de Error Falso en Sentry Puede Secuestrar tu Agente de Código IA
- Ciberseguridad CVE-2026-48710: 'BadHost' en Starlette expone millones de APIs de IA a bypass de autenticación