Articulo de referencia

Compilaciones reproducibles

Logotipo del proyecto Reproducible Builds de Software Freedom Conservancy. La compilación reproducible , también conocida como compilación determinista , es un proceso de compil...

Logotipo del proyecto Reproducible Builds de Software Freedom Conservancy.

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 de forma 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 estar firmado, y la compilación determinista puede probar que el binario fue compilado a partir de código fuente confiable. Las compilaciones reproducibles verificadas proporcionan una contramedida sólida contra ataques donde 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 los 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 lo que los desarrolladores normalmente revisan y modifican. En una encuesta a 17 expertos, las compilaciones reproducibles tuvieron una calificación de utilidad muy alta por parte del 58,8% de los participantes, pero también una calificación de alto costo por parte del 70,6%. [ 4 ] Se están haciendo varios esfuerzos para modificar las herramientas de desarrollo de software para reducir estos costos.

Métodos

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 generalmente implica normalizar 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 indeterminismo por sí mismos. Esto ocurre a veces al usar tablas hash con un valor de semilla hash aleatorio. También puede ocurrir al usar la dirección de las variables, ya que esta difiere de la aleatorización del espacio de direcciones (ASLR).

Los sistemas de compilación , como Bazel , GNU Guix y Gitian, [ 5 ] se pueden utilizar para automatizar procesos de compilación deterministas.

Historia

El Proyecto GNU utilizó compilaciones reproducibles a principios de la década de 1990. Los registros de cambios de 1992 indican el esfuerzo continuo. [ 6 ]

Uno de los proyectos más antiguos [ 7 ] para promover compilaciones reproducibles es el proyecto Bitcoin con Gitian y, posteriormente, GNU Guix. En 2013, el proyecto Tor (red de anonimato) comenzó a usar Gitian para sus compilaciones reproducibles. [ 8 ]

A partir de 2011, se desarrolló un sistema de compilación Java reproducible para el proyecto descentralizado peer-to-peer FOSS DirectDemocracyP2P. [ 9 ] Los conceptos de la aplicación del sistema al soporte de recomendaciones de actualizaciones automatizadas 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 forma reproducible. [ 15 ]

En noviembre de 2018, el proyecto Reproducible Builds se unió a Software Freedom Conservancy . [ 16 ]

F-Droid utiliza compilaciones reproducibles para garantizar que los APK distribuidos utilicen el código fuente libre declarado . [ 17 ]

El sistema operativo portátil Tails utiliza compilaciones reproducibles y explica a otros cómo verificar su distribución. [ 18 ]

NixOS afirma una reproducibilidad de compilación del 100% a partir de junio de 2021 para sus versiones ISO mínimas. [ 19 ]

A partir de mayo de 2020 Arch Linux está trabajando para que todos los paquetes oficiales sean reproducibles. [ 20 ]

A marzo de 2025 , Las imágenes en vivo de Debian para Bookworm son reproducibles. [ 21 ]

El sistema operativo FreeBSD se compila de forma reproducible y sin acceso de root desde octubre de 2025. [ 22 ]

Desafíos

Según el proyecto Reproducible Builds, las marcas de tiempo son "la principal 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 registran sin problema las horas de modificación además de sus propias marcas de tiempo". [ 23 ] Recomiendan que "es mejor usar 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 lograr esto:

  • Establezca la variable de entorno SOURCE_DATE_EPOCH con el número de segundos transcurridos desde el 1 de enero de 1970, utilizando algún valor del código fuente. Las herramientas que admiten esta variable de entorno usarán su valor (cuando esté configurado) en lugar de la fecha y hora actuales.
  • Procesar la salida posteriormente para eliminar las marcas de tiempo o normalizarlas. La herramienta strip-nondeterminism suele ser útil para ello.
  • Utilice una biblioteca como libfaketime para interceptar las solicitudes correspondientes a la hora actual del día y proporcionar una respuesta controlada.

En algunos casos, es necesario realizar otros cambios para que un 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 consiste en modificar el proceso de compilación para especificar una salida ordenada a partir de dichas estructuras. [ 24 ]

Véase también

