AWS - Nitro Enum
Reading time: 11 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Grundlegende Informationen
AWS Nitro ist eine Suite von innovativen Technologien, die die zugrunde liegende Plattform für AWS EC2-Instanzen bilden. Von Amazon eingeführt, um Sicherheit, Leistung und Zuverlässigkeit zu verbessern, nutzt Nitro maßgeschneiderte Hardwarekomponenten und einen leichten Hypervisor. Es abstrahiert einen Großteil der traditionellen Virtualisierungsfunktionen auf dedizierte Hardware und Software, minimiert die Angriffsfläche und verbessert die Ressourceneffizienz. Durch das Auslagern von Virtualisierungsfunktionen ermöglicht Nitro EC2-Instanzen, nahezu Bare-Metal-Leistung zu liefern, was es besonders vorteilhaft für ressourcenintensive Anwendungen macht. Darüber hinaus gewährleistet der Nitro Security Chip speziell die Sicherheit der Hardware und Firmware und festigt somit seine robuste Architektur.
Nitro Enclaves
AWS Nitro Enclaves bietet eine sichere, isolierte Rechenumgebung innerhalb von Amazon EC2-Instanzen, die speziell für die Verarbeitung hochsensibler Daten entwickelt wurde. Durch die Nutzung des AWS Nitro Systems gewährleisten diese Enclaves robuste Isolation und Sicherheit, ideal für den Umgang mit vertraulichen Informationen wie PII oder Finanzunterlagen. Sie verfügen über eine minimalistische Umgebung, die das Risiko einer Datenexposition erheblich reduziert. Darüber hinaus unterstützen Nitro Enclaves die kryptografische Attestierung, die es Benutzern ermöglicht zu überprüfen, dass nur autorisierter Code ausgeführt wird, was entscheidend für die Einhaltung strenger Compliance- und Datenschutzstandards ist.
caution
Nitro Enclave-Images werden von innerhalb von EC2-Instanzen ausgeführt und Sie können im AWS-Webkonsole nicht sehen, ob eine EC2-Instanz Images in Nitro Enclave ausführt oder nicht.
Nitro Enclave CLI-Installation
Befolgen Sie alle Anweisungen aus der Dokumentation. Dies sind jedoch die wichtigsten:
# 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
Die Bilder, die Sie in Nitro Enclave ausführen können, basieren auf Docker-Bildern, sodass Sie Ihre Nitro Enclave-Bilder aus Docker-Bildern wie: erstellen können:
# 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
Wie Sie sehen können, verwenden die Nitro Enclave-Images die Erweiterung eif
(Enclave Image File).
Die Ausgabe wird ähnlich aussehen wie:
Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
Führen Sie ein Image aus
Laut der Dokumentation müssen Sie, um ein Enklaven-Image auszuführen, ihm mindestens das Vierfache der Größe der eif
-Datei zuweisen. Es ist möglich, die Standardressourcen, die ihm zugewiesen werden, in der Datei zu konfigurieren.
/etc/nitro_enclaves/allocator.yaml
caution
Denken Sie immer daran, dass Sie auch einige Ressourcen für die übergeordnete EC2-Instanz reservieren müssen!
Nachdem Sie die Ressourcen kennen, die einem Image zugewiesen werden sollen, und sogar die Konfigurationsdatei geändert haben, ist es möglich, ein Enklaven-Image mit folgendem Befehl auszuführen:
# 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
Enklaven auflisten
Wenn Sie einen EC2-Host kompromittieren, ist es möglich, eine Liste der laufenden Enklaven-Images mit: zu erhalten
nitro-cli describe-enclaves
Es ist nicht möglich, eine Shell innerhalb eines laufenden Enklaven-Images zu erhalten, da dies der Hauptzweck der Enklave ist. Wenn Sie jedoch den Parameter --debug-mode
verwendet haben, ist es möglich, die stdout davon mit:
ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}
Enklaven beenden
Wenn ein Angreifer eine EC2-Instanz kompromittiert, kann er standardmäßig nicht auf eine Shell innerhalb dieser zugreifen, aber er wird in der Lage sein, sie mit beenden zu:
nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}
Vsocks
Der einzige Weg, um mit einem enclave laufenden Image zu kommunizieren, ist die Verwendung von vsocks.
Virtual Socket (vsock) ist eine Socket-Familie in Linux, die speziell entwickelt wurde, um die Kommunikation zwischen virtuellen Maschinen (VMs) und ihren Hypervisoren oder zwischen VMs untereinander zu erleichtern. Vsock ermöglicht eine effiziente, bidirektionale Kommunikation, ohne auf den Netzwerk-Stack des Hosts angewiesen zu sein. Dies ermöglicht es VMs, auch ohne Netzwerkkonfigurationen zu kommunizieren, indem sie eine 32-Bit Context ID (CID) und Portnummern verwenden, um Verbindungen zu identifizieren und zu verwalten. Die vsock API unterstützt sowohl Stream- als auch Datagram-Socket-Typen, ähnlich wie TCP und UDP, und bietet ein vielseitiges Werkzeug für Anwendungen auf Benutzerebene in virtuellen Umgebungen.
tip
Daher sieht eine vsock-Adresse folgendermaßen aus: <CID>:<Port>
Um die CIDs der laufenden Enclave-Images zu finden, können Sie einfach den folgenden Befehl ausführen und die EnclaveCID
abrufen:
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
Beachten Sie, dass es vom Host aus keine Möglichkeit gibt zu wissen, ob eine CID einen Port exponiert! Es sei denn, Sie verwenden einen vsock-Port-Scanner wie https://github.com/carlospolop/Vsock-scanner.
Vsock Server/Listener
Hier finden Sie ein paar Beispiele:
Einfacher Python Listener
#!/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.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}")
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"
Vsock-Client
Beispiele:
Einfacher Python-Client
#!/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()
# Using socat
echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000
Vsock Proxy
Das Tool vsock-proxy ermöglicht es, einen vsock-Proxy mit einer anderen Adresse zu proxyen, zum Beispiel:
vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml
Dies wird den lokalen Port 8001 in vsock an ip-ranges.amazonaws.com:443
weiterleiten, und die Datei your-vsock-proxy.yaml
könnte diesen Inhalt haben, der den Zugriff auf ip-ranges.amazonaws.com:443
ermöglicht:
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }
Es ist möglich, die vsock-Adressen (<CID>:<Port>
) zu sehen, die vom EC2-Host verwendet werden (beachten Sie das 3:8001
, 3 ist die CID und 8001 der 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 Attestierung & KMS
Das Nitro Enclaves SDK ermöglicht es einer Enklave, ein kryptografisch signiertes Attestierungsdokument vom Nitro Hypervisor anzufordern, das einzigartige Messwerte enthält, die spezifisch für diese Enklave sind. Diese Messwerte, die Hashes und Plattformkonfigurationsregister (PCRs) umfassen, werden während des Attestierungsprozesses verwendet, um die Identität der Enklave zu beweisen und Vertrauen zu externen Diensten aufzubauen. Das Attestierungsdokument enthält typischerweise Werte wie PCR0, PCR1 und PCR2, die Sie bereits beim Erstellen und Speichern einer Enklave EIF getroffen haben.
Laut den docs sind dies die PCR-Werte:
PCR | Hash von ... | Beschreibung |
---|---|---|
PCR0 | Enklaven-Image-Datei | Eine zusammenhängende Messung des Inhalts der Image-Datei, ohne die Abschnittsdaten. |
PCR1 | Linux-Kernel und Bootstrap | Eine zusammenhängende Messung der Kernel- und Boot-Ramfs-Daten. |
PCR2 | Anwendung | Eine zusammenhängende, in der richtigen Reihenfolge gemessene Messung der Benutzeranwendungen, ohne das Boot-Ramfs. |
PCR3 | IAM-Rolle, die der übergeordneten Instanz zugewiesen ist | Eine zusammenhängende Messung der IAM-Rolle, die der übergeordneten Instanz zugewiesen ist. Stellt sicher, dass der Attestierungsprozess nur erfolgreich ist, wenn die übergeordnete Instanz die richtige IAM-Rolle hat. |
PCR4 | Instanz-ID der übergeordneten Instanz | Eine zusammenhängende Messung der ID der übergeordneten Instanz. Stellt sicher, dass der Attestierungsprozess nur erfolgreich ist, wenn die übergeordnete Instanz eine spezifische Instanz-ID hat. |
PCR8 | Signaturzertifikat der Enklaven-Image-Datei | Eine Messung des Signaturzertifikats, das für die Enklaven-Image-Datei angegeben ist. Stellt sicher, dass der Attestierungsprozess nur erfolgreich ist, wenn die Enklave von einer Enklaven-Image-Datei gestartet wurde, die von einem bestimmten Zertifikat signiert wurde. |
Sie können kryptografische Attestierung in Ihre Anwendungen integrieren und vorgefertigte Integrationen mit Diensten wie AWS KMS nutzen. AWS KMS kann Enklavenattestierungen validieren und bietet attestierungsbasierte Bedingungsschlüssel (kms:RecipientAttestation:ImageSha384
und kms:RecipientAttestation:PCR
) in seinen Schlüsselrichtlinien an. Diese Richtlinien stellen sicher, dass AWS KMS Operationen mit dem KMS-Schlüssel nur dann erlaubt, wenn das Attestierungsdokument der Enklave gültig ist und die festgelegten Bedingungen erfüllt.
tip
Beachten Sie, dass Enklaven im Debug-Modus (--debug) Attestierungsdokumente mit PCRs generieren, die aus Nullen bestehen (000000000000000000000000000000000000000000000000
). Daher werden KMS-Richtlinien, die diese Werte überprüfen, fehlschlagen.
PCR Umgehung
Aus der Perspektive eines Angreifers ist zu beachten, dass einige PCRs es ermöglichen würden, Teile oder das gesamte Enklaven-Image zu modifizieren und dennoch gültig zu bleiben (zum Beispiel überprüft PCR4 nur die ID der übergeordneten Instanz, sodass das Ausführen eines beliebigen Enklaven-Images in dieser EC2 diese potenzielle PCR-Anforderung erfüllen würde).
Daher könnte ein Angreifer, der die EC2-Instanz kompromittiert, in der Lage sein, andere Enklaven-Images auszuführen, um diese Schutzmaßnahmen zu umgehen.
Die Forschung darüber, wie man neue Images modifizieren/erstellen kann, um jede Schutzmaßnahme zu umgehen (insbesondere die nicht so offensichtlichen), steht noch aus.
Referenzen
- https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
- Alle Teile des Nitro-Tutorials von AWS: https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.