
Hoy desperté con un mensaje en el canal de Rust que me heló la sangre. Un crate llamado proc-macro1, subido a crates.io esta madrugada, estaba ejecutando un payload malicioso durante el build de proyectos enteros. Como si eso fuera poco, descubrieron que la librerÃa arrayref — usada por miles de proyectos en producción — habÃa sido republicada con una dependencia oculta hacia ese crate malicioso.
El ataque que no duró ni una pelÃcula
Según el reporte oficial del Rust Security Response Team, la versión arrayref@0.3.10 estuvo online solo 86 minutos. Parece poco, pero en el mundo de los sistemas de CI/CD es una eternidad. Cuantos builds corrieron en ese lapso? Cuantos desarrolladores ejecutaron cargo build sin sospechar que estaban descargando malware?
El atacante no solo subió un crate nuevo. Se las arregló para comprometer la cuenta del autor original de arrayref, internment y append-only-vec. Eso es lo más turbio: no fue una cuenta fake con nombre raro. Fue una cuenta legÃtima, con historia, con reputación. El equipo de seguridad de Rust no cree que el autor sea malicioso, sino que su computadora o credenciales fueron comprometidas.
Y eso me pone más nervioso que un ataque directo. Porque si el tipo que mantiene una librerÃa popular puede ser vÃctima, cualquiera de nosotros puede serlo.
Los crates que hay que revisar
El equipo de Rust borró estas versiones de crates.io, pero si tu máquina ya las descargó, el daño puede estar hecho:
arrayref@0.3.10(86 minutos online)append-only-vec@0.1.9(107 minutos online)internment@0.8.7(90 minutos online)proc-macro1,proc-macro-en,aovine,arone,aronenao,tinymember(cualquier versión)
Si usas Rust, revisa tu carpeta ~/.cargo/registry/cache. Es caleta, pero puede salvarte.
Mi opinión: esto es solo la punta del iceberg
Yo trabajo con sistemas todos los dÃas y la verdad es que confiamos ciegamente en registries de paquetes. npm, PyPI, crates.io, RubyGems… todos tienen el mismo problema: cualquiera puede publicar una nueva versión y tu pipeline la descarga y ejecuta sin preguntar. En Rust el riesgo es aún mayor porque los build.rs corren código nativo en tu máquina durante la compilación.
Hace un tiempo ya habÃa visto ataques similares en npm y PyPI, pero verlo en Rust duele distinto. Rust se jacta de ser seguro por diseño, de evitar memory leaks y race conditions. Pero la cadena de suministro no la protege el borrow checker. La protege un login y una contraseña que, evidentemente, no son suficientes.
Creo que es hora de que los ecosistemas open source implementen firma de paquetes obligatoria, reproducible builds por defecto y alertas inmediatas cuando un mantenedor publica algo fuera de horario. No es paranoia: es sobrevivencia.
Hoy fue arrayref. Mañana puede ser tu librerÃa favorita. Y probablemente ni te darás cuenta.
Fuente de inspiración: Supply chain attack on arrayref — Rust Blog