Al enlazar con OpenSSL (u otras bibliotecas criptográficas), ¿sería más seguro usar una biblioteca compartida y tener una asignación aleatoria del espacio de direcciones, o usar una biblioteca estática y no tener ASLR?
Al enlazar con OpenSSL (u otras bibliotecas criptográficas), ¿sería más seguro usar una biblioteca compartida y tener una asignación aleatoria del espacio de direcciones, o usar una biblioteca estática y no tener ASLR?
ASLR y esas cosas son formas de tratar de lidiar con las consecuencias de un desbordamiento de búfer, son un juego de búsqueda y ocultación para que los atacantes encuentren más difícil convertir un desbordamiento de búfer en ejecución remota de código. Para una seguridad adecuada, es mejor hacerlo para que no se produzcan desbordamientos de búfer en primer lugar.
... y para eso, la vinculación dinámica es mejor. La razón es la siguiente: sería excesivamente optimista creer que cualquier pieza de código escrita en C no tiene ningún desbordamiento de búfer (especialmente OpenSSL, que tiene un historial bastante largo sobre ese tema). Por lo tanto, lo mejor que puede hacer es poder sin demora corregir los agujeros de seguridad conocidos reemplazando la parte defectuosa. Si utiliza la vinculación dinámica, esto es fácil: simplemente reemplace la DLL y termine con ella. Si la DLL es proporcionada por el sistema operativo (el caso normal en los sistemas Linux), esto se hará de manera natural cuando aplique las actualizaciones de seguridad del proveedor del sistema operativo. Sin embargo, si utiliza la vinculación estática, los parches no se incorporarán a su aplicación hasta que vuelva a compilar (o al menos a vincular) esa aplicación específica con el OpenSSL parcheado.
En la práctica, el enlace estático significa que las soluciones de seguridad en la biblioteca tardarán más en aplicarse a la aplicación o, en la mayoría de los casos, no se aplicarán en absoluto. Esto es malo. Por lo tanto, usa enlaces dinámicos .
Llego tarde a la fiesta, pero solo quería expresar algunas opiniones en caso de que alguien más pase. La respuesta aceptada es precisa ya que la vinculación estática hace que sea más difícil realizar una actualización en el lugar. Por ejemplo, si está utilizando OpenSSL con su aplicación, simplemente podría implementar el nuevo libcrypto.dll (suponiendo que es compatible con su aplicación) en la DLL antigua, y estará bien.
Sin embargo, en relación con los exploits y otras cosas desagradables, diría que la vinculación estática es un poco más segura. Básicamente, no hay una DLL externa a su aplicación que pueda intercambiarse con una versión contaminada de la misma DLL o incluso con un shim (proxy de DLL y similares ...)
Además, y esto no es realmente un argumento en contra de ninguno de los dos, pero si su biblioteca externa tiene una vulnerabilidad, ni la estática ni la dinámica serán más seguras, ya que se explotan en tiempo de ejecución cuando ya están vinculadas a su aplicación.
Estoy de acuerdo con sus consejos sobre cómo facilitar el emparejamiento de las versiones actuales de OpenSSL y, en su mayor parte, sugeriría enlaces dinámicos, pero usted conoce mejor su aplicación y, dado que la pregunta original es más segura (mientras se implementa en una caja, Supongo que también deberías pensar en la manipulación.