Como menciona OpenSSL, solo estoy considerando bibliotecas compiladas en código de máquina. Algunas de ellas pueden ser relevantes para bibliotecas de nivel superior (también llamadas módulos), por ejemplo. código de bytes de Python o Java, pero no todos.
¿Cómo validar la integridad de una biblioteca en tiempo de ejecución?
FIPS 140 indica varias pruebas POST (Power-On Self-Test) que deben realizarse, y esa es una forma bastante decente de validar una biblioteca en tiempo de ejecución. Tenga en cuenta que dicha biblioteca asume que está cargando una biblioteca validada por FIPS en primer lugar, por lo tanto, está seguro de que lo que tiene en el disco (antes de cargar) es la biblioteca correcta (validada). Vayamos a través de un par de vectores de ataque:
- Puedes descargar una biblioteca diferente de la que pretendías. es decir, un atacante alteró su conexión y le dio su biblioteca en lugar de la validada por FIPS (o en lugar de una biblioteca validada / confiable de otra manera). Esto se puede evitar firmando la biblioteca y verificando la firma con una clave obtenida por otro canal. Esta también es una técnica de mitigación válida para obtener el código fuente de una biblioteca.
- Alguien puede manipular la biblioteca en el disco. Para protegerse contra eso, primero tiene permisos de sistema operativo, y segundo, puede mantener una suma de comprobación de la biblioteca en una ubicación diferente (no en la misma máquina, ya que un atacante también podría alterar la suma de comprobación).
- Un atacante puede manipular la biblioteca que ya se encuentra en la memoria del proceso. POSTs protegen contra esto hasta cierto punto. Las POST que se ejecutan solo una vez protegerán contra la manipulación indebida durante la carga de la memoria, pero puede ejecutar POST de vez en cuando para asegurarse de que no se produzca ninguna manipulación indebida.
Como resultado, la biblioteca debe cargarse en una dirección base fija para ejecutar la validación.
Muy bien puede ser el caso de que la dirección base en la que la biblioteca desea cargarse ya esté en uso por algún otro programa.
En absoluto, las POST normalmente forman parte del código de la biblioteca. Son como pruebas, pero son parte del código de la propia biblioteca. En un sistema operativo moderno, una biblioteca compartida utilizará PIC (Código independiente de la posición) que garantizará que todos los saltos estén en posiciones relativas.
Además, todos los sistemas operativos modernos realizan la asignación de memoria para cada proceso, por lo tanto, la misma ubicación de memoria en dos procesos rara vez corresponde al mismo lugar en la memoria virtual (que a su vez rara vez corresponde a la memoria física, sí, hay un mínimo de dos asignaciones en un sistema operativo típico).
Hacer una suma de comprobación de una ubicación de memoria dentro de otro proceso es algo tonto. La ubicación puede estar en páginas de memoria que no sean continuas y tendrá que encontrar el orden de las mismas y replicarlo. Algo que el kernel ya está haciendo por usted (el kernel tiene el mapa de esa memoria de proceso en las páginas de memoria). Por lo tanto, el mejor lugar para realizar la suma de comprobación es dentro del proceso que está cargando la biblioteca, y como es posible que desee que la suma de verificación de varios procesos que carguen esa biblioteca sea el mejor lugar para colocar ese código, ¡es dentro de la biblioteca! Vaya, eso resulta ser una autoprueba de encendido (un POST).
Menciona OpenSSL, OpenSSL tiene su propio conjunto de POST ya integrado, vea a continuación:
OpenSSL FIPS
El OpenSSL FIPS module (el OpenSSL que ha sido validado por FIPS) tiene varios POST. Sin embargo, OpenSSL es una biblioteca verificada por FIPS muy peculiar, probablemente es la única biblioteca verificada por FIPS que viene en forma de código fuente.
El manual del usuario para FIPS OpenSSL (consulte las referencias a continuación) tiene un capítulo completo (capítulo 4) sobre cómo obtener y construir OpenSSL para que pueda considerarse FIPS verificado. Curiosamente, cubre algunos de los vectores de ataque señalados al comienzo de la respuesta. Suponiendo que tiene un OpenSSL verificado por FIPS, ahora debe llamar:
FIPS_mode_set()
Una vez que la biblioteca se carga. Esto realiza varias POST, y solo después de ejecutar esto, puede considerar que FIPS OpenSSL es una biblioteca verificada por FIPS. Estos son varios POST que verifican el OpenSSL durante el tiempo de ejecución, los POST se describen en la sección 6.3 del manual del usuario. Además, dado que OpenSSL viene en formato fuente, también puede consultar los POST en el código.
Referencias: