AWS - Nitro Enum

Reading time: 11 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovne informacije

AWS Nitro je skup inovativnih tehnologija koje čine osnovnu platformu za AWS EC2 instance. Uveden od strane Amazona da poboljša bezbednost, performanse i pouzdanost, Nitro koristi prilagođene hardverske komponente i lagani hipervizor. Apstrahuje većinu tradicionalne funkcionalnosti virtualizacije na posvećen hardver i softver, minimizirajući površinu napada i poboljšavajući efikasnost resursa. Prebacivanjem funkcija virtualizacije, Nitro omogućava EC2 instancama da pružaju performanse blizu onih na fizičkom hardveru, što je posebno korisno za aplikacije koje zahtevaju mnogo resursa. Pored toga, Nitro Security Chip posebno osigurava bezbednost hardvera i firmvera, dodatno učvršćujući svoju robusnu arhitekturu.

Nitro Enklave

AWS Nitro Enclaves pruža sigurno, izolovano okruženje za obradu unutar Amazon EC2 instanci, posebno dizajnirano za obradu veoma osetljivih podataka. Koristeći AWS Nitro sistem, ove enklave osiguravaju robusnu izolaciju i bezbednost, idealne za rukovanje poverljivim informacijama kao što su PII ili finansijski podaci. Imaju minimalističko okruženje, značajno smanjujući rizik od izlaganja podataka. Pored toga, Nitro Enclaves podržavaju kriptografsku attestaciju, omogućavajući korisnicima da verifikuju da samo autorizovani kod radi, što je ključno za održavanje strogih standarda usklađenosti i zaštite podataka.

caution

Nitro Enclave slike se pokreću iznutra EC2 instanci i ne možete videti iz AWS web konzole da li EC2 instance pokreću slike u Nitro Enclave ili ne.

Instalacija Nitro Enclave CLI

Pratite sve upute iz dokumentacije. Međutim, ovo su najvažnije:

bash
# 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

Slike koje možete pokrenuti u Nitro Enclave su zasnovane na docker slikama, tako da možete kreirati svoje Nitro Enclave slike iz docker slika kao što su:

bash
# 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

Kao što možete videti, Nitro Enclave slike koriste ekstenziju eif (Enclave Image File).

Izlaz će izgledati slično:

Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}

Pokreni sliku

Prema dokumentaciji, da biste pokrenuli sliku enklave, potrebno je da joj dodelite memoriju od najmanje 4 puta veličine eif fajla. Moguće je konfigurisati podrazumevane resurse koje će joj dodeliti u fajlu.

shell
/etc/nitro_enclaves/allocator.yaml

caution

Uvek zapamtite da treba da rezervišete neke resurse za roditeljsku EC2 instancu!

Nakon što znate resurse koje treba dodeliti slici i čak ste izmenili konfiguracioni fajl, moguće je pokrenuti sliku enklave sa:

shell
# 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

Enumerate Enclaves

Ako kompromitujete EC2 host, moguće je dobiti listu pokrenutih slika enklava sa:

bash
nitro-cli describe-enclaves

Nije moguće dobiti shell unutar pokrenutog enclave imidža jer je to glavna svrha enclave, međutim, ako koristite parametar --debug-mode, moguće je dobiti stdout sa:

shell
ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}

Terminate Enclaves

Ako napadač kompromituje EC2 instancu, po defaultu neće moći da dobije shell unutar njih, ali će moći da terminate them sa:

shell
nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}

Vsocks

Jedini način za komunikaciju sa enklavom koja pokreće sliku je korišćenje vsocks.

Virtual Socket (vsock) je porodica soketa u Linuxu posebno dizajnirana da olakša komunikaciju između virtuelnih mašina (VMs) i njihovih hipervizora, ili između VMs sama. Vsock omogućava efikasnu, dvosmernu komunikaciju bez oslanjanja na mrežni stek hosta. Ovo omogućava VMs da komuniciraju čak i bez mrežnih konfiguracija, koristeći 32-bitni Context ID (CID) i brojeve portova za identifikaciju i upravljanje vezama. Vsock API podržava i stream i datagram tipove soketa, slično TCP i UDP, pružajući svestran alat za aplikacije na korisničkom nivou u virtuelnim okruženjima.

tip

Stoga, vsock adresa izgleda ovako: <CID>:<Port>

Da biste pronašli CIDs slika koje pokreće enklava, možete jednostavno izvršiti sledeću komandu i dobiti 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

