Bitácora — entrada 02

Evangelizando la Mentira Correcta

Ilustración blueprint gótico dorado sobre negro: una cadena mecánica rota con los logos de Rust y Python integrados como piezas de engranaje, un hilo binario rojo goteando desde la fractura
Cadena mecánica rota entre un eslabón con logo de Rust y otro con logo de Python, representando la fractura de la cadena de suministro en el proceso de build.
- Predican Seguridad y Construimos con Mierda -

Compilar antes era control total sobre lo que corría en tu máquina. Hoy es fe ciega en desconocidos con acceso root, y lo venden como "Seguridad y Progreso" cuando el anterior Modus operandi debería seguir siendo la puta línea roja, no la nostalgia del abuelo.

"Que el binario final sea seguro no significa una mierda si el proceso que lo parió está comprometido."

La industria lleva años invirtiendo en que el ejecutable no tenga buffer overflows, use-after-free, data races. Bien. Mientras tanto nadie audita qué scripts de desconocidos se ejecutan con tus privilegios cada vez que compilas. El auditor marca la casilla "sin vulnerabilidades de memoria" y se va a comer. Al becario que acaba de instalar la dependencia nadie le pregunta de dónde coño la sacó.

Es una causa formal disfrazada de causa final: el ecosistema te vende la forma del artefacto (type-safe, memory-safe) como si fuera la finalidad completa del sistema, cuando la finalidad real —que lo que se ejecuta en tu máquina sea confiable— depende de una causa eficiente que nadie está mirando: el propio proceso de build...

Puedes tener el binario más seguro del mundo y a la vez haber firmado con tus credenciales de root la ejecución de cien scripts que nunca leíste. (Facepalm)

El mismo cuento, tres veces

Python vendió "baterías incluidas" y nunca resolvió su infierno de packaging, solo lo maquilló cuatro veces distintas. Node.js vendió "un lenguaje para todo" y regaló postinstall como vector de malware a escala industrial, cortesía de un ejército de junior, contratados por baratos, que copian-pegan de Stack Overflow sin leer una línea. Ahora Rust vende "memory safety elimina toda una clase de bugs" mientras build.rs y las macros procedurales ejecutan lo que les salga de los huevos en tu máquina, y rust-analyzer las expande solo con abrir el proyecto en el editor. Ni hace falta compilar. No seas gilipollas, abre los ojos: basta con tener curiosidad.

Cada oleada, el mismo guion: evangelista con charla en conferencia pagada por la fundación, adopción corporativa en masa porque contratar es más barato que auditar, y el mismo agujero de siempre con maquillaje nuevo y un logo más bonito.

A un verdadero profesional, a uno que ama su profesión, esto le tiene que oler a mierda a la legua, porque ya lo vio con Python y con npm, y sabe reconocer un patrón cuando se repite por tercera vez con el mismo desenlace. Pero nadie señala el elefante porque señalarlo no vende: el vendor "auditamos tu build" no vende, vende "cambia de lenguaje y duerme tranquilo" —y esa mentira financia sueldos, conferencias, y contratos enterprise. El silencio no es ignorancia, es modelo de negocio. El día que RustSec o crates.io admitan en portada que no escanean malware en upload, se acaba la fiesta de la narrativa y empieza el trabajo real de auditar, que es lento, aburrido, y no cabe en una keynote de veinte minutos.

¿A quién le importa esto?

--> Al sysadmin de CI/CD que descubre que cargo build lleva seis meses filtrando secretos y se pregunta cómo coño se lo va a explicar al comité de seguridad.

--> Al dev que audita un árbol de 400 dependencias transitivas, ninguna revisada, y se da cuenta de que "confiar en la comunidad" es la misma frase que usaba el que le vendió humo en 2015.

--> Al auditor que firma el binario, jamás pregunta cómo se construyó, y luego se sorprende cuando el incidente sale en el CVE feed con su nombre debajo.

--> Al CTO que migró a Rust "porque es seguro", no tiene ni puta idea de qué hace build.rs, y se cree protegido porque lo leyó un ponente en una diapositiva con luces de neón.

--> Al Friki del homelab. Al Nerd. Al Prepper tecnológico. Al Rarito de la autosoberanía digital... A todos esos que llevan años evangelizando la soberanía tecnológica, tienen un clúster de Kubernetes en el garaje, un NAS con ECC y tres UPS redundantes. A esos que abandonaron la nube "por seguridad", cifran hasta la lista de la compra y se creen inmunes porque todo lo alojan ellos... Los mismos que luego compilan cualquier repo con más de 3.000 estrellas en GitHub, ejecutan build.rs de desconocidos con permisos sobre toda su red doméstica y descubren que la cadena de suministro enmierda también llega hasta el rack del trastero. Porque la única amenaza nunca fue Google.