Referencias

  1. 1 2 "reproducible-builds.org" . reproducible-builds.org . Archivado del original el 20 de mayo de 2016. Recuperado el 22 de agosto de 2016. 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: transformar un código fuente dado siempre debe crear el mismo resultado.
  2. Lamb, Chris; Zacchiroli, Stefano (marzo de 2022). "Compilaciones reproducibles: aumentando la integridad de las cadenas de suministro de software" . IEEE Software . 39 (2): 62–70 . arXiv : 2104.06020 . doi : 10.1109/MS.2021.3073045 . S2CID 233219473. Recuperado el 26 de marzo de 2023 . 
  3. Ratliff, Emily (4 de abril de 2016). "Estableciendo correspondencia entre una aplicación y su código fuente | SecurityWeek.com" . www.securityweek.com . SecurityWeek. Archivado del original el 20 de septiembre de 2016. Recuperado el 22 de agosto de 2016 .
  4. Ladisa, Piergiorgio; Plate, Henrik; Martinez, Matias; Barais, Olivier (19 de abril de 2022). «SoK: Taxonomía de ataques a las cadenas de suministro de software de código abierto». Simposio IEEE de 2023 sobre seguridad y privacidad (SP) . págs. 1509–1526 . arXiv : 2204.04008 . doi : 10.1109/SP46215.2023.10179304 . ISBN  978-1-6654-9336-9.
  5. "Gitian: un método seguro de distribución de software" . gitian.org . Consultado el 10 de enero de 2018 .
  6. Gilmore, John (24-01-2017). "SOURCE_PREFIX_MAP y la navaja de Occam" . rb-general (Lista de correo).
  7. "Archivo LICENSE del proyecto Gitian" . GitHub . Consultado el 3 de diciembre de 2019 .
  8. Construcciones deterministas, segunda parte: detalles técnicos. 4 de octubre de 2013
  9. "DDP2P" . GitHub . 2011.
  10. Alhamed, Khalid, et al. " Seguridad mediante certificación descentralizada de actualizaciones automáticas para software de código abierto controlado por voluntarios" . Citeseer ..", Actas de la Coordinación Descentralizada. págs. 40-59, Editorial Lulu, 6 de abril de 2013.
  11. ^ Silaghi, Marius C.; Alhamed, Jalid; Dhannoon, Osamah; Qin, canción; Vishen, Rahul; Knowles, Ryan; Hussien, Ihsan; Yang, Yi; Matsui, Toshihiro; Yokoo, Makoto; Hirayama, Katsutoshi (2013). "DirectDemocracyP2P —Campañas de petición deliberativas descentralizadas—" . Actas de IEEE P2P 2013 . págs. 1– 2. doi : 10.1109/P2P.2013.6688733 . ISBN  978-1-4799-0515-7.
  12. Silaghi, Marius; Alhamed, Khalid; Stansifer, Ryan (2015). «Extensiones de herramientas Java para admitir múltiples sistemas de recomendación y paquetes distribuidos». Conferencia Internacional de 2015 sobre Ciencia Computacional e Inteligencia Computacional (CSCI) . págs. 722–725 . doi : 10.1109/CSCI.2015.127 . ISBN  978-1-4673-9795-7.
  13. "Charla sobre compilaciones reproducibles en Debian" . 21 de septiembre de 2014.
  14. "Historial de compilaciones reproducibles" .
  15. ^ "Linux-Distributionen: Mehr als 90 Prozent der Debian-Pakete reproducduzierbar - Golem.de" (en alemán). 2017-07-24 . Consultado el 30 de octubre de 2018 .
  16. "Reproducible Builds se une a Software Freedom Conservancy" . Consultado el 15 de diciembre de 2018 .
  17. "Compilaciones reproducibles" . F-Droid.
  18. "Verificación de la reproducibilidad de una imagen de Tails" . Tails.
  19. "¡La distribución iso_minimal.x86_64-linux de Nixos-unstable es 100% reproducible!" . NixOS Discourse . 2021-06-20 . Consultado el 21-06-2021 .
  20. "ArchWiki - Compilaciones reproducibles" .
  21. Clobus, Roland (19 de marzo de 2025). "Actualización de estado irregular sobre imágenes ISO de Debian Live reproducibles" . Recuperado el 26 de marzo de 2025 .
  22. "FreeBSD ahora se compila de forma reproducible y sin privilegios de root" . 27 de octubre de 2025. Consultado el 26 de noviembre de 2025 .
  23. "Marcas de tiempo" . Compilaciones reproducibles . Consultado el 16 de abril de 2022 .
  24. "Marcas de tiempo" . Compilaciones reproducibles . Consultado el 16 de abril de 2022 .
  • reproducible-builds.org
  • Compilaciones reproducibles de Debian