Un grupo de investigadores de la Escuela Politécnica Federal de Zúrich ha descubierto una nueva variante de ataque al mecanismo de ejecución especulativa de saltos indirectos en las CPU, que permite extraer información de la memoria del núcleo o llevar a cabo un ataque a la sistema anfitrión desde máquinas virtuales. Las vulnerabilidades han recibido el nombre en código Retbleed (CVE-2022-29900, CVE-2022-29901) y son similares en esencia a los ataques Spectre-v2. La diferencia radica en la organización de la ejecución especulativa de código arbitrario al procesar la instrucción "ret" (return), que extrae la dirección de salto de la pila, en lugar de un salto indirecto mediante la instrucción "jmp" con carga de dirección desde la memoria o el registro de la CPU.
El atacante puede crear condiciones para una predicción incorrecta del salto y organizar un salto especulativo dirigido a un bloque de código que no está previsto en la lógica de ejecución del programa. Al final, la CPU determinará que la predicción de la bifurcación no fue correcta y revertirá la operación a su estado original, pero los datos procesados durante la ejecución especulativa permanecerán en la caché y en los búferes microarquitectónicos. Si el bloque ejecutado erróneamente accede a la memoria, su ejecución especulativa provocará que estos datos se almacenen en la caché general.
Para identificar los datos que permanecen en la caché tras la ejecución especulativa de operaciones, el atacante puede utilizar métodos para determinar los datos residuales a través de canales secundarios, por ejemplo, analizando los cambios en el tiempo de acceso a datos que están en caché y otros que no. Para extraer información de áreas en otro nivel de privilegio (por ejemplo, de la memoria del núcleo), se utilizan "gadgets": secuencias de comandos presentes en el núcleo, adecuadas para la lectura especulativa de datos de la memoria según las condiciones externas que puede influir el atacante.
Para protegerse contra ataques clásicos de la clase Spectre, que utilizan instrucciones de salto condicional e indirecto, la mayoría de los sistemas operativos utilizan la técnica «retpoline», que se basa en reemplazar las operaciones de salto indirecto por la instrucción «ret», para la cual los procesadores utilizan un bloque de predicción de estado de pila separado que no utiliza el bloque de predicción de saltos. Al implementar retpoline en 2018, se creía que manipulaciones de direcciones similares a Spectre no eran aplicables en la práctica para saltos especulativos mediante la instrucción «ret».
Los investigadores que desarrollaron el método de ataque Retbleed demostraron la posibilidad de crear condiciones microarquitectónicas para iniciar un salto especulativo mediante la instrucción «ret» y publicaron herramientas listas para detectar en el núcleo de Linux secuencias de instrucciones (gadgets) que presentan dichas condiciones y que son susceptibles de explotación.
En el transcurso de la investigación se preparó un exploit funcional que permite extraer datos arbitrarios de la memoria del núcleo en sistemas con CPU Intel desde un proceso no privilegiado en el espacio del usuario a una velocidad de 219 bytes por segundo y con una precisión del 98%. En los procesadores AMD, la efectividad del exploit es mucho mayor: la velocidad de filtración es de 3.9 KB por segundo. Como ejemplo práctico, se muestra cómo determinar el contenido del archivo /etc/shadow utilizando el exploit propuesto. En sistemas con CPU Intel, el ataque para determinar el hash de la contraseña del usuario root se realizó en 28 minutos, mientras que en sistemas con CPU AMD se llevó a cabo en 6 minutos.

La posibilidad de llevar a cabo el ataque se ha confirmado para los procesadores Intel de 6 a 8 generaciones, que se fabricaron antes del tercer trimestre de 2019 (incluyendo Skylake), y procesadores AMD basados en microarquitecturas Zen 1, Zen 1+ y Zen 2, que se produjeron hasta el segundo trimestre de 2021. En modelos de procesadores más nuevos, como AMD Zen3 e Intel Alder Lake, así como en procesadores ARM, el problema se bloquea con los mecanismos de protección existentes. Por ejemplo, el uso de instrucciones IBRS (Indirect Branch Restricted Speculation) ayuda a proteger contra el ataque.
Se ha preparado un conjunto de cambios para el núcleo de Linux y el hipervisor Xen para los CPU antiguos que bloquean el problema mediante software. El parche propuesto para el núcleo de Linux modifica 68 archivos, añade 1783 líneas y elimina 387 líneas. Desafortunadamente, la protección conlleva un costo adicional significativo: las pruebas realizadas en los procesadores AMD e Intel estiman una disminución del rendimiento que varía entre el 14% y el 39%. La protección basada en instrucciones IBRS, disponibles en las nuevas generaciones de CPU Intel y compatibles desde el núcleo Linux 4.19, es preferible.
En los procesadores Intel, la sustitución de la dirección para las salidas indirectas especulativas ocurre gracias a una característica que se manifiesta en desbordamiento por defecto (underflow) en el búfer de predicción del contenido de la pila (Return Stack Buffer). Cuando se producen estas condiciones, se aplica lógica de selección de dirección para la instrucción 'ret', similar a la utilizada en las salidas indirectas normales. En el núcleo de Linux se han encontrado más de mil lugares que crean las condiciones para iniciar dicho desbordamiento inverso y que son accesibles a través de llamadas al sistema.
En los procesadores AMD, la ejecución especulativa de la instrucción 'ret' se realiza sin depender de un búfer específico de la pila (Return Address Stack), y el bloque de predicción de saltos considera la instrucción 'ret' no como un retorno de control, sino como un salto indirecto, utilizando, por lo tanto, los datos para saltos indirectos en la predicción. En tales condiciones, prácticamente cualquier operación 'ret' alcanzable a través de una llamada al sistema puede ser explotada.
Además, también se ha identificado otro problema en los CPU AMD (CVE-2022-23825, Confusión del Tipo de Rama) relacionado con la realización de saltos ficticios: las condiciones para la predicción de saltos pueden surgir incluso sin instrucciones de ramificación necesarias, lo que permite influir en el búfer de predicción de saltos sin la instrucción 'ret'. Esta característica complica significativamente la implementación de protección y requiere una limpieza más activa del búfer de predicción de saltos. Se espera que la adición de una protección completa en el núcleo lleve a un aumento en los costos de hasta el 209%.
Fuente: opennet.ru
