El caso contra el uso de SGX en su proyecto cripto

Los entornos de ejecución de confianza (TEE) como el SGX de Intel son un tema controvertido dentro de la criptografía. ¿Son realmente una bala de plata segura y aislada, o todos debemos ser cautelosos? En este artículo, cubrimos por qué la comunidad Witnet ha optado por no adoptarlos en este momento, y las implicaciones que tiene la decisión sobre el Protocolo Witnet.

Una y otra vez, la última década ha demostrado que la co-residencia de hardware entre el atacante y la víctima ya no es una hazaña desafiante. De hecho, se han lanzado ataques exitosos basados ​​en hardware en entornos de nube, en teléfonos inteligentes y en una variedad de otros medios. Si bien estos ataques se han vuelto más comunes, también lo ha sido la adopción de entornos de ejecución de confianza (TEE).

En resumen, los TEE son piezas de hardware "aisladas" (comillas intencionales ?), diseñadas para ser inaccesibles a cualquier sistema operativo potencialmente malicioso. Con este objetivo audaz en mente, los TEE pueden parecer el entorno perfecto para que las aplicaciones puedan realizar operaciones delicadas.

Sin embargo, si bien los diseñadores de hardware se han centrado en crear hardware más eficiente, con demasiada frecuencia han ignorado las implicaciones de seguridad posteriores. En consecuencia, una gran cantidad de recursos de hardware se comparte entre enclaves y procesos regulares del sistema operativo, lo que ha llevado a la explotación en varios componentes de la microarquitectura TEE.

Si bien los TEE pueden reducir la superficie de los ataques de hardware puro, también proporcionan un entorno mucho más controlado (y atractivo) para los actores maliciosos.

TEE mecanismos de protección incorporados

Hay una serie de contramedidas que los TEE¹ han implementado para reducir el riesgo de espionaje malicioso (manipulación de los datos adjuntos):

Motores de cifrado de memoria: Los TEE generalmente usan una sección RAM especial que contiene los datos operables en forma encriptada. Estos datos se descifran cuando la CPU funciona con ellos.Atestación remota: El proceso de verificar que un enclave ha sido instanciado en un entorno de hardware seguro y que el código no ha sido manipulado. Implica aprovisionar el enclave (proporcionarle una clave de certificación).Certificación local: El proceso mediante el cual un enclave de origen prueba a un enclave de destino que se está ejecutando en el mismo módulo de hardware seguro.Almacenamiento sellado: La capacidad de almacenar persistentemente los secretos del enclave en el disco en forma cifrada. Una clave almacenada en la matriz de fusibles del procesador (desconocida incluso para el fabricante) se utiliza para derivar claves de sellado para diferentes enclaves.

¿Son las TEE tan aisladas como dicen ser?

Muchos de los componentes de las microarquitecturas de hardware TEE comparten constantemente información, interna o externamente. Por ejemplo:

Todas las funciones de TEE sistemas multinúcleoy algunos (por ejemplo, Intel SGX¹) tecnología hyperthreading. Los sistemas multinúcleo permiten un uso más eficiente de los recursos al permitir varios subprocesos en paralelo. Además, los cachés sirven como intermediarios de almacenamiento más rápidos, ubicados estratégicamente entre los núcleos y la memoria principal, y contienen fragmentos de memoria a los que se accedió recientemente. Normalmente, hay varios niveles de caché, algunos de los cuales son privados de núcleo y otros (generalmente al menos uno) compartidos entre todos los núcleos.Unidades de predicción de rama (BPU) son componentes de hardware creados para predecir los resultados de la rama en función del comportamiento pasado. Si la predicción es correcta, la BPU ejecuta previamente las instrucciones que necesitará la CPU. Sin embargo, si la predicción es incorrecta, la tubería se vacía, lo que resultará en un retraso notablemente externo mientras se ejecuta un salto condicional.Búfer Lookaside de transacción (TLB) están a cargo de mantener traducciones recientes, ya sean virtuales o físicas. Cada vez que se accede a una pieza de memoria, se consulta al TLB para su traducción de virtual a física, actuando como caché para las páginas de memoria. La dirección física se utiliza más tarde para verificar la existencia de la pieza de memoria en la microarquitectura cache.armv8