Imajte na umu da sa hosta ne postoji način da se sazna da li CID izlaže neki port! Osim ako ne koristite neki vsock port skener kao https://github.com/carlospolop/Vsock-scanner.

Vsock Server/Listener

Pronađite ovde nekoliko primera:

Jednostavan Python Listener
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.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}")
bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"

Vsock Klijent

Primeri:

Jednostavni Python Klijent
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()
bash
# Using socat
echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000

Vsock Proxy

Alat vsock-proxy omogućava proksiranje vsock proksija sa drugom adresom, na primer:

bash
vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml

Ovo će proslediti lokalni port 8001 u vsock na ip-ranges.amazonaws.com:443, a datoteka your-vsock-proxy.yaml može imati ovaj sadržaj koji omogućava pristup ip-ranges.amazonaws.com:443:

yaml
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }

Moguće je videti vsock adrese (<CID>:<Port>) koje koristi EC2 host sa (obratite pažnju na 3:8001, 3 je CID, a 8001 port):

bash
sudo ss -l -p -n | grep v_str
v_str LISTEN 0      0                                                                              3:8001                   *:*     users:(("vsock-proxy",pid=9458,fd=3))

Nitro Enclave Atestacija & KMS

Nitro Enclaves SDK omogućava enklavi da zatraži kriptografski potpisan dokument o atestaciji od Nitro Hypervisora, koji uključuje jedinstvene merenja specifične za tu enklavu. Ova merenja, koja uključuju hash-ove i registre konfiguracije platforme (PCRs), koriste se tokom procesa atestacije da dokažu identitet enklave i izgrade poverenje sa spoljnim servisima. Dokument o atestaciji obično sadrži vrednosti kao što su PCR0, PCR1 i PCR2, koje ste već sreli prilikom izrade i čuvanja EIF-a enklave.

Sa docs, ovo su PCR vrednosti:

PCRHash of ...Opis
PCR0Fajl slike enklaveKontinuirano merenje sadržaja fajla slike, bez podataka o sekciji.
PCR1Linux kernel i bootstrapKontinuirano merenje podataka kernela i boot ramfs.
PCR2AplikacijaKontinuirano, u redosledu merenje korisničkih aplikacija, bez boot ramfs.
PCR3IAM uloga dodeljena roditeljskoj instanciKontinuirano merenje IAM uloge dodeljene roditeljskoj instanci. Osigurava da proces atestacije uspeva samo kada roditeljska instanca ima ispravnu IAM ulogu.
PCR4ID instance roditeljske instanceKontinuirano merenje ID-a roditeljske instance. Osigurava da proces atestacije uspeva samo kada roditeljska instanca ima specifičan ID instance.
PCR8Potpisni sertifikat fajla slike enklaveMerenje potpisnog sertifikata specificiranog za fajl slike enklave. Osigurava da proces atestacije uspeva samo kada je enklava pokrenuta iz fajla slike enklave potpisanog specifičnim sertifikatom.

Možete integrisati kriptografsku atestaciju u vaše aplikacije i iskoristiti unapred izgrađene integracije sa servisima kao što je AWS KMS. AWS KMS može validirati atestacije enklava i nudi ključeve zasnovane na atestaciji (kms:RecipientAttestation:ImageSha384 i kms:RecipientAttestation:PCR) u svojim politikama ključeva. Ove politike osiguravaju da AWS KMS dozvoljava operacije korišćenjem KMS ključa samo ako je dokument o atestaciji enklave validan i ispunjava specificirane uslove.

tip

Imajte na umu da Enklave u režimu debagovanja (--debug) generišu dokumente o atestaciji sa PCR-ima koji se sastoje od nula (000000000000000000000000000000000000000000000000). Stoga, KMS politike koje proveravaju ove vrednosti će propasti.

PCR Bypass

Iz perspektive napadača, primetite da neki PCR-i omogućavaju modifikaciju nekih delova ili cele slike enklave i da će i dalje biti validni (na primer, PCR4 samo proverava ID roditeljske instance, tako da pokretanje bilo koje slike enklave u toj EC2 će omogućiti ispunjavanje ovog potencijalnog PCR zahteva).

Stoga, napadač koji kompromituje EC2 instancu može biti u mogućnosti da pokrene druge slike enklava kako bi zaobišao ove zaštite.

Istraživanje o tome kako modifikovati/kreirati nove slike za zaobilaženje svake zaštite (posebno onih koje nisu tako očigledne) je još uvek TODO.

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks