Investigadores de la Universidad Nacional de Defensa de la Armada Popular de China, la Universidad Nacional de Singapur y la Escuela Politécnica Federal de Zúrich han desarrollado un nuevo método de ataque a enclaves aislados de Intel SGX (Software Guard eXtensions). El ataque, denominado SmashEx, se debe a problemas de reentrabilidad en el manejo de excepciones durante la operación de los componentes runtime de Intel SGX. El método de ataque propuesto permite, con control sobre el sistema operativo, identificar datos confidenciales almacenados en el enclave o realizar la copia de su propio código en la memoria del enclave y ejecutarlo.
Se han preparado prototipos de exploits para enclaves con runtime basado en Intel SGX SDK (CVE-2021-0186) y Microsoft Open Enclave (CVE-2021-33767). En el primer caso, se demostró la posibilidad de extraer la clave RSA utilizada en el servidor web para HTTPS, y en el segundo se logró determinar el contenido obtenido con la utilidad cURL, ejecutada dentro del enclave. La vulnerabilidad ya ha sido corregida mediante actualizaciones en las versiones 2.13 del Intel SGX SDK y 0.17.1 de Open Enclave. Además de los paquetes de Intel SGX SDK y Microsoft Open Enclave, la vulnerabilidad también se manifiesta en los SDK de Google Asylo, EdgelessRT, Apache Teaclave, Rust SGX SDK, SGX-LKL, CoSMIX y Veracruz.
Recordemos que la tecnología SGX (Software Guard Extensions) apareció en los procesadores Intel Core de sexta generación (Skylake) y ofrece una serie de instrucciones que permiten asignar áreas de memoria cerradas a aplicaciones de nivel de usuario: enclaves, cuyo contenido no puede ser leído ni modificado incluso por el núcleo y el código ejecutados en los modos ring0, SMM y VMM. No es posible transferir el control al código en el enclave mediante funciones tradicionales de salto y manipulaciones con registros y pilas; para transferir el control al enclave se utilizan nuevas instrucciones específicamente creadas, como EENTER, EEXIT y ERESUME, que realizan una verificación de autorización. El código colocado en el enclave puede usar métodos de llamada clásicos para acceder a funciones dentro del enclave y una instrucción especial para llamar a funciones externas. Para protegerse de ataques de hardware, como la conexión al módulo DRAM, se utiliza el cifrado de la memoria del enclave.

El problema se debe a que la tecnología SGX permite que el sistema operativo interrumpa la ejecución de un enclave generando una excepción de hardware, y en los enclaves no se implementan adecuadamente los primitivos para el manejo atómico de tales excepciones. A diferencia del núcleo del sistema operativo y de las aplicaciones comunes, el código dentro de los enclaves no tiene acceso a primitivos para organizar acciones atómicas durante el tratamiento de excepciones que ocurren de manera asincrónica. Sin los primitivos atómicos mencionados, un enclave puede ser interrumpido en cualquier momento y retornar a la ejecución, incluso en momentos en que se están realizando secciones críticas en el enclave y este se encuentra en un estado inseguro (por ejemplo, cuando no se han guardado/restaurado los registros de la CPU).

Para el funcionamiento normal, la tecnología SGX permite interrumpir la ejecución del enclave mediante excepciones de hardware configurables. Esta característica permite a los entornos de ejecución de los enclaves implementar el manejo de excepciones dentro del enclave o el manejo de señales, pero también puede provocar errores de reentrabilidad. El ataque SmashEx se basa en explotar deficiencias en el SDK que hacen que la situación de una llamada repetida al manejador de excepciones no se procese adecuadamente. Es importante destacar que, para explotar la vulnerabilidad, el atacante debe tener la capacidad de interrumpir la ejecución del enclave, es decir, debe controlar el funcionamiento del entorno del sistema.
Después de generar la excepción, el atacante obtiene una pequeña ventana temporal durante la cual puede interceptar el flujo de ejecución mediante la manipulación de los parámetros de entrada. En particular, al tener acceso al sistema (entorno fuera del enclave), se puede crear una nueva excepción inmediatamente después de ejecutar la instrucción de entrada en el enclave (EENTER), lo que llevará a la devolución del control al sistema en una etapa en la que aún no se ha completado la configuración de la pila para el enclave, en la que se guarda el estado de los registros de la CPU.
El sistema puede devolver el control al enclave, pero dado que la pila del enclave no se configuró durante la interrupción, el enclave se ejecutará con la pila que se encuentra en la memoria del sistema, lo que puede aprovecharse para implementar métodos de explotación basados en programación orientada a retornos (ROP - Return-Oriented Programming). Al usar la técnica ROP, el atacante no intenta colocar su código en la memoria, sino que opera con fragmentos de instrucciones de máquina ya existentes en las bibliotecas cargadas, que terminan con una instrucción de retorno de control (normalmente, esto son los finales de las funciones de biblioteca). La explotación se reduce a construir una cadena de llamadas a bloques similares ("gadgets") para obtener la funcionalidad deseada.


Fuente: opennet.ru
