Un crate de Rust ejecutó malware en tiempo de compilación. 86 minutos.
Un crate de Rust de cuatro macros con 260 millones de descargas añade una dependencia, y `cargo build` ejecuta un binario desconocido en tu máquina.
Un crate de Rust de cuatro macros con 260 millones de descargas añade una dependencia, y `cargo build` ejecuta un binario desconocido en tu máquina. 20 de agosto de 2026: arrayref 0.3.10 llega a crates.io dependiendo de proc-macro1 — no proc-macro2, el real — cuyo script de compilación descarga una carga útil, la deja en /tmp/rust-setup y la inicia de forma independiente mientras tu proyecto se compila. Las versiones limpias son retiradas para que la propia advertencia de Cargo te guíe a la envenenada. 86 minutos después es eliminada.
Leer la edición escrita (inglés) ↗
Lo que cubre este video
- cargo build ejecuta un binario desconocido
- Los recibos: Rust Blog, SafeDep, Hacker News
- Esto es The Daily Diff, postmortem
- Cronología: 02:11 en preparación → 07:15 publicado → 08:41 eliminado
- Mecanismo: build.rs, sin sandbox, el señuelo de la retirada
Transcripción traducida
Traducido de la narración original en inglés. El audio y los subtítulos disponibles son controlados por YouTube.
cargo build ejecuta un binario desconocido
0:00 Un crate de Rust de cuatro macros con un cuarto de billón de descargas añade una dependencia, y cargo build ejecuta un binario desconocido en tu máquina. 20 de agosto de 2026. arrayref 0.3.10 llega a crates.io dependiendo de proc-macro1. No proc-macro2, el real: un dígito de diferencia, y su script de compilación ejecuta una carga útil mientras tu proyecto se compila. El equipo de seguridad de Rust lo elimina 86 minutos después.
Los recibos: Rust Blog, SafeDep, Hacker News
0:22 SafeDep publica el análisis. Hacker News: 554 puntos. Cómo ocurre, por qué Cargo lo permite y quién tiene la culpa. Esto es The Daily Diff, postmortem. Dos de la mañana, UTC.
Esto es The Daily Diff, postmortem
0:33 Una cuenta llamada d-tolney, una letra diferente a David Tolnay, quien mantiene la mitad de Rust, publica proc-macro1 1.0.106: el verdadero
Cronología: 02:11 en preparación → 07:15 publicado → 08:41 eliminado
0:41 proc-macro2, renombrado. En preparación. 07:11. La versión 1.0.107 añade un script de compilación, además de base64, TLS y un cliente HTTP. Para un analizador de tokens. 07:15. La cuenta del mantenedor republica arrayref como 0.3.10 y retira todas las versiones anteriores. Cargo imprime: considera actualizar a una versión que no ha sido retirada. La única que queda es la envenenada.
1:02 La advertencia es el señuelo. En el mismo minuto, una empresa de seguridad lo reporta a Rust. 07:54, un problema de RustSec. 08:29, un problema en el repositorio; el atacante responde con 0.3.11 y una segunda dependencia maliciosa. 08:41, eliminado. Ochenta y seis minutos. ¿Por qué? Uno: Cargo compila todas las dependencias declaradas, sean llamadas o no. Una línea en el manifiesto es suficiente.
1:21 Dos: un script de compilación se ejecuta en tu máquina, como tú, con tus claves SSH y tu token de
Mecanismo: build.rs, sin sandbox, el señuelo de la retirada
1:26 Cargo, antes de que tu código compile. Sin sandbox, por diseño: así es como los crates encuentran bibliotecas C. Tres: dentro está el verdadero proc-macro2, por lo que la compilación es exitosa. La carga útil: un cliente TLS que confía en cualquier certificado descarga un binario, lo deja en /tmp/rust-setup y lo inicia de forma independiente. En Windows, se desvía a través de wscript para escapar del objeto de trabajo de Cargo; un comentario de código lo dice. La segunda etapa, según el hilo de RustSec: una herramienta de acceso remoto dirigida a
1:52 navegadores y monederos de criptomonedas. Poético, ya que los mayores usuarios de arrayref incluyen secp256k1 y Solana. git blame. El modelo de Cargo, cincuenta y cinco por ciento: las dependencias ejecutan código en tu máquina en tiempo de compilación, sin sandbox, y la advertencia de retirada llevó a la gente al
git blame — la división
2:07 veneno. Una cuenta, treinta: una credencial republica un crate en el que confían un cuarto de billón de descargas. El dígito uno, quince: un tecleo del crate más confiable de Rust, y nadie lee el árbol. Radio de impacto: 2,285 descargas en 86 minutos. Menos del diez por ciento del tráfico, porque la mayoría de los lockfiles tenían 0.3.9. crates.io dice que no hay evidencia de uso.
Radio de impacto: 2,285 descargas
2:27 Dos personas en el hilo de RustSec no están de acuerdo; una encuentra un servicio systemd. En Hacker News, el hilo principal no es sobre el malware. Es la página del crate, donde 0.3.10 ahora nunca existió. Veredicto, postmortem: NEEDS REVIEW. Ochenta y seis minutos para eliminar, una entrada de blog el mismo día, la cuenta bloqueada: esa parte es SHIP IT. Pero la página del crate muestra que no pasó nada, cargo audit permanece en silencio sobre una copia
Veredicto + la línea del lunes
2:48 cacheada, y los scripts de compilación todavía se ejecutan como tú. Lunes: ejecuta el comando de búsqueda del blog de Rust, y trata una advertencia de retirada como una pregunta, no una instrucción. Envíame el incidente del que todavía no tienes permitido hablar, en los comentarios, o en the daily diff dot dev. Y esa es la diferencia por hoy. Soy Niko de Axrisi. Fusiona responsablemente.
Fuentes
- Rust Blog, "Supply chain attack on arrayref" (security-response, Aug 20, 2026)blog.rust-lang.org
- RUSTSEC-2026-0260 (arrayref)github.com
- RustSec issue #3161 (the original report, IOCs, victims)github.com
- SafeDep technical analysissafedep.io
- GitHub issue on the repo (0.3.11 spotted)github.com
- crates.iocrates.io
- Hacker News (554 points)news.ycombinator.com
- BleepingComputerwww.bleepingcomputer.com



