SafeDep dice que una versión envenenada de arrayref ejecutó malware durante compilaciones de Rust

SafeDep documentó un compromiso el 20 de agosto en el que arrayref 0.3.10 descargó una dependencia typosquatting que ejecutó un binario remoto durante la compilación, antes de que crates.io eliminara los paquetes maliciosos.

By · Published

Primary source: SafeDep

Why it matters

The attack abused Cargo's normal build process, showing why dependency security is moving from advisory feeds to controls that block packages before their scripts execute.

A vast digital landscape with a glowing, corrupted data package named 'arrayref' emitting tendrils of code, with a small human figure observing in the distance.

SafeDep, la startup de seguridad de la cadena de suministro cofundada por Abhisek Datta (@abh1sek), informó el 20 de agosto de 2026 que una versión comprometida del ampliamente usado crate de Rust arrayref descargó y ejecutó malware durante la compilación. El equipo de crates.io eliminó posteriormente los paquetes maliciosos, según SafeDep. (safedep.io)

El ataque convirtió una compilación ordinaria de Cargo en el mecanismo de entrega. arrayref versión 0.3.10 añadió una dependencia en proc-macro1, un paquete que suplantaba al legítimo proc-macro2. Cargo compiló automáticamente esa dependencia, lo que provocó que su script build.rs obtuviera y lanzara un binario desde un servidor remoto. Un desarrollador solo tenía que compilar un proyecto cuya resolución de dependencias seleccionara la versión envenenada.

Para Datta, el caso cae directamente dentro del problema en el que ha trabajado durante su carrera. Su biografía pública describe trabajos anteriores en investigación de vulnerabilidades, ingeniería inversa y análisis de malware, seguidos por la fundación de la consultora de seguridad 3S Labs y la dirección tecnológica en Appsecco. SafeDep ahora empaqueta esa experiencia en productos destinados a inspeccionar dependencias antes de que lleguen a laptops, repositorios, agentes de código o sistemas de CI, incluido el monitor de paquetes de código abierto de SafeDep. (abhisek.github.io)

A same-day package chain

El 20 de agosto de 2026, SafeDep dice que el malicioso proc-macro1 1.0.107 y la aparentemente comprometida cuenta droundy con arrayref 0.3.10 aparecieron en crates.io. El informe de RustSec identifica ambos paquetes como parte de la campaña.

La suplantación se apoyó en nombres que parecían razonables durante una revisión de dependencias apresurada. La cuenta del publicador dtolney difiere por una letra de dtolnay, la cuenta usada por el mantenedor de Rust David Tolnay (@dtolnay). Los metadatos del paquete listaron falsamente a Tolnay como autor y señalaron a un repositorio inexistente en su cuenta de GitHub. La evidencia disponible identifica a Tolnay como el objetivo de la suplantación, sin indicios de que él participara en la publicación.

El paquete malicioso también copió el código fuente del real proc-macro2. Esa elección mantuvo los builds dependientes funcionando con normalidad mientras el script de compilación añadido actuaba en segundo plano. SafeDep encontró que arrayref en sí conservó su familiar implementación de macros; el cambio importante fue una única entrada de dependencia en Cargo.toml. Las compilaciones de Cargo declaran dependencias no opcionales incluso cuando el crate padre nunca las invoca. (safedep.io)

La tabla de paquetes de SafeDep clasifica todas las versiones de proc-macro1 como un typosquat malicioso y dice que todo el crate fue eliminado. Su análisis técnico identifica la versión 1.0.107 como la que contiene el descargador y publica hashes para las versiones 1.0.106 y 1.0.107. (safedep.io)

The payload detached from the build

El script de compilación de proc-macro1 reconstruyó la dirección de su servidor a partir de fragmentos base64, evitando una URL claramente visible en el código fuente. El script descarga un binario específico de la arquitectura sobre TLS y luego lo lanza separado de la compilación. En Unix escribe y ejecuta /tmp/rust-setup. En Windows crea lanzadores de PowerShell y VBScript en el directorio temporal, los inicia ocultos y abandona el proceso hijo para que el compilador no espere por él. (safedep.io)

