AWS - Nitro Enum
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Informations de base
AWS Nitro est une suite de technologies innovantes qui forme la plateforme sous-jacente pour les instances AWS EC2. Introduit par Amazon pour amĂ©liorer la sĂ©curitĂ©, la performance et la fiabilitĂ©, Nitro sâappuie sur des composants matĂ©riels personnalisĂ©s et un hyperviseur lĂ©ger. Il abstrait une grande partie des fonctionnalitĂ©s de virtualisation traditionnelles vers du matĂ©riel et des logiciels dĂ©diĂ©s, minimisant la surface dâattaque et amĂ©liorant lâefficacitĂ© des ressources. En dĂ©chargeant les fonctions de virtualisation, Nitro permet aux instances EC2 de fournir des performances proches du bare-metal, ce qui est particuliĂšrement bĂ©nĂ©fique pour les applications gourmandes en ressources. De plus, la puce de sĂ©curitĂ© Nitro garantit spĂ©cifiquement la sĂ©curitĂ© du matĂ©riel et du firmware, renforçant ainsi son architecture robuste.
Nitro Enclaves
AWS Nitro Enclaves fournit un environnement de calcul sĂ©curisĂ© et isolĂ© au sein des instances Amazon EC2, spĂ©cifiquement conçu pour le traitement de donnĂ©es hautement sensibles. Sâappuyant sur le systĂšme AWS Nitro, ces enclaves garantissent une isolation et une sĂ©curitĂ© robustes, idĂ©ales pour traiter des informations confidentielles telles que des donnĂ©es personnelles identifiables (PII) ou des dossiers financiers. Elles disposent dâun environnement minimaliste, rĂ©duisant considĂ©rablement le risque dâexposition des donnĂ©es. De plus, les Nitro Enclaves prennent en charge lâattestation cryptographique, permettant aux utilisateurs de vĂ©rifier que seul un code autorisĂ© est en cours dâexĂ©cution, ce qui est crucial pour maintenir des normes strictes de conformitĂ© et de protection des donnĂ©es.
Caution
Les images Nitro Enclave sont exĂ©cutĂ©es depuis lâintĂ©rieur des instances EC2 et vous ne pouvez pas voir depuis la console web AWS si une instance EC2 exĂ©cute des images dans Nitro Enclave ou non.
Installation du CLI Nitro Enclave
Suivez toutes les instructions de la documentation. Cependant, voici les plus 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
Images Nitro Enclave
Les images que vous pouvez exĂ©cuter dans Nitro Enclave sont basĂ©es sur des images docker, vous pouvez donc crĂ©er vos images Nitro Enclave Ă partir dâimages docker comme :
# 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
Comme vous pouvez le voir, les images Nitro Enclave utilisent lâextension eif (Fichier dâImage dâEnclave).
La sortie ressemblera Ă :
Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
Exécuter une image
Selon la documentation, pour exĂ©cuter une image dâenclave, vous devez lui attribuer une mĂ©moire de au moins 4 fois la taille du fichier eif. Il est possible de configurer les ressources par dĂ©faut Ă lui attribuer dans le fichier.
/etc/nitro_enclaves/allocator.yaml
Caution
Nâoubliez jamais que vous devez rĂ©server des ressources pour lâinstance EC2 parente Ă©galement !
AprĂšs avoir connu les ressources Ă attribuer Ă une image et mĂȘme aprĂšs avoir modifiĂ© le fichier de configuration, il est possible dâexĂ©cuter une image dâenclave avec :
# 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
ĂnumĂ©rer les enclaves
Si vous compromettez un hĂŽte EC2, il est possible dâobtenir une liste des images dâenclave en cours dâexĂ©cution avec :
nitro-cli describe-enclaves
Il nâest pas possible dâobtenir un shell Ă lâintĂ©rieur dâune image dâenclave en cours dâexĂ©cution car câest le principal objectif de lâenclave, cependant, si vous utilisez le paramĂštre --debug-mode, il est possible dâobtenir le stdout avec :
ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}
Terminer les enclaves
Si un attaquant compromet une instance EC2, par dĂ©faut, il ne pourra pas obtenir un shell Ă lâintĂ©rieur, mais il pourra les terminer avec :
nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}
Vsocks
Le seul moyen de communiquer avec une enclave exĂ©cutant une image est dâutiliser vsocks.
Virtual Socket (vsock) est une famille de sockets dans Linux spĂ©cifiquement conçue pour faciliter la communication entre les machines virtuelles (VMs) et leurs hyperviseurs, ou entre les VMs elles-mĂȘmes. Vsock permet une communication efficace et bidirectionnelle sans dĂ©pendre de la pile rĂ©seau de lâhĂŽte. Cela permet aux VMs de communiquer mĂȘme sans configurations rĂ©seau, en utilisant un ID de contexte de 32 bits (CID) et des numĂ©ros de port pour identifier et gĂ©rer les connexions. LâAPI vsock prend en charge Ă la fois les types de sockets de flux et de datagrammes, similaires Ă TCP et UDP, fournissant un outil polyvalent pour les applications de niveau utilisateur dans des environnements virtuels.
Tip
Par conséquent, une adresse vsock ressemble à ceci :
<CID>:<Port>
Pour trouver les CIDs des images dâenclave en cours dâexĂ©cution, vous pouvez simplement exĂ©cuter la commande suivante et obtenir le 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
Notez quâĂ partir de lâhĂŽte, il nây a aucun moyen de savoir si un CID expose un port ! Ă moins dâutiliser un scanneur de port vsock comme https://github.com/carlospolop/Vsock-scanner.
Vsock Server/Listener
Trouvez ici quelques exemples :
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!"
Client Vsock
Exemples :
Client 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
Lâoutil vsock-proxy permet de proxy un vsock proxy avec une autre adresse, par exemple :
vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml
Cela redirigera le port local 8001 dans vsock vers ip-ranges.amazonaws.com:443 et le fichier your-vsock-proxy.yaml pourrait avoir ce contenu permettant dâaccĂ©der Ă ip-ranges.amazonaws.com:443 :
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }
Il est possible de voir les adresses vsock (<CID>:<Port>) utilisĂ©es par lâhĂŽte EC2 avec (notez le 3:8001, 3 est le CID et 8001 le port) :
sudo ss -l -p -n | grep v_str
v_str LISTEN 0 0 3:8001 *:* users:(("vsock-proxy",pid=9458,fd=3))
Nitro Enclave Atestation & KMS
Le SDK Nitro Enclaves permet Ă une enclave de demander un document dâattestation signĂ© cryptographiquement au Hyperviseur Nitro, qui inclut des mesures uniques spĂ©cifiques Ă cette enclave. Ces mesures, qui incluent des hashes et des registres de configuration de plateforme (PCRs), sont utilisĂ©es lors du processus dâattestation pour prouver lâidentitĂ© de lâenclave et Ă©tablir la confiance avec des services externes. Le document dâattestation contient gĂ©nĂ©ralement des valeurs comme PCR0, PCR1 et PCR2, que vous avez rencontrĂ©es auparavant lors de la crĂ©ation et de lâenregistrement dâun EIF dâenclave.
DâaprĂšs les docs, voici les valeurs PCR :
| PCR | Hash de ... | Description |
|---|---|---|
| PCR0 | Fichier image de l'enclave | Une mesure contiguë du contenu du fichier image, sans les données de section. |
| PCR1 | Noyau Linux et bootstrap | Une mesure contiguë des données du noyau et du ramfs de démarrage. |
| PCR2 | Application | Une mesure contiguë et ordonnée des applications utilisateur, sans le ramfs de démarrage. |
| PCR3 | RÎle IAM attribué à l'instance parente | Une mesure contiguë du rÎle IAM attribué à l'instance parente. Assure que le processus d'attestation réussit uniquement lorsque l'instance parente a le rÎle IAM correct. |
| PCR4 | ID de l'instance parente | Une mesure contiguë de l'ID de l'instance parente. Assure que le processus d'attestation réussit uniquement lorsque l'instance parente a un ID d'instance spécifique. |
| PCR8 | Certificat de signature du fichier image de l'enclave | Une mesure du certificat de signature spécifié pour le fichier image de l'enclave. Assure que le processus d'attestation réussit uniquement lorsque l'enclave a été démarrée à partir d'un fichier image d'enclave signé par un certificat spécifique. |
Vous pouvez intĂ©grer lâattestation cryptographique dans vos applications et tirer parti des intĂ©grations prĂ©construites avec des services comme AWS KMS. AWS KMS peut valider les attestations dâenclave et offre des clĂ©s de condition basĂ©es sur lâattestation (kms:RecipientAttestation:ImageSha384 et kms:RecipientAttestation:PCR) dans ses politiques de clĂ©s. Ces politiques garantissent quâAWS KMS permet des opĂ©rations utilisant la clĂ© KMS uniquement si le document dâattestation de lâenclave est valide et rĂ©pond aux conditions spĂ©cifiĂ©es.
Tip
Notez que les Enclaves en mode debug (âdebug) gĂ©nĂšrent des documents dâattestation avec des PCR composĂ©s de zĂ©ros (
000000000000000000000000000000000000000000000000). Par conséquent, les politiques KMS vérifiant ces valeurs échoueront.
PCR Bypass
Du point de vue dâun attaquant, notez que certains PCR permettraient de modifier certaines parties ou lâensemble de lâimage de lâenclave et seraient toujours valides (par exemple, PCR4 vĂ©rifie uniquement lâID de lâinstance parente, donc exĂ©cuter nâimporte quelle image dâenclave dans cette EC2 permettra de satisfaire cette exigence potentielle de PCR).
Par consĂ©quent, un attaquant qui compromet lâinstance EC2 pourrait ĂȘtre en mesure dâexĂ©cuter dâautres images dâenclave afin de contourner ces protections.
La recherche sur la façon de modifier/créer de nouvelles images pour contourner chaque protection (en particulier celles qui ne sont pas si évidentes) est encore à faire.
References
- https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
- Toutes les parties du tutoriel Nitro dâAWS : https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