Si no eres ninguno de estos, probablemente seas parte del problema y aún no lo sabes — o peor, lo sabes y prefieres no mirar, porque mirar significa auditar 400 crates a mano y eso no cabe en el planning.

Y luego está el otro perfil, el que de verdad me toca los cojones: el fanboy de turno que ha convertido el lenguaje en secta. Al que le enseñas un CVE documentado con fuente y advisory, y en vez de auditar su Cargo.lock te suelta que "eso es FUD" o que "eso ya está arreglado en nightly". Ese no tiene argumento, tiene fe. Y la fe no se refuta con datos porque no fue construida con datos —se construyó con marketing, con una charla bonita y con la necesidad de sentirse parte del bando ganador. A ese no le hablo...

Le hablo al que todavía es capaz de leer un advisory y cambiar de opinión si el dato lo justifica, que es la única línea roja que de verdad importa aquí: la que separa a quien audita de quien reza... ¿Eres tú?

Cómo lo haría "Papi" Occam (tras hablar con "Tito" Faraday)

Sin épica, sin auditoría de 400 crates a mano, sin joderte el planning.

No vengo a decirte que dejes Rust, Node o Python. Vengo a decirte que si vas a seguir jugando con fuego, al menos ponte condón.

Esto no es una checklist de compliance — es lo mínimo para que un build.rs comprometido no se folle tu ~/.ssh mientras tú miras tutoriales en YouTube.

  1. El build no toca red, y punto.

    docker run --network none --read-only -v $(pwd):/src:ro. Si tu dependencia necesita internet para compilar, ya tienes la primera señal de alarma y ni siquiera has llegado al build.rs. Cero coste, una línea.

  2. Lockfile committeado y --frozen/--locked en CI, siempre.

    Cargo.lock, package-lock.json, poetry.lock. Si no fijas hash, cada build es una tómbola. Esto no es opcional.

  3. --ignore-scripts en npm por defecto.

    Actívalo dependencia a dependencia solo cuando de verdad lo necesites, no porque npm install te lo pida amablemente. Pero ojo: git deps siguen ejecutándose y un .npmrc malicioso redirige el binario. En Rust no hay flag mágico — cargo-deny lista build.rs pero no audita su interior, y cargo-vet es registro manual. La única estrategia que frena un build.rs malicioso: vuelve al punto 1. Que falle el pipeline, no que falle tu sistema.

  4. Usuario de build desechable, sin sudo, sin secretos.

    Si el contenedor se compromete, lo matas y no se llevó nada. Kubernetes 101 aplicado a tu toolchain.

  5. SBOM automático en el pipeline.

    cargo-cyclonedx, npm sbom metidos en el mismo flujo. Se genera solo mientras compila.

  6. rust-analyzer y compañía: el editor no es tu guardia de seguridad.

    No existe "modo ajeno" que desactive proc macros automáticamente. El peligro no es la expansión de macros, es el código arbitrario que ejecutan. Un becario que clona el repo del cliente y abre VS Code sin pensar sigue siendo tu vector de entrada gratis. Sandbox o nada — y el sandbox es el punto 1, no una config del editor.

Nada de esto te obliga a auditar dependencia a dependencia. La idea es que el proceso de build deje de tener las llaves de tu casa.

Esto no es nuevo: es el mismo Defense-In-Depth que aplicas en producción, solo que nadie te lo enseñó para el build.

No hace falta fe. Como diría "Tito" Faraday: ¡Hace falta una jaula!

Pónla de una puta vez, idiota.

No me creas. Rompe las fuentes.

Todo lo que has leído aquí es lo cagado tras digerir todos estos datos públicos, informes oficiales y CVEs documentados. No es opinión, no es fe, no es "vibe"... Si tras esto sigues compilando como si crates.io fuera la comunidad del pesebre, el problema ya no es la industria: eres tú.

Pincha, lee, saca tus propias conclusiones. O sigue siendo el becario que instala sin leer.

Fuentes — audita tú mismo
Si tras leer esto sigues sin auditar tu build, no eres un profesional. Eres un creyente. Y los creyentes no necesitan argumentos, necesitan pastores. Yo no soy pastor. Soy el tío que te dice que el pastor cobra y defiende sus propios intereses.
volver a [Bitácora]