Reptar
(lock.cmpxchg8b.com)Descubrimiento de un misterio en la CPU
- Si te interesan los errores que pueden ocurrir dentro de las CPU modernas, vale la pena seguir leyendo.
- Si has escrito ensamblador x86, probablemente estés familiarizado con la instrucción
rep movsb, usada para mover memoria. - Después de configurar la fuente, el destino, la dirección y el contador, el procesador se encarga de todos los detalles.
Interpretación de prefijos de instrucciones
- Una de las características de x86 es que la decodificación de instrucciones suele ser muy flexible.
- Incluso si se usan prefijos sin sentido o que entran en conflicto con otros prefijos, la mayoría de las veces se ignoran.
- Los compiladores pueden usar prefijos innecesarios para ajustarse al límite de alineación deseado.
Prefijo REX
- i386 tenía 8 registros de propósito general, así que se podían especificar registros con 3 bits.
- x86-64 introdujo 8 registros de propósito general adicionales, por lo que se necesitaron más bits.
- El prefijo rex permite que la siguiente instrucción tome prestados bits adicionales, lo que hace posible codificar 16 registros de propósito general.
Reglas de codificación
- El prefijo rex amplía el espacio disponible para codificar operandos.
- Los prefijos innecesarios o redundantes suelen ignorarse en x86.
- La instrucción
rex.rxb rep movsbno tiene operandos, por lo que los bits rex no tienen significado y el procesador ignora el prefijo rex.
Fast Short Repeat Move (FSRM)
- FSRM es una función nueva introducida en Ice Lake para resolver las desventajas de ERMS.
- En ERMS, la parte difícil de mover cadenas de manera eficiente consiste en alinear el búfer para usar el almacenamiento más ancho posible.
- FSRM busca mover más rápido cadenas cortas de 128 bytes o menos.
Descubrimiento
- Usando una técnica de verificación de procesadores llamada Oracle Serialization, se comprobó si dos formas de programas generados aleatoriamente terminaban en el mismo estado final.
- En agosto, el pipeline de verificación encontró un caso en el que agregar un prefijo rex.r redundante a una operación
rep movsoptimizada con FSRM provocaba resultados impredecibles. - Se confirmó que, cuando varios núcleos activaban el mismo bug, el procesador reportaba una excepción de verificación de máquina y se detenía.
Reproducción
- Los resultados de la investigación se publicaron en un repositorio de investigación de seguridad.
- Para reproducir la vulnerabilidad, se puede usar la herramienta
icebreak. - En sistemas no afectados no debería haber ninguna salida, pero en sistemas afectados se imprime
.cada vez que la reproducción tiene éxito.
Análisis
- Cómo funciona el microcódigo en los sistemas modernos se mantiene en secreto, así que solo es posible plantear teorías basadas en observaciones.
- Se estima que el bug hace que el frontend calcule mal el tamaño de la instrucción
movsb, provocando que las entradas posteriores del ROB (reorder buffer) queden asociadas con direcciones incorrectas.
Preguntas
- Puede haber dudas sobre qué es posible en este estado inesperado de “glitch”.
- Se sabe que puede corromper suficientemente el estado del sistema como para provocar un error de machine check, y que un hilo puede afectar la ejecución del procesador hermano SMT.
- Como no hay forma de depurar la ejecución de μops, no se sabe si es posible lograr una escalada de privilegios.
Solución
- Intel publicó microcódigo actualizado para todos los procesadores afectados.
- Es posible que el sistema operativo o el proveedor del BIOS ya hayan proporcionado la actualización.
Alternativa
- Si no es posible actualizar, se pueden desactivar las fast strings mediante el registro específico de modelo IA32_MISC_ENABLE.
- Esto provoca una degradación considerable del rendimiento, por lo que solo debe usarse si es absolutamente necesario.
Opinión de GN⁺
Lo más importante de este artículo es que muestra el descubrimiento de un estado inesperado de “glitch” que puede ocurrir en CPU modernas y que podría derivar en una vulnerabilidad de seguridad. Este texto puede resultar interesante para ingenieros de software y ayuda a crear conciencia sobre la complejidad de las CPU y la fragilidad de los sistemas. Además, contribuye a entender cómo este tipo de hallazgos puede convertirse en una amenaza de seguridad real y resalta la importancia del microcódigo actualizado.
1 comentarios
Opiniones de Hacker News
El equipo de Konrad Magnusson descubrió un problema relacionado con mimalloc.
Varios equipos de investigación dentro de Google descubrieron el bug de forma independiente.
El procesador reporta una excepción de comprobación de máquina y se detiene.
Se hace evidente la falta de comprensión sobre el hardware.
Recuerda el diagnóstico de qemu cuando enfrentó el problema de
repz ret.repz ret.Empleados de Intel y de Google reportaron el problema.
Es mucho más interesante que el artículo de Google.
Duda sobre si es posible diseñar una CPU que no ejecute en orden sino de forma especulativa, sin problemas de seguridad.
Explicación del aviso de seguridad de Intel.