Si bien compartir información sobre estos componentes microarquitectónicos mejora la eficiencia, al hacerlo, existe el riesgo de exponer información confidencial. Por ejemplo:

Las cachés pierden información sobre la posición de la caché cuando se accede a través de otro proceso. Las UPP filtran información sobre las rutas tomadas por el software de la víctima. Los TLB pueden filtrar la actividad de la página, que un atacante podría verificar para ver si esas traducciones ocurren solo en una de las ramas.

Para el resto de este artículo, profundizaremos en los ejemplos anteriores y cubriremos los casos en que estos puntos débiles microarquitectónicos se han explotado en los últimos años.

Superficie de ataque SGX de Intel

Explotando la caché

Como ya hemos visto, los cachés se comparten entre varios procesos dentro de la CPU y los TEE. Al observar tiempos de acceso más rápidos, los atacantes pueden inferir a qué posiciones o piezas de memoria ha accedido un proceso de víctima. El atacante podría inferir que hay una región de memoria compartida por la víctima y el atacante, por ejemplo, en forma de biblioteca compartida. El clflush instrucción desde la Instruction Set Architecture se ejecuta, lo que elimina una parte particular de la memoria de la jerarquía de caché. Si el proceso de la víctima utiliza la memoria vacía, el proceso de ataque tiene un tiempo de acceso más rápido, ya que está accediendo desde el caché². Por el contrario, si la memoria se obtiene de la RAM, el tiempo de acceso es más lento. Si bien es cierto que, en principio, el enclave tiene su propia región de memoria protegida, un enclave puede acceder a código externo y, por lo tanto, es susceptible de ser atacado por otros procesos.

Incluso si no existen regiones de memoria compartida, los ataques de caché aún son posibles. En este caso, el atacante puede llenar todo el caché y verificar a qué posiciones ha accedido el proceso de la víctima³. Como se mencionó anteriormente, las posiciones a las que no accede la víctima se traducirán en tiempos de acceso más rápidos. Una suposición típica es que un atacante conoce la posición en una página de memoria que tiene cierto código (por ejemplo, tablas para un cifrado AES). Desde allí, un atacante puede monitorear las posiciones en la memoria caché a las que se ha accedido, lo que puede conducir a una extracción secreta.

Ataque de descarga y recarga desde https://d3fa1t.ninja/2018/11/15/flush-reload/

Explotando la Unidad de Predicción de Rama

La Unidad de Predicción de Sucursales ha sido ampliamente estudiada como un recurso explotable para extraer información confidencial. En particular, la Unidad de Predicción de Rama intenta predecir si se tomará una rama o no, en función de los resultados anteriores de esa rama. Sin embargo, la unidad de predicción de rama es de tamaño finito y, por lo tanto, de forma muy similar a los cachés, se puede forzar la eliminación de porciones específicas de la BPU, lo que provocará una predicción no tomada⁴. Cuando la víctima finalmente ejecuta la rama objetivo, si se produce una predicción incorrecta, se activará una descarga de la tubería y habrá un retraso notable, que puede filtrar información confidencial.

Funcionalidad de predicción de rama

Explotando la ejecución especulativa

Este es uno de los casos más preocupantes en los que se puede recuperar información de un enclave de TEE. Sobre la base de la explotación de predicción de rama anterior, vale la pena señalar que las unidades de predicción de rama ejecutan especulativamente la instrucción predicha. Además, la instrucción ejecutada especulativamente deja un rastro microarquitectónico (es decir, en el caché); si se completa antes de que se calcule el verdadero resultado de la rama, un atacante puede obtener acceso a datos confidenciales⁵. Además, el atacante puede incluso entrenar a la Unidad de predicción de rama para ejecutar especulativamente un dispositivo específico, y luego observar su rastro microarquitectura.

Ataque de espectro

Explotación de la contención portuaria

