Las compilaciones reproducibles (la propiedad de que un proceso de compilación produzca una salida idéntica bit a bit a partir de las mismas entradas de código fuente cuando se ejecuta en un entorno de compilación definido) proporcionan la base técnica para verificar de forma independiente que los artefactos de software distribuidos coinciden con el código fuente a partir del cual afirman haberse compilado. Cuando una compilación es reproducible, cualquier parte con acceso al código fuente y a la especificación del entorno de compilación puede recompilar el artefacto y verificar que su reproducción coincide con la versión distribuida. Cuando no es reproducible, hay que confiar en el artefacto distribuido sobre la base de la integridad del canal de distribución, sin ningún mecanismo técnico de verificación independiente.
El problema de la falta de reproducibilidad tiene varias causas, la mayoría de las cuales no son fallas de seguridad en sí mismas, sino decisiones de ingeniería que introducen variabilidad de forma involuntaria. Las marcas de tiempo incrustadas en los artefactos de compilación (marcas de tiempo de compilación, fechas de creación de archivos comprimidos) difieren entre compilaciones realizadas en momentos distintos. Los identificadores de versión o los metadatos de compilación que incluyen el nombre de host, la ruta o el nombre de usuario del entorno de compilación difieren entre entornos de compilación. El orden del contenido de los directorios al crear archivos comprimidos puede depender del sistema de archivos en lugar de ser determinista. La generación de números aleatorios durante la configuración de la compilación puede producir salidas distintas en ejecuciones distintas. Nada de esto introduce vulnerabilidades por sí mismo, pero impide verificar de forma independiente que el binario distribuido coincide con el código fuente.
La implicación de la falta de reproducibilidad para la seguridad de la cadena de suministro es que el compromiso de la infraestructura de distribución (la sustitución de un binario legítimo por uno malicioso en el registro de artefactos) no puede detectarse mediante la comparación del código fuente. Un binario que difiere de una recompilación limpia del código fuente podría no ser reproducible debido a una variabilidad benigna de la compilación, o podría contener código malicioso inyectado. Sin reproducibilidad, ambos casos son indistinguibles mediante comparación técnica. Con reproducibilidad, un binario que no coincide con una recompilación limpia es definitivamente anómalo y justifica una investigación.
Por qué es importante
Las compilaciones reproducibles son importantes para TPRM porque son el requisito técnico previo para verificar de forma independiente la procedencia del software a nivel de binario. En los despliegues de software de mayor criticidad (dispositivos de seguridad de red, bibliotecas criptográficas, infraestructura de autenticación), la imposibilidad de verificar de forma independiente que el binario distribuido coincide con el código fuente publicado representa un riesgo de la cadena de suministro no verificable que debe aceptarse por confianza y no por garantía técnica.
- Reproducibilidad no evaluada en los proveedores de software crítico
- Ausencia de verificación de la procedencia de los binarios: la coincidencia entre código fuente y binario no puede verificarse
- Detección del compromiso de la distribución imposible sin reproducibilidad
- Verificación del software crítico limitada a la firma en lugar de la coincidencia con el código fuente
- No se solicita una hoja de ruta de reproducibilidad a los proveedores no reproducibles
Cómo se ve una buena práctica
Los programas maduros de reproducibilidad identifican el estado de reproducibilidad de los proveedores de software crítico, solicitan hojas de ruta de reproducibilidad a los proveedores cuyas compilaciones no son reproducibles y, en el software de mayor criticidad, realizan una verificación por recompilación: recompilan de forma independiente a partir del código fuente y comparan el resultado con el artefacto distribuido.
- Evaluación del estado de reproducibilidad del software crítico
- Hoja de ruta de reproducibilidad de los proveedores críticos no reproducibles
- Verificación por recompilación del software de mayor criticidad
- Participación en el proyecto Reproducible Builds como señal de calidad
- La reproducibilidad como garantía de la cadena de suministro junto con la procedencia SLSA
Herramientas
Reproducibilidad: proyecto Reproducible Builds (reproducible-builds.org); rebuilderd para la verificación automatizada por recompilación
El proyecto Reproducible Builds mantiene una infraestructura para verificar la reproducibilidad en las principales distribuciones de Linux y ecosistemas de paquetes. Rebuilderd es un recompilador de software distribuido que recompila paquetes de forma independiente y compara los resultados con los binarios distribuidos. Para los profesionales de TPRM, comprobar si los paquetes de un proveedor crítico figuran en el seguimiento del proyecto Reproducible Builds aporta un dato sobre el estado de reproducibilidad procedente de una fuente independiente.
Desafíos de gobernanza
El desafío de gobernanza de las compilaciones reproducibles es la inversión de ingeniería necesaria. Lograr la reproducibilidad exige corregir el manejo de las marcas de tiempo, eliminar las rutas de las salidas de compilación y abordar otras fuentes de variabilidad de la compilación, un esfuerzo de ingeniería acotado pero no trivial. Para los programas de TPRM, el enfoque práctico es priorizar los requisitos de reproducibilidad para las categorías de software de mayor criticidad (bibliotecas criptográficas, software de seguridad de red, infraestructura de autenticación) en lugar de exigirla de forma universal.
- Priorice la evaluación de la reproducibilidad del software de mayor criticidad
- Solicite una hoja de ruta de reproducibilidad a los proveedores críticos cuyas compilaciones no son reproducibles
- Consulte el estado de los paquetes del proveedor en el proyecto Reproducible Builds
- Realice una verificación por recompilación en los despliegues críticos cuando las herramientas lo permitan
- Pondere la reproducibilidad en los criterios de adquisición de software crítico
Si usted forma parte de un equipo pequeño
Para sus proveedores de bibliotecas criptográficas, software de seguridad de red e infraestructura de autenticación, consulte reproducible-builds.org para conocer su estado de reproducibilidad. Ese sitio web hace seguimiento de la reproducibilidad en las principales distribuciones y ecosistemas de paquetes. Para los paquetes que no aparecen, pregunte directamente al proveedor: ¿su proceso de compilación está diseñado para ser reproducible y puede proporcionar la especificación del entorno de compilación que permitiría a un tercero independiente verificar que su recompilación coincide con el artefacto distribuido?
- Consulte reproducible-builds.org para los paquetes de los proveedores de software crítico
- Pida una hoja de ruta de reproducibilidad a los proveedores cuyas compilaciones no son reproducibles
- Solicite la especificación del entorno de compilación para la verificación independiente
- Pondere la reproducibilidad en los criterios de selección de software crítico
Qué exigir
Pregunte directamente:
“¿Está diseñado su proceso de compilación para producir artefactos reproducibles? ¿Puede proporcionar la especificación del entorno de compilación y el commit del código fuente que permitirían a una parte independiente recompilar el artefacto y verificar que coincide con su binario distribuido?”
Evidencia que debe esperar
- Confirmación de la reproducibilidad u hoja de ruta para lograrla
- Especificación del entorno de compilación
- Referencia al commit del código fuente de los artefactos distribuidos
- Participación en el proyecto Reproducible Builds o equivalente
A un proveedor que confirma la seguridad de su cadena de suministro se le debe preguntar por la reproducibilidad. La reproducibilidad es la base técnica de la verificación independiente. Sin ella, la procedencia de los binarios debe aceptarse basándose únicamente en la confianza en la infraestructura de distribución.
Cómo demostrarlo
- Evaluación del estado de reproducibilidad del software crítico
- Hoja de ruta de reproducibilidad para los proveedores críticos cuyas compilaciones no son reproducibles
- Registros de verificación por recompilación, cuando se haya realizado
- Reproducibilidad en los criterios de adquisición de software crítico
Conclusión clave
500 paquetes. 312 reproducibles. 188: el mismo código fuente produce binarios distintos. En el caso de los 188, el artefacto distribuido no puede verificarse de forma independiente frente al código fuente. Un compromiso de la infraestructura de distribución sustituye un binario distinto, pero el binario ya era distinto de una compilación limpia del código fuente debido a una variabilidad benigna. Lo reproducible y lo no reproducible son técnicamente indistinguibles de lo comprometido cuando el binario difiere del código fuente de la manera esperada. La reproducibilidad elimina la variabilidad benigna, lo que permite detectar el compromiso de la distribución mediante la comparación de binarios. En el software de mayor criticidad (infraestructura criptográfica, seguridad de red), la verificación independiente mediante la reproducibilidad es la garantía técnica en la que se apoyan las atestaciones de procedencia.