
SGXRay es una herramienta para automatizar la detección de vulnerabilidades para aplicaciones SGX
Intel SGX protege la lógica de aplicaciones aisladas y los datos confidenciales dentro de un enclave con cifrado de almacenamiento basado en hardware. El uso de un mecanismo de seguridad basado en hardware de este tipo requiere un modelo de programación estricto para el uso de la memoria, con API complejas dentro y fuera del límite del enclave. Los desarrolladores de enclave deben utilizar prácticas de programación cuidadosas para garantizar la seguridad del enclave, especialmente cuando se manejan datos que fluyen más allá del límite de confianza del enclave. Las infracciones de los límites de confianza también pueden provocar daños en la memoria y los atacantes pueden aprovecharlas para acceder a los datos protegidos y manipularlos. Actualmente, ninguna herramienta disponible públicamente puede detectar de manera efectiva estos problemas en enclaves reales.
SGXRay es una herramienta de razonamiento automatizada basada en el verificador SMACK que detecta automáticamente los errores de enclave de SGX resultantes de violaciones de los límites de confianza. Recompila un código de enclave dado y comienza a analizar desde una entrada de función de enclave personalizada. Tras el análisis, encuentra un manejo de puntero no válido dentro de una pila de software SGX, como
Actualmente, las aplicaciones SGXRay SGX se basan en dos SDK SGX: Intel SGX SDK y Openenclave SDK. Los usuarios pueden usar el código SDK para un análisis más completo.
Para un inicio rápido, siga una guía paso a paso sobre cómo usar SGXRay arriba de uno de los ejemplos de demostración aquí.
La siguiente figura muestra el flujo de trabajo de SGXRay.

Ejecutar SGXRay es un proceso de dos pasos. El primer paso es obtener un archivo LLVM-IR para la aplicación. El segundo paso es ir a SGXRay CLI para verificación.
En el primer paso, proporcionamos dos imágenes de Docker para cada SDK.
docker pull baiduxlab / sgx-ray-frontend-intel
docker pull baiduxlab / sgx-ray-frontend-oe
Puede encontrar instrucciones detalladas sobre cómo llevar a cabo el primer paso aquí.
Producción LLVM IR (BC)
El primer paso para ejecutar SGXRay es: a individual Archivo LLVM IR para una aplicación de enclave SGX. Ofrecemos dos imágenes de Docker para Intel SGX SDK y Open Enclave SDK.
Imagen de interfaz de usuario Intel SGX SDK
Esta imagen contiene Intel SDK SGX versión 2.12 y Clang versión 11.
Para obtener el LLVM-IR para su aplicación, ejecute el contenedor Docker de forma interactiva con el directorio de su aplicación adjunto.
cd # vaya al directorio raíz de su proyecto SGX
docker run -it –rm -v $ (pwd): / sgx -w / sgx –user $ UID: $ (id -g) baiduxlab / sgx-ray-frontend-intel: último
Por favor camine en el contenedor,
Fuente / opt / sgxsdk / environment
fuente /opt/smack-wllvm/default.environment
haz tu # comando de compilación
Extract-bc -l llvm-link-11 # esto debería ser enclave.so.bc. Produce
Abre la imagen de la interfaz del enclave
Esta imagen contiene la versión 0.16.1 de Openenclave y la versión 8 de Clang.
Para obtener el LLVM IR para su aplicación, ejecute el contenedor Docker de forma interactiva mientras el directorio de su aplicación está montado.
cd # vaya al directorio raíz de su proyecto SGX
docker run -it –rm -v $ (pwd): / sgx -w / sgx –user $ UID: $ (id -g) baiduxlab / sgx-ray-frontend-intel: último
Por favor camine en el contenedor,
Fuente / opt / openenclave / share / openenclave / openenclaverc
Fuente /opt/smack-wllvm/oe.environment
haz tu # comando de compilación
Extract-bc -l llvm-link-8 # esto debería ser enclave.so.bc. Produce
Para el segundo paso, también proporcionamos una imagen de Docker.
docker pull baiduxlab / sgx-ray-distro: más reciente
Puede encontrar instrucciones detalladas sobre cómo llevar a cabo el segundo paso aquí.
Verificación
Actualmente, el paso de verificación solo se puede realizar dentro del contenedor Docker que hemos proporcionado. Recomendamos ejecutarlo de forma interactiva en nuestra computadora de demostración con el siguiente comando:
cd # ir al directorio del enclave que contiene el archivo bc generado en el último paso
docker run –rm -it -v $ (pwd): / sgx -w / sgx –user $ UID baiduxlab / sgx-ray-distro
Debería poder llamar a SGXRay CLI dentro del contenedor sgx-ray
.
Descripción general de la CLI de verificación
Ofrecemos un archivo binario sgx-ray
que sirve como envoltorio para que SMACK valide las aplicaciones SGX. Las opciones se pueden ver a través de sgx-ray --help
. Actualmente hay dos verificadores de back-end: Boogie y Corral. Boogie tiende a ser más rápido, mientras que Corral ofrece mejores pistas de error. Recomendamos probar el boogie primero. Si se encuentra un contraejemplo, se puede utilizar Corral para comprenderlo mejor.
Uso básico de la CLI de verificación
El uso básico de SGXRay CLI es bastante sencillo. Digamos que el SDK que se utiliza para crear su aplicación es el SDK Intel SGX.
sgx-ray -intel-call-name
Puede encontrar los nombres de Ecall en el archivo EDL de su aplicación.
Las opciones importantes de SMACK se pueden encontrar al final del video de demostración. Aquí también repetimos los más importantes.
Recuerde, en el tutorial vemos que SGXRay ha invalidado con éxito el uso del puntero en el ecall_error1
La función de copytohost
. Si aplicamos el mismo comando a ecall_error2
, el error que se va a informar no se muestra aunque está presente. Esto se debe a que el error ocurre en la segunda iteración del bucle, mientras que SGXRay solo examina la primera iteración del bucle y luego asume que el programa saldrá. Para encontrar este error necesitamos la opción SMACK --unroll=2
que se puede activar con la opción de SGXRay --smack-options="--unroll=2"
.
sgx-ray enclave.so.bc –intel –ecall-name ecall_error2 –smack-options = «- unroll = 2»
Comprobación de puntero NULL
Hay dos opciones de SMACK relacionadas con las comprobaciones nulas – --enable-null-che
ck
y --enable-failing-malloc
. El primero permite la verificación nula dentro del enclave y el segundo indica que malloc puede fallar y devolver un puntero nulo. SGXRay no habilita la verificación de nulos de forma predeterminada porque las desreferencias de punteros nulos se consideran menos destructivas, a diferencia de otras vulnerabilidades, como escribir en cualquier lugar dentro de un enclave.
Construcción de Docker
Proporcionamos un Dockerfile que crea la imagen para el paso de verificación.
clon de git https://github.com/baiduxlab/sgxray.git && cd sgxray
Construye Docker. -t sgx-ray-distro-local -build-arg hostuid = $ UID -f Dockerfiles / Dockerfile-CLI
Una compilación exitosa debe tener una imagen nombrada. Produce sgx-ray-distro-local
quien tiene un usuario user
con el mismo ID de usuario que la cuenta de host.