Dado que los recursos también se comparten entre los procesos dentro de la utilización del puerto, se puede determinar la secuencia de instrucciones ejecutadas por un programa víctima mediante el monitoreo de su utilización del puerto. Como uno podría imaginar, la contención resulta en una ejecución más prolongada del proceso que se está espiando, y la falta de contención resulta en una ejecución más rápida⁶. Además, las instrucciones tienen un subconjunto de puertos desde los cuales se pueden emitir. Por lo tanto, detectar la granularidad de, por ejemplo, la ejecución de la instrucción vpermd (que solo puede emitirse al puerto número 5 en las arquitecturas Intel) proporciona una huella clara de la ruta ejecutada. SGX, como se señala en este pdf, es vulnerable a este canal lateral.

Explotación de los topes de transacciones de Lookaside

Los Buffers Lookaside de Transacción (TLB) están a cargo de mantener páginas de memoria virtual y física recientemente traducidas. Los TLB son recursos compartidos entre núcleos lógicos y, por lo tanto, se pueden usar como punto de ataque. Si bien solo pueden recopilar información en una granularidad de página de memoria (4KB), si un código vulnerable realiza una ejecución de bifurcación dependiente del secreto, un atacante puede monitorear la actividad del TLB y verificar si ciertas traducciones de TLB ocurren solo en uno de las ramas⁷. Si es así, se podría realizar un ataque similar a los que usan cachés: se llena el TLB y se mide el tiempo de recuperación para cada página de memoria cuando se ha ejecutado el proceso de la víctima.

Ataque TLBB

Explotando el buffer de relleno

El búfer de relleno de línea sirve como una interfaz entre cachés. Se utiliza cuando hay un caché incorrecto y realiza un seguimiento de las cargas de memoria pendientes; por ejemplo, cuando se intenta acceder a regiones no almacenables en caché o movimientos no temporales. Cada vez que se registra una solicitud de carga, si no fue un golpe L1, la pieza de memoria se almacena temporalmente en el búfer de llenado y se libera después de que se haya satisfecho la carga. Similar a los ataques de ejecución especulativa, bajo ciertos escenarios de microarquitectura, el valor se lee desde el buffer de línea antes de volver a emitirse⁸. Sin embargo, el valor de salida corresponde a ese momento preciso en el búfer de línea, que abre un conjunto completamente nuevo de posibles ataques.

El ataque ZomieLoad⁸ en el búfer de relleno

Ataques de falla contra TEE

Los ataques de falla ocurren cuando un atacante induce cambios de bits a regiones de memoria a las que no debería tener acceso (normalmente obtenidas mediante la manipulación física del hardware). Estos son típicamente inducidos por un suministro de voltaje inusual o cambio de frecuencia. El "ataque de martillo de remo", por ejemplo, se realiza accediendo constantemente a ubicaciones adyacentes. En un caso reciente, se ejecutó un ataque de falla en el código dentro de un enclave seguro mediante el cambio del voltaje aplicado a la microarquitectura (mediante un registro especial denominado MSR) ⁹. Los efectos que tuvieron estos cambios de voltaje fueron omnipresentes y predecibles, y tuvieron enormes consecuencias, especialmente cuando se involucraron operaciones costosas como las multiplicaciones.

Trascendencia

En esta sección, revisaremos cómo estos ataques podrían afectar las suposiciones de seguridad hechas por algunos casos de uso de TEE populares en el espacio criptográfico.

