
CVE-2022-27499
Esta es la demo original del Ataque de Instantánea Inesperado encontrado por nosotros. Gracias a Intel por el Aviso de Seguridad.
En primer lugar, cualquiera que desee ejecutar la demo debe instalar Intel SGX SDK y Occlum (puedes optar por usar nuestro SDK SGX modificado). Proporcionamos un Dockerfile para una instalación rápida de Occlum/SDK. El SDK SGX modificado sirve para ayudar al atacante a decidir el momento.
También puedes instalar Occlum en la máquina anfitriona. (Consulta https://github.com/occlum/occlum para más detalles de instalación). De cualquier manera, necesitarás instalar el controlador Intel SGX en tu anfitrión primero, o usar un controlador SGX en el kernel.
(sudo) docker build -t $Your_Image_Name .
Después de construir la imagen, ejecuta
(sudo) docker run -it --privileged -p $Redis_Server_Port:6379 -v $Host_SGX_Driver_Path:/dev/sgx --name "snapshot-demo" $Your_Image_Name
Aquí $Redis_Server_Port es el número de puerto del anfitrión que deseas exponer para el servidor Redis dentro del contenedor, mientras que $Host_SGX_Driver_Path es la ruta del dispositivo mencionada anteriormente de tu controlador SGX instalado.
El programa objetivo se encuentra en la carpeta bash_redis.
El programa víctima ejecuta un script de bash-shell (occlum_bash.sh). Primero obtiene una contraseña aprovisionada para generar un archivo de configuración de Redis personalizado, con la entrada 'requirepass' completada. Luego invoca un servidor Redis, de acuerdo con el archivo de configuración personalizado.
Para construir el programa de generación de configuración, ejecuta make. Para construir el servidor Redis, ejecuta los siguientes comandos.
cd bash_redis
./download_and_build_redis_glibc.sh
Abre una terminal para la víctima. Ejecuta run_redis.sh, verificando que el servidor Redis funcione correctamente.
Usa el comando redis-cli -h $Redis_Server_IP -p $Redis_Server_Port -a admin123456 para verificar si la contraseña (admin123456) se ha establecido en el archivo de configuración.
Presiona ctrl + C para terminar el servidor Redis.
Prepara 2 terminales, una para la víctima y otra para el atacante. Solo puedes abrir una terminal adicional (para el atacante) si ya se ha abierto una terminal para la víctima.
Ejecuta run_redis.sh nuevamente en la terminal de la víctima. Este script iniciará el programa objetivo.
El atacante necesita tomar una instantánea (usando ./take_snapshot_step-1.sh) cuando pueda determinar que la instantánea se está volcando. En la demo, el atacante puede obtener un aviso claro desde la terminal de la víctima de la siguiente manera.
...
Run ./take_snapshot_step-1.sh NOW!
line 4522: # passwords, then flags, or key patterns. However note that the additive
line 4523: # and subtractive rules will CHANGE MEANING depending on the ordering.
line 4524: # For instance see the following example:
...
Lanza el script ./take_snapshot_step-1.sh en la terminal del atacante.
Si construyes Occlum con nuestro SDK SGX modificado, verás más mensajes de ayuda. Esto se debe a que modificamos la parte no confiable de Intel SGX SDK, imprimiendo mensajes de ayuda para facilitar que el atacante decida el momento. Para comodidad del atacante, reservamos intervalos de tiempo para permitir que el atacante ejecute ./take_snapshot_step-1.sh. De hecho, el atacante que tenga privilegio de root en el anfitrión podría interceptar la ejecución del enclave y capturar cualquier instantánea modificando la parte no confiable de SGX SDK.
Una vez que el servidor Redis esté en funcionamiento, ejecuta ./take_snapshot_step-2.sh para completar la recolección de la instantánea.
El atacante ejecuta replay_redis.sh para reproducir el enclave usando la instantánea recolectada. Cualquier cliente puede iniciar sesión en el servidor Redis sin autenticación.
Ejemplo de comando para el cliente Redis:
redis-cli -h $Redis_Server_IP -p $Redis_Server_Port
keys *
Si aparece un mensaje de (error) NOAUTH Authentication required., significa que necesitarás una contraseña para acceder al servidor Redis. Escribe auth $Your_Password para pasar la autenticación. Usa auth admin123456 en esta demo.
Si aparece un mensaje de (empty array), significa que no necesitas contraseña para acceder al servidor Redis.
A veces la demo falla debido a la verificación de integridad de Occlum. Probablemente veas el siguiente mensaje.
Replaying ...
~/snapshot-demo/bash_redis_replay/occlum_instance ~/snapshot-demo/bash_redis_replay
In: writing meta-data in write_all_changes_to_disk
In: writing meta-data in write_all_changes_to_disk
Error: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }
[ERROR] occlum-pal: The init process exit with code: 1 (line 59, file src/pal_api.c)
[ERROR] occlum-pal: Failed to run the init process: EINVAL (line 129, file src/pal_api.c)
Simplemente ejecuta la demo nuevamente (desde la fase de grabación), y el error desaparecerá para siempre.
¡Buena suerte y diviértete!