Clang vs. Clang: No hagas enojar a Clang
- Es una entrada de blog sobre experimentos con Clang
- Al revisar cambios recientes en LLVM y GCC relacionados con la optimización de compiladores, se incluyen optimización, pruebas de optimización, correcciones de pruebas y correcciones de errores
- Los autores de compiladores no quieren asumir responsabilidad por los errores que introducen
- La optimización del compilador no contribuye mucho a mejorar el rendimiento real
Problemas de la optimización del compilador
- Rara vez un compilador optimizado mejora el rendimiento
- Por ejemplo, la implementación avx2 de kyber768 es 4 veces más rápida que el código compilado con un compilador optimizado
- Según la ley de Todd A. Proebsting, la optimización del compilador casi no contribuye al rendimiento de cómputo
- Los resultados de benchmark de Arseny Kapoulkine llegan a una conclusión similar
Problemas de seguridad
- Los compiladores optimizados pueden causar no solo errores tradicionales, sino también problemas de seguridad como fugas por temporización
- Según un artículo de EuroS&P de 2018, una actualización del compilador puede abrir canales de temporización y volver vulnerable código seguro
- Se reportó un ataque de temporización exitoso en código compilado desde el código de referencia de Kyber con opciones de optimización de Clang 15 o superior
Herramienta TIMECOP
- TIMECOP 2 está integrado en el framework de pruebas criptográficas SUPERCOP y escanea automáticamente ramas condicionales derivadas de secretos
- Diferencias entre TIMECOP 1 y TIMECOP 2: TIMECOP 2 marca automáticamente como secreto la salida del RNG y se ejecuta en múltiples núcleos
Escritura de código en tiempo constante
- En julio de 2024 se dio una charla sobre cómo escribir código en tiempo constante
- Se explican funciones de tiempo constante proporcionadas por libmceliece y SUPERCOP
- Por ejemplo, la función
crypto_uint32_bitmod_mask(x,j) evita que el compilador reconozca un resultado de 1 bit
Prevención de problemas de optimización del compilador
- Una forma de evitar que el compilador introduzca fugas por temporización es distribuir bibliotecas en lenguaje ensamblador
- Sin embargo, el lenguaje ensamblador puede dificultar la auditoría de la corrección del software
- Se está buscando una forma de introducir rápidamente código de prevención de fugas por temporización en C, C++ y otros lenguajes
Parche clang-vs-clang
- Se escribió un parche para la herramienta de optimización de LLVM que escanea
&1 y >>31 y muestra mensajes de advertencia
- Por ejemplo, se muestra un mensaje de advertencia en el código
x >>= 31
Conclusión
- La optimización del compilador no contribuye mucho a mejorar el rendimiento y puede causar problemas de seguridad
- Deben usarse herramientas como TIMECOP para escribir código en tiempo constante y prevenir problemas de optimización del compilador
Resumen de GN⁺
- Este artículo trata los problemas y riesgos de seguridad de la optimización del compilador
- Enfatiza que la optimización del compilador no contribuye mucho a mejorar el rendimiento real y puede causar problemas de seguridad
- Presenta la herramienta TIMECOP y métodos para escribir código en tiempo constante como formas de prevenir problemas de seguridad
- También propone distribuir bibliotecas en lenguaje ensamblador para prevenir problemas de optimización del compilador
- Otros proyectos relacionados en este campo incluyen compiladores orientados a la seguridad como FaCT y Jasmin
1 comentarios
Opinión de Hacker News
Los autores de compiladores no se hacen responsables de los bugs causados por optimizaciones
Está de acuerdo con la opinión de Bernstein, pero a veces va en la dirección equivocada
C y C++ no son adecuados para escribir algoritmos que requieren garantías de tiempo constante
En CPUs Intel, ni clang ni ninguna otra herramienta pueden generar código correcto en modo usuario
No está de acuerdo con la afirmación de que los autores de compiladores no se hacen responsables de los bugs
clang tiene el atributo
clang::optnone, que permite desactivar optimizaciones por funcióngnu::optimize, que permite establecer el nivel de optimizaciónclang::no_builtinsdesactiva las optimizaciones de memcpy y memsetHay tanto comportamiento indefinido en C que podría llevar a migrar a otros lenguajes
Está de acuerdo con el objetivo de los expertos en criptografía, pero los compiladores de propósito general no lo tienen en cuenta
Es cierto que algunos lenguajes y compiladores no son adecuados para escribir rutinas criptográficas de tiempo constante
En el ejemplo de cierta función, se produce comportamiento indefinido cuando la entrada es SIZE_T_MAX