SafeDep publicó los hashes de archivos asociados y dos indicadores de red: el host ofuscado 23[.]254[.]165[.]112 en los puertos 9089 y 443. Su análisis establece cómo se ejecutó el descargador. No establece qué hizo la carga útil de segunda etapa después del lanzamiento ni cuántos sistemas la ejecutaron.

Los equipos cuyas compilaciones del 20 de agosto resolvieron arrayref 0.3.10 deberían buscar en lockfiles y registros de compilación esa versión exacta y proc-macro1 1.0.107. También se deben revisar los hosts de compilación en busca de /tmp/rust-setup en Unix, rust-setup.ps1 y rust-setup-launch.vbs en Windows, y conexiones a los indicadores de red publicados. Una compilación exitosa no limpia el equipo; el código de la librería copiada fue diseñado para permitir que los builds tuvieran éxito.

Yanking the safe releases created the lure

La cuenta que controla arrayref marcó como yanked las versiones 0.3.5 a 0.3.9, según SafeDep y el informe de RustSec. Cargo avisa a los usuarios cuando una versión seleccionada ha sido yanked y sugiere moverse a una que permanezca disponible. En ese momento, ese camino apuntaba hacia la 0.3.10. La persona que reportó el paquete dijo que la advertencia fue lo que condujo a la versión envenenada. (github.com)

Esa maniobra explotó la confianza del desarrollador en un paquete real en lugar de esperar a que alguien escribiera mal el nombre de una dependencia. arrayref aparece profundamente en los grafos de dependencias de GUI de Rust a través de paquetes como tiny-skia, sctk-adwaita y winit, colocándolo debajo de frameworks como egui, eframe e iced.

SafeDep contabilizó alrededor de 245 millones de descargas totales para arrayref, incluyendo aproximadamente 152 millones para la release limpia 0.3.9. Esos números miden años de uso. No contabilizan las máquinas expuestas a la 0.3.10. El denominador relevante es el número de resoluciones de dependencias y compilaciones completadas durante la ventana de disponibilidad de la versión maliciosa, cifra que el análisis publicado no proporciona. (safedep.io)

Datta's pre-install bet gets another test

Datta está construyendo SafeDep alrededor del criterio de que la seguridad de paquetes debe adelantarse a la ejecución. SafeDep dice que su firewall de paquetes puede situarse entre los registros públicos y las máquinas de desarrolladores, los runners de CI o los agentes de codificación de IA, bloqueando una dependencia antes de una instalación o de que se ejecute un script de compilación. SafeDep también mantiene herramientas de código abierto para la revisión de dependencias y la intercepción de paquetes. Esas son afirmaciones de la compañía sobre los controles de SafeDep, más que evidencia de que su software bloqueó este incidente específico en Rust. (safedep.io)

Competidores venden controles en el mismo punto de aplicación. Endor Labs introduced Package Firewall en mayo, mientras que Socket announced a $60 million Series C at a $1 billion valuation amplió sus propios productos de análisis comportamental de paquetes y bloqueo.

El compromiso de arrayref lleva el argumento de SafeDep sobre la pre-ejecución a Rust: la reputación del paquete y una compilación de aplicación limpia ofrecen poca protección cuando los atacantes pueden publicar código que se ejecuta antes de que la aplicación exista.

La campaña combinó una aparentemente comprometida cuenta de mantenedor droundy con una cuenta de suplantación separada dtolney, usando un paquete confiable y una dependencia verosímil para introducir código en los builds de Cargo. La apuesta de Datta es que los desarrolladores pagarán por un control capaz de tomar una decisión antes de que ese código se ejecute.

Reader comments

Conversation for this story loads after sign-in.