Inception, una vulnerabilidad que afecta a procesadores AMD
Hace pocos días un grupo de investigadores dieron a conocer mediante una publicación de blog, información sobre una vulnerabilidad que detectaron (ya catalogada bajo CVE-2023-20569) y que afecta a procesadores AMD basados en las microarquitecturas EPYC y Ryzen.
Se menciona que la vulnerabilidad, con nombre clave «Inception», permite que un usuario local sin privilegios determine el contenido de la memoria de los procesos de otros usuarios al utilizar sistemas de virtualización, lo cual básicamente permite extraer información de otros sistemas invitados.
¿Qué es Inception y como es explotada?
Sobre Inception, se menciona que esta vulnerabilidad es una combinación de:
- Especulación fantasma: podemos desencadenar una predicción errónea sin ninguna rama en la fuente de la predicción errónea.
- Entrenamiento en Ejecución Transitoria: Podemos manipular predicciones erróneas futuras a través de una predicción errónea previa que desencadenamos.
Ya que con ella es posible generar el desbordamiento de la pila de direcciones de retorno (RAS) en una estructura que se actualiza en modo especulativo en una etapa en la que el procesador solo predice una posible llamada a la instrucción CALL.
La pila RAS tiene un tamaño fijo y es circular, es decir, se repite y después del último elemento cambia al principio. Un atacante puede crear condiciones en las que el predictor de bifurcación ejecute especulativamente una gran cantidad de CALL predichas incorrectamente, lo suficiente como para desbordar la pila RAS y sobrescribir los puntos de retorno pronosticados correctamente colocados al principio de la pila.
Como resultado de esto, los elementos iniciales de la pila se pueden sobrescribir con valores elegidos por el atacante, lo que luego conducirá al uso de estos valores reemplazados durante la ejecución especulativa de la instrucción RET en el contexto de otro proceso.
Se menciona que después de eso, el procesador determinará que la predicción de bifurcación no estaba justificada y revertirá la operación a su estado original, pero los datos procesados durante la ejecución especulativa se asentarán en el caché y en los búferes de microarquitectura. Si un bloque ejecutado erróneamente realiza un acceso a la memoria, entonces su ejecución especulativa conducirá a la instalación en el caché general y la lectura de datos de la memoria.
Para «envenenar» la predicción de bifurcaciones se utiliza la vulnerabilidad Phantom (CVE-2022-23825) identificada por los mismos investigadores, que permite crear condiciones para predecir una bifurcación ficticia sin instrucciones de bifurcación e influir en el búfer de predicción de bifurcaciones sin la instrucción «ret».
Para iniciar una predicción errónea y un desbordamiento de la pila RAS, se usa la instrucción XOR habitual, cuyo efecto en el búfer de predicción de bifurcación durante un ataque fantasma se asemeja a una llamada recursiva a la instrucción CALL. Para la sustitución controlada del valor requerido al comienzo de la pila RAS, se propone el método TTE (Training in Transient Execution), que permite influir en la predicción futura de transiciones de predicciones erróneas anteriores.
Cabe mencionar que para la demostración los investigadores prepararon un exploit el cual puede ser utilizado por un usuario local sin privilegios para determinar el hash de la contraseña del usuario root, almacenado en el archivo /etc/shadow y cargado en la memoria al realizar la autenticación en el sistema.
El ataque se demostró en un sistema Ubuntu 22.04 completamente actualizado con un kernel 5.19 en una computadora con un procesador de la familia AMD Zen 4. El rendimiento de fuga de datos del exploit es de 39 bytes por segundo. El contenido de /etc/shadow se determinó con éxito en 6 de cada 10 intentos de aprovechar la vulnerabilidad. Cada intento tomó aproximadamente 40 minutos.
Como ya se menciono al inicio, Inception afecta a procesadores basados en las microarquitecturas EPYC y Ryzen, de las cuales las microarquitecturas Zen1 y Zen2, la protección basada en la instrucción IBPB (utilizada para protección contra los ataques de Spectre), se puede usar para bloquear la manifestación de una vulnerabilidad. Mientras que para los procesadores de las familias Zen3 y Zen4, no existen soluciones de protección y se requiere una actualización del microcódigo para bloquear la vulnerabilidad en ellos.
Finalmente, se menciona que las correcciones de Inception y la actualización del firmware se incluyen ya en las recientes versiones del kernel de Linux, aunque posterior a la distribucion de las correcciones se propuso además una versión revisada más eficiente de los parches, que hasta el momento no se han aceptado en el kernel.
Si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.