2 puntos por GN⁺ 2024-08-05 | 1 comentarios | Compartir por WhatsApp

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

 
GN⁺ 2024-08-05
Opinión de Hacker News
  • Los autores de compiladores no se hacen responsables de los bugs causados por optimizaciones

    • Según el estándar del lenguaje, esos bugs se consideran culpa del programador
    • Eso demuestra que no se trata de un bug
  • Está de acuerdo con la opinión de Bernstein, pero a veces va en la dirección equivocada

    • Los beneficios de la optimización varían según el caso de uso
    • Hay quejas de que los compiladores de C no consideran significados que el lenguaje no puede expresar
    • Puede resumirse en la conclusión de "usa un lenguaje que pueda expresar el significado que necesitas"
  • C y C++ no son adecuados para escribir algoritmos que requieren garantías de tiempo constante

    • El estándar casi no tiene noción de tiempo real
    • Culpar a los desarrolladores de compiladores va en la dirección equivocada
  • En CPUs Intel, ni clang ni ninguna otra herramienta pueden generar código correcto en modo usuario

    • Es imposible configurar DOITM
  • No está de acuerdo con la afirmación de que los autores de compiladores no se hacen responsables de los bugs

    • Esto surge de un malentendido básico sobre el "comportamiento indefinido" en C
  • clang tiene el atributo clang::optnone, que permite desactivar optimizaciones por función

    • GCC tiene el atributo gnu::optimize, que permite establecer el nivel de optimización
    • clang::no_builtins desactiva las optimizaciones de memcpy y memset
  • Hay tanto comportamiento indefinido en C que podría llevar a migrar a otros lenguajes

    • En Python, el orden de los objetos set no importa
    • Los compiladores de C analizan patrones de código para intentar optimizar
    • Esto puede ofrecer mejor rendimiento de una forma similar a cómo se resolvió el problema del telescopio Hubble
  • Está de acuerdo con el objetivo de los expertos en criptografía, pero los compiladores de propósito general no lo tienen en cuenta

    • Puede que se necesiten compiladores especializados
  • Es cierto que algunos lenguajes y compiladores no son adecuados para escribir rutinas criptográficas de tiempo constante

    • Es incorrecto concluir que todos los compiladores y los lenguajes no ensamblador son malos
    • Se debería escribir un compilador y un lenguaje simples y específicos del dominio
  • En el ejemplo de cierta función, se produce comportamiento indefinido cuando la entrada es SIZE_T_MAX

    • Hay muchos bugs de este tipo, pero en la práctica no son importantes