¿Puede un programa interpretado en ejecución probar criptográficamente que es lo mismo que una versión de código fuente publicada?

4

¿Puede un programa interpretado en ejecución, por ejemplo, en lenguajes como python, javascript, ruby, java o php, probar criptográficamente que es lo mismo que una versión de código fuente publicada de una manera que no pueda ser manipulada?

De otra manera, ¿existe alguna forma de garantizar que los comandos / código ejecutados por dicho programa sean todos y solo los comandos y el código especificados en un repositorio divulgado públicamente?

La motivación para esta pregunta es la siguiente: En una época de hackers altamente sofisticados, así como las presiones de las agencias gubernamentales para "puertas traseras" que les permiten husmear en transacciones e intercambios privados, ¿podemos asegurarnos de que una aplicación no haya sido ninguna de las dos? ha sido hackeado ni se ha agregado una puerta trasera?

Por ejemplo, considere un servidor que ejecuta código python como PyBitMessage (Bitmessage / PyBitmessage en github) para mensajes seguros.

O considere una aplicación nodejs basada en código abierto como lesspass (lesspass / lesspass en github) que se usa para administrar contraseñas y está disponible para usar aquí ( enlace ).

O un programa alternativo para un propósito similar encryptr (SpiderOak / Encryptr on github) con su versión descargable ( enlace ).

¿Hay alguna manera de garantizar que las versiones disponibles en sus sitios para descargar / usar / instalar ejecuten exactamente el mismo código que se presenta en el código fuente abierto?

Incluso si tenemos un 100% de confianza en la integridad de los equipos que están detrás de aplicaciones como estas, ¿cómo podemos estar seguros de que nadie los ha obligado a modificar la versión en ejecución / descargable de su programa para crear una puerta trasera, por ejemplo? ?

Gracias por su ayuda con este importante tema.

Nota: como esta pregunta se refiere a programas interpretados, la conversación sobre construcciones deterministas o reproducibles no pareció aplicarse y pareció valer una nueva pregunta.

    
pregunta bmiller59 26.11.2016 - 05:03
fuente

1 respuesta

2

Si bien no es posible hacerlo en tiempo de ejecución, las aplicaciones pueden verificarse en tiempo de carga (OpenSSL compatible con FIPS lo hace).

  

De otra manera, ¿existe alguna forma de garantizar que los comandos / código ejecutados por dicho programa sean todos y solo los comandos y el código especificados en un repositorio divulgado públicamente?

Posible pero no de la manera que imaginas. Uno de los requisitos de un software confiable es que debe ser verificable. Se puede verificar manualmente o mediante análisis estático. Si un código no es verificable, entonces realmente no puede asegurarse de que el código que está ejecutando sea realmente el código que ve en un repositorio.

Cuando se carga una biblioteca en la memoria, puede ejecutar su firma contra una buena firma conocida de la biblioteca y asegurarse de que la biblioteca que está cargada sea la que obtuvo de un repositorio.

¿Cómo verificamos?
Bueno, hubo un momento en que la verificación se realizó manualmente mediante la revisión del código y la generación de todos los casos de prueba posibles, pero a medida que los sistemas se hacen más grandes, esto se vuelve cada vez más difícil. Existen varias herramientas de análisis estático disponibles que garantizan que un código fuente no tenga ningún flujo de programa posible que cause una falla o un escenario inesperado. (Coverity tiene un servicio gratuito de análisis estático para proyectos de código abierto).
Una vez que nos hayamos asegurado de que el código no pueda ser utilizado incorrectamente en el tiempo de ejecución, nuestro trabajo será garantizar que no se manipule en nuestra máquina.

¿Cómo garantizamos que no se manipule?
Existe un concepto de inicio seguro . Lo que hace es que cada vez que se carga un módulo, verifica la firma del módulo con respecto a un buen valor conocido y, si está bien, deja que el arranque continúe, de lo contrario, el arranque falla. Aquí se utiliza un concepto similar. Cuando se carga un programa, comparamos el hash del módulo cargado con un buen valor conocido y nos aseguramos de que sea el programa que recibimos.

De esta manera, asegurando que el programa no pueda ser mal utilizado en el tiempo de ejecución y luego asegurando que se carga un buen programa conocido, obtenemos la seguridad de que el programa es realmente lo que queremos.

    
respondido por el Limit 26.11.2016 - 05:58
fuente

Lea otras preguntas en las etiquetas