Transacciones de entrada confidenciales¹²Ejecución confidencial: aquí nos referimos a un contrato inteligente que externaliza la propiedad de confidencialidad a un TEE, como SGX. En este caso, los usuarios que interactúan con el contrato inteligente podrían cifrar sus entradas confidenciales con la clave del TEE, de modo que solo el código que se ejecuta dentro del enclave pueda descifrarlo y operarlo. Este caso es especialmente peligroso cuando una red de operadores de SGX ofrece sus TEE para este propósito. De hecho, un usuario malintencionado podría unirse a la red como operador de SGX y realizar ataques continuos de canal lateral junto con la ejecución del enclave.Fuente de aleatoriedad: Aquí, un contrato inteligente externaliza la generación aleatoria a uno o más enclaves y, por lo tanto, confía en el generador de números aleatorios de hardware ofrecido por los proveedores de hardware. Existen muchos casos de uso para generar números aleatorios, desde la generación de claves secretas hasta la selección aleatoria de comités. Si se utilizan herramientas de aleatoriedad para la ejecución confidencial (por ejemplo, generación de clave secreta), entonces son vulnerables a los atacantes de canal lateral. Si los números aleatorios generados son eventualmente públicos (por ejemplo, durante el proceso de selección del comité de un contrato inteligente), son menos susceptibles a ataques de canal lateral, ya que eventualmente pueden ser analizados. Sin embargo, se ha demostrado que los ataques de falla reducen previsiblemente la entropía generada por los generadores de números aleatorios random ¹⁰. De hecho, estos ataques, aunque no apuntan al RNG, ya son capaces de inducir cambios de bits dentro de enclaves SGX.

Conclusión

En verdad, la microarquitectura se ha convertido en un gigante complejo (y poco documentado), con puntos débiles explotables potencialmente innumerables. Esto muestra: los últimos años han visto un ataque tras otro publicado y predicho.

Obviamente, ningún sistema es completamente seguro, y imaginar lo contrario sería ingenuo. Es probable que se produzcan compensaciones de seguridad al aumentar la eficiencia y construir entornos de ejecución más complejos. Sin embargo, se deben realizar análisis de riesgos, especialmente cuando se trata de contratos inteligentes de alto riesgo.

Vale la pena señalar que, en casos de uso tradicional, los TEE son proporcionados por terceros confiables, que no tienen interés en intentar actuar de manera maliciosa (de hecho, muchos proveedores de TEE más grandes, como Amazon) tienen reputación en la línea, con precauciones de seguridad para partido). Por el contrario, para la mayoría de los casos de uso de TEE dentro de redes descentralizadas, la suposición implícita es que los usuarios dependerán de proveedores de TEE anónimos sin nada que perder al intentar actuar de manera maliciosa y todo para ganar.

Además, en comparación con otros tipos de ataques, la granularidad de los ataques a las TEE es alta, ya que los atacantes mantienen el control total sobre el sistema operativo y pueden escalar el proceso de la víctima todo lo que quieran.

En consecuencia, el Protocolo Witnet no admite puntos finales privados por el momento, solo API públicas. Los desarrolladores de contratos aún pueden usar API autenticadas, si no les importa divulgar la clave de acceso (por ejemplo, en el caso de claves de acceso temporales de solo lectura).

La comunidad está explorando diferentes formas de recuperar información de API autenticadas (sistemas como DECO¹³, snarks de conocimiento cero, cifrado homomórfico o cualquier otra tecnología de vanguardia que llegue al mercado), pero por el momento hemos descartado la opción de usar un TEE para ese propósito. Creemos que esto es lo mejor para todos los usuarios de Witnet, al menos hasta que nuestra comunidad considere que un entorno de ejecución es lo suficientemente seguro.

– – – –

Referencias

(1) Intel SGX explicado
(2) ¡Espera un minuto! Un ataque rápido y cruzado de VM en AES
(3) Los ataques de caché permiten la recuperación de claves masivas en la nube
(4) Sobre el poder en el análisis de predicción de rama
(5) Ataques de espectro: Explotación de la ejecución especulativa
(6) Contención portuaria por diversión y ganancias
(7) Buffer de fuga de traducción: Derrotando las protecciones de canal lateral de caché
con ataques TLB
(8) ZombieLoad: Muestreo de datos de límite de privilegios cruzados
(9) Plundervolt: ataques de inyección de fallos basados ​​en software
contra Intel SGX
(10) Explorando ataques de manipulación activa
en el generador de números aleatorios TERO,
(11) El impacto de la inyección de falla electromagnética pulsada en generadores de números aleatorios verdaderos
(12) Objetos de datos privados: una visión general
(13) DECO: Liberar datos web utilizando oráculos descentralizados para TLS