AWS - Nitro Enum
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Información Básica
AWS Nitro es un conjunto de tecnologías innovadoras que forman la plataforma subyacente para las instancias de AWS EC2. Introducido por Amazon para mejorar la seguridad, el rendimiento y la fiabilidad, Nitro aprovecha componentes de hardware personalizados y un hipervisor ligero. Abstrae gran parte de la funcionalidad de virtualización tradicional a hardware y software dedicados, minimizando la superficie de ataque y mejorando la eficiencia de los recursos. Al descargar funciones de virtualización, Nitro permite que las instancias de EC2 ofrezcan un rendimiento casi de metal desnudo, lo que lo hace particularmente beneficioso para aplicaciones que requieren muchos recursos. Además, el Nitro Security Chip asegura específicamente la seguridad del hardware y el firmware, solidificando aún más su robusta arquitectura.
Nitro Enclaves
AWS Nitro Enclaves proporciona un entorno de computación seguro y aislado dentro de las instancias de Amazon EC2, diseñado específicamente para procesar datos altamente sensibles. Aprovechando el AWS Nitro System, estos enclaves aseguran una aislación y seguridad robustas, ideales para manejar información confidencial como PII o registros financieros. Presentan un entorno minimalista, reduciendo significativamente el riesgo de exposición de datos. Además, Nitro Enclaves soporta la atestación criptográfica, permitiendo a los usuarios verificar que solo se está ejecutando código autorizado, crucial para mantener estándares estrictos de cumplimiento y protección de datos.
Caution
Las imágenes de Nitro Enclave se ejecutan desde dentro de las instancias de EC2 y no puedes ver desde la consola web de AWS si una instancia de EC2 está ejecutando imágenes en Nitro Enclave o no.
Instalación de Nitro Enclave CLI
Sigue todas las instrucciones de la documentación. Sin embargo, estas son las más importantes:
# Install tools
sudo amazon-linux-extras install aws-nitro-enclaves-cli -y
sudo yum install aws-nitro-enclaves-cli-devel -y
# Config perms
sudo usermod -aG ne $USER
sudo usermod -aG docker $USER
# Check installation
nitro-cli --version
# Start and enable the Nitro Enclaves allocator service.
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
Nitro Enclave Images
Las imágenes que puedes ejecutar en Nitro Enclave se basan en imágenes de docker, por lo que puedes crear tus imágenes de Nitro Enclave a partir de imágenes de docker como:
# You need to have the docker image accesible in your running local registry
# Or indicate the full docker image URL to access the image
nitro-cli build-enclave --docker-uri <docker-img>:<tag> --output-file nitro-img.eif
Como puedes ver, las imágenes de Nitro Enclave utilizan la extensión eif (Archivo de Imagen de Enclave).
La salida se verá similar a:
Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
Ejecutar una Imagen
Según la documentación, para ejecutar una imagen de enclave necesitas asignarle una memoria de al menos 4 veces el tamaño del archivo eif. Es posible configurar los recursos predeterminados que se le asignarán en el archivo.
/etc/nitro_enclaves/allocator.yaml
Caution
¡Recuerda siempre que necesitas reservar algunos recursos para la instancia EC2 padre también!
Después de conocer los recursos que se deben asignar a una imagen e incluso haber modificado el archivo de configuración, es posible ejecutar una imagen de enclave con:
# Restart the service so the new default values apply
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
# Indicate the CPUs and memory to give
nitro-cli run-enclave --cpu-count 2 --memory 3072 --eif-path hello.eif --debug-mode --enclave-cid 16
Enumerar Enclaves
Si comprometes un host EC2, es posible obtener una lista de imágenes de enclave en ejecución con:
nitro-cli describe-enclaves
No es posible obtener un shell dentro de una imagen de enclave en ejecución porque ese es el propósito principal del enclave, sin embargo, si usaste el parámetro --debug-mode, es posible obtener el stdout de él con:
ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}
Terminar Enclaves
Si un atacante compromete una instancia de EC2, por defecto no podrá obtener un shell dentro de ellas, pero podrá terminarlas con:
nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}
Vsocks
La única forma de comunicarse con una enclave que ejecuta imágenes es utilizando vsocks.
Virtual Socket (vsock) es una familia de sockets en Linux diseñada específicamente para facilitar la comunicación entre máquinas virtuales (VMs) y sus hipervisores, o entre las VMs mismas. Vsock permite una comunicación eficiente y bidireccional sin depender de la pila de red del host. Esto hace posible que las VMs se comuniquen incluso sin configuraciones de red, utilizando un ID de Contexto de 32 bits (CID) y números de puerto para identificar y gestionar conexiones. La API de vsock admite tanto tipos de sockets de flujo como de datagramas, similar a TCP y UDP, proporcionando una herramienta versátil para aplicaciones de nivel de usuario en entornos virtuales.
Tip
Por lo tanto, una dirección vsock se ve así:
<CID>:<Port>
Para encontrar los CIDs de las imágenes de enclave en ejecución, puedes ejecutar el siguiente comando y obtener el EnclaveCID:
nitro-cli describe-enclaves
[
{
"EnclaveName": "secure-channel-example",
"EnclaveID": "i-0bc274f83ade02a62-enc18ef3d09c886748",
"ProcessID": 10131,
"EnclaveCID": 16,
"NumberOfCPUs": 2,
"CPUIDs": [
1,
3
],
"MemoryMiB": 1024,
"State": "RUNNING",
"Flags": "DEBUG_MODE",
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
]
Warning
Ten en cuenta que desde el host no hay forma de saber si un CID está exponiendo algún puerto. ¡A menos que se utilice algún escáner de puertos vsock como https://github.com/carlospolop/Vsock-scanner.
Vsock Server/Listener
Encuentra aquí un par de ejemplos:
Simple Python Listener
```python #!/usr/bin/env python3From
https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
import socket
CID = socket.VMADDR_CID_HOST PORT = 9999
s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) s.bind((CID, PORT)) s.listen() (conn, (remote_cid, remote_port)) = s.accept()
print(f“Connection opened by cid={remote_cid} port={remote_port}“)
while True: buf = conn.recv(64) if not buf: break
print(f“Received bytes: {buf}“)
</details>
```bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"
Cliente Vsock
Ejemplos:
Cliente Python Simple
```python #!/usr/bin/env python3#From https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
import socket
CID = socket.VMADDR_CID_HOST PORT = 9999
s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) s.connect((CID, PORT)) s.sendall(b“Hello, world!“) s.close()
</details>
```bash
# Using socat
echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000
Vsock Proxy
La herramienta vsock-proxy permite hacer proxy de un vsock proxy con otra dirección, por ejemplo:
vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml
Esto redirigirá el puerto local 8001 en vsock a ip-ranges.amazonaws.com:443 y el archivo your-vsock-proxy.yaml podría tener este contenido que permite acceder a ip-ranges.amazonaws.com:443:
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }
Es posible ver las direcciones vsock (<CID>:<Port>) utilizadas por el host EC2 con (nota el 3:8001, 3 es el CID y 8001 el puerto):
sudo ss -l -p -n | grep v_str
v_str LISTEN 0 0 3:8001 *:* users:(("vsock-proxy",pid=9458,fd=3))
Atestación de Nitro Enclave y KMS
El SDK de Nitro Enclaves permite a una enclave solicitar un documento de atestación firmado criptográficamente del Hypervisor de Nitro, que incluye mediciones únicas específicas de esa enclave. Estas mediciones, que incluyen hashes y registros de configuración de plataforma (PCRs), se utilizan durante el proceso de atestación para probar la identidad de la enclave y generar confianza con servicios externos. El documento de atestación típicamente contiene valores como PCR0, PCR1 y PCR2, que ya has encontrado antes al construir y guardar un EIF de enclave.
De los docs, estos son los valores de PCR:
| PCR | Hash de ... | Descripción |
|---|---|---|
| PCR0 | Archivo de imagen de enclave | Una medida contigua del contenido del archivo de imagen, sin los datos de sección. |
| PCR1 | Núcleo de Linux y bootstrap | Una medición contigua de los datos del núcleo y del ramfs de arranque. |
| PCR2 | Aplicación | Una medición contigua y en orden de las aplicaciones de usuario, sin el ramfs de arranque. |
| PCR3 | Rol de IAM asignado a la instancia principal | Una medición contigua del rol de IAM asignado a la instancia principal. Asegura que el proceso de atestación tenga éxito solo cuando la instancia principal tenga el rol de IAM correcto. |
| PCR4 | ID de instancia de la instancia principal | Una medición contigua del ID de la instancia principal. Asegura que el proceso de atestación tenga éxito solo cuando la instancia principal tenga un ID de instancia específico. |
| PCR8 | Certificado de firma del archivo de imagen de enclave | Una medida del certificado de firma especificado para el archivo de imagen de enclave. Asegura que el proceso de atestación tenga éxito solo cuando la enclave se haya iniciado desde un archivo de imagen de enclave firmado por un certificado específico. |
Puedes integrar atestación criptográfica en tus aplicaciones y aprovechar integraciones preconstruidas con servicios como AWS KMS. AWS KMS puede validar atestaciones de enclave y ofrece claves de condición basadas en atestación (kms:RecipientAttestation:ImageSha384 y kms:RecipientAttestation:PCR) en sus políticas de clave. Estas políticas aseguran que AWS KMS permite operaciones utilizando la clave KMS solo si el documento de atestación de la enclave es válido y cumple con las condiciones especificadas.
Tip
Ten en cuenta que las Enclaves en modo de depuración (–debug) generan documentos de atestación con PCRs que están compuestos de ceros (
000000000000000000000000000000000000000000000000). Por lo tanto, las políticas de KMS que verifican estos valores fallarán.
Bypass de PCR
Desde la perspectiva de un atacante, observa que algunos PCRs permitirían modificar algunas partes o toda la imagen de enclave y seguirían siendo válidos (por ejemplo, PCR4 solo verifica el ID de la instancia principal, por lo que ejecutar cualquier imagen de enclave en esa EC2 permitirá cumplir con este posible requisito de PCR).
Por lo tanto, un atacante que comprometa la instancia EC2 podría ser capaz de ejecutar otras imágenes de enclave para eludir estas protecciones.
La investigación sobre cómo modificar/crear nuevas imágenes para eludir cada protección (especialmente las que no son tan obvias) sigue siendo TODO.
Referencias
- https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
- Todas las partes del tutorial de Nitro de AWS: https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks Cloud

