Usando OpenSSL como una biblioteca en lugar de llamar a la salida desde un comando independiente en un programa que se está escribiendo

5

En otra pregunta sobre cómo use OpenSSL mediante programación un miembro de la comunidad estaba escribiendo, una sugerencia fue usar el comando system() mientras que otro fue incluir los encabezados de C y trabajar con la biblioteca usando las funciones directamente. Además, si usar system() hay un beneficio de seguridad al usar popen() u otra función?

¿Cuáles serían las implicaciones de seguridad de ejecutar OpenSSL como una biblioteca en lugar de llamar a un ejecutable compilado desde el sistema? Me imagino que podría haber problemas con la integridad y la autenticidad de la instalación de openssl instalada en un sistema en algunos casos, pero también es posible que una aplicación use una biblioteca desactualizada. ¿Existen ciertas consideraciones para este escenario, o puede responderse de manera más general? (Si es así, no dude en editar la pregunta).

    
pregunta Eric G 10.04.2013 - 01:37
fuente

1 respuesta

5

Como resumen aproximado, OpenSSL se diseñó como una biblioteca y se diseñó como tal. La utilidad de línea de comandos fue, inicialmente, una herramienta para pruebas y para tareas manuales. Los problemas potenciales al invocar la utilidad de línea de comandos desde una aplicación C, con system() o popen() , incluyen lo siguiente:

  • La herramienta espera sus entradas como archivos, que deben producirse y administrarse. Algunos de ellos son sensibles, por ejemplo. archivos que contienen claves privadas; debe tener mucho cuidado al copiarlos.

  • La herramienta produce sus salidas como archivos o texto en su salida estándar; El texto está destinado al consumo humano, no al análisis automático. Un número de casos de esquina puede ser problemático (por ejemplo, si usa openssl como una forma de analizar el contenido de los certificados X.509, ¿qué sucede si una cadena dentro del certificado contiene un carácter de nueva línea?). El formato de salida de texto puede variar con los detalles de la configuración del sistema (por ejemplo, el idioma o la codificación de todo el sistema).

  • El informe de errores será difícil. Con la API de C, puede saber exactamente qué paso falló y por qué; con la herramienta de línea de comandos, obtendrá, en el mejor de los casos, un estado de error sintético ("algo falló") y un mensaje de texto.

  • system() y su hermano popen() son un no-go definido en las aplicaciones de setuid (eso es el rey de los agujeros de "obtener root shell" de la década de 1980).

Para resumir , llamar a openssl (la utilidad de línea de comandos) desde el código C es engorroso, ineficiente y complejo. La complejidad sola casi mecánicamente implica problemas de seguridad.

    
respondido por el Tom Leek 10.04.2013 - 02:51
fuente

Lea otras preguntas en las etiquetas