¿Hay una manera de verificar un binario contra las fuentes?

20

Parece que no hay una forma práctica de verificar la integridad completa ruta del software precompilado y empaquetado? Puedo verificar el paquete descargado por medio de hashes, pero no tengo ninguna verificación de si los binarios compilados representan realmente el código fuente público.

¿No hay una solución teórica para este problema? En el mejor de los casos, ¿una forma que pueda ser automatizada?

¿Tal vez descompilarlo y comparar su salida o hashes con algo que ofrece el proveedor de software?

    
pregunta flori 05.07.2013 - 14:44
fuente

2 respuestas

20

Compilation es principalmente una operación unidireccional, y no es determinista, al menos no de una manera sólida.

Usted podría recompilar el código fuente y ver si produce el mismo binario. Sin embargo, el binario exacto puede variar dependiendo de muchos parámetros, incluidas las opciones de compilación y la versión exacta del compilador utilizado. Además, algunos compiladores insertan algunos "comentarios" en archivos binarios, comentarios que generalmente incluyen la versión del compilador, pero también pueden incluir el "número de compilación" (si se mantiene dicho número) y, posiblemente, la fecha y hora de compilación, en eso caso, usted no obtendrá el mismo binario, no bajará hasta el último byte. Si desea ver si obtuvo el "mismo" binario, es posible que primero tenga que eliminarlos de dichos comentarios (el comando Unix strip puede ser útil).

Estrictamente hablando, la compilación podría ser aleatoria; como generar un código óptimo es un problema difícil, algunos compiladores emplean algoritmos aleatorios que, heurísticamente , son buenos en promedio. Tal compilador podría generar un binario distinto cada vez. Dado que tal comportamiento hace que la depuración sea mucho más difícil, muchos compiladores que utilizan algoritmos heurísticos intentarán ser reproducibles (es decir, obtendrán su aleatoriedad de un PRNG sembrado con un valor específico y configurable).

Hay una solución mucho más simple: si tiene el código fuente y puede recompilarlo, entonces use la salida de su recompilación.

Por supuesto, esto no resuelve completamente el problema de la confianza; simplemente lo mueve alrededor Al compilar desde la fuente:

  • debe confiar en que el código fuente no contiene puertas traseras;
  • tienes que confiar en el compilador en sí mismo para no hacerte trucos desagradables.

Al menos, el código fuente es legible nominalmente por personas (ese es el punto del código fuente), por lo que puede realizar un análisis del código al leerlo (o hacer que lo lea un especialista en el que confíe). No se conoce ninguna forma de asegurarse de que un fragmento de código determinado no contenga ninguna puerta trasera o vulnerabilidad (de lo contrario, esto significaría que sabíamos cómo producir un código libre de errores); sin embargo, es mucho más difícil ocultar una puerta trasera en el código fuente que en un binario compilado.

En cuanto al compilador, vea este artículo muy clásico .

    
respondido por el Tom Leek 05.07.2013 - 15:05
fuente
2

El concepto de compilaciones reproducibles parece ofrecer una solución para este problema. Al menos una teórica.

Significa que cada ejecución de un proceso de compilación (o compilación) debe devolver el mismo resultado, dado que la fuente de entrada es la misma.

Con él, cada binario recién publicado podría ser cotejado por mí o por otros si realmente representa el código fuente que dice representar.

Sin embargo, solo hay unos pocos proyectos (en febrero de 2017) que implementaron este concepto en sus procesos de compilación (principalmente sistemas operativos). Entonces, en la mayoría de los casos, esta solución es todavía teórica.

    
respondido por el flori 26.02.2017 - 00:07
fuente

Lea otras preguntas en las etiquetas