La compilación reproducible , también conocida como compilación determinista , es un proceso de compilación de software que garantiza que el código binario resultante pueda reproducirse . El código fuente compilado mediante compilación determinista siempre generará el mismo binario. [1] [2] [3]
Las compilaciones reproducibles pueden actuar como parte de una cadena de confianza ; [1] el código fuente puede firmarse y la compilación determinista puede probar que el binario se compiló a partir de un código fuente confiable. Las compilaciones reproducibles verificadas proporcionan una contramedida sólida contra los ataques en los que los binarios no coinciden con su código fuente, por ejemplo, porque un atacante ha insertado código malicioso en un binario. Este es un ataque relevante; los atacantes a veces atacan binarios pero no el código fuente, por ejemplo, porque solo pueden cambiar el binario distribuido o para evadir la detección ya que es el código fuente que los desarrolladores normalmente revisan y modifican. En una encuesta a 17 expertos, las compilaciones reproducibles tuvieron una calificación de utilidad muy alta del 58,8% de los participantes, pero también una calificación de alto costo del 70,6%. [4] Se están realizando varios esfuerzos para modificar las herramientas de desarrollo de software para reducir estos costos.
Para que el proceso de compilación sea determinista, la entrada al compilador debe ser la misma, independientemente del entorno de compilación utilizado. Esto normalmente implica la normalización de variables que pueden cambiar, como el orden de los archivos de entrada, las marcas de tiempo , las configuraciones regionales y las rutas .
Además, los compiladores no deben introducir el no determinismo por sí mismos. Esto sucede a veces cuando se utilizan tablas hash con un valor de semilla hash aleatorio. También puede suceder cuando se utiliza la dirección de las variables, ya que esto varía de la aleatorización del diseño del espacio de direcciones (ASLR).
Los sistemas de compilación , como Bazel y Gitian, [5] se pueden utilizar para automatizar procesos de compilación deterministas.
El Proyecto GNU utilizó compilaciones reproducibles a principios de los años 1990. Los registros de cambios desde 1992 indican que el esfuerzo continuaba. [6]
Uno de los proyectos más antiguos [7] que promueven compilaciones reproducibles es el proyecto Bitcoin con Gitian. Más tarde, en 2013, el proyecto Tor (red de anonimato) comenzó a utilizar Gitian para sus compilaciones reproducibles. [8]
A partir de 2011, se desarrolló un sistema de compilación Java reproducible para un proyecto FOSS peer-to-peer descentralizado: DirectDemocracyP2P. [9] Los conceptos de la aplicación del sistema para la recomendación de actualizaciones automáticas se presentaron por primera vez en abril de 2013 en Decentralized Coordination. [10] [11] En 2015, se publicó un tratado centrado en los detalles de implementación de la propia herramienta de compilación Java reproducible. [12]
En julio de 2013, el proyecto Debian comenzó a implementar compilaciones reproducibles en todo su archivo de paquetes. [13] [14] Para julio de 2017, se había demostrado que más del 90% de los paquetes en el repositorio se compilaban de manera reproducible. [15]
En noviembre de 2018, el proyecto Reproducible Builds se unió a Software Freedom Conservancy . [16]
F-droid utiliza compilaciones reproducibles para proporcionar una garantía de que los APK distribuidos utilizan el código fuente gratuito declarado . [17]
El sistema operativo portátil Tails utiliza compilaciones reproducibles y explica a otros cómo verificar su distribución. [18]
NixOS afirma que su compilación en junio de 2021 es 100 % reproducible para sus versiones ISO mínimas. [19]
A partir de mayo de 2020 [actualizar], Arch Linux está trabajando para hacer que todos los paquetes oficiales sean reproducibles. [20]
Según el proyecto Reproducible Builds, las marcas de tiempo son "la mayor fuente de problemas de reproducibilidad. Muchas herramientas de compilación registran la fecha y hora actuales... y la mayoría de los formatos de archivo registrarán felizmente las horas de modificación sobre sus propias marcas de tiempo". [21] Recomiendan que "es mejor utilizar una fecha que sea relevante para el código fuente en lugar de la compilación: el software antiguo siempre se puede compilar más tarde" si es reproducible. Identifican varias formas de modificar los procesos de compilación para hacer esto:
En algunos casos, se deben realizar otros cambios para que el proceso de compilación sea reproducible. Por ejemplo, algunas estructuras de datos no garantizan un orden estable en cada ejecución. Una solución típica es modificar el proceso de compilación para especificar una salida ordenada de esas estructuras. [22]
Las compilaciones reproducibles son un conjunto de prácticas de desarrollo de software que crean una ruta verificable desde el código fuente legible por humanos hasta el código binario utilizado por las computadoras.... El sistema de compilación debe ser completamente determinista: la transformación de una fuente dada siempre debe crear el mismo resultado.
{{cite journal}}
: CS1 maint: DOI inactivo a partir de noviembre de 2024 ( enlace )