# AWS - Nitro Enum

{{#include ../../../../banners/hacktricks-training.md}}

## 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**](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli#run-connect-and-terminate-the-enclave). 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**](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli#run-connect-and-terminate-the-enclave), 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`**:

<pre class="language-bash"><code class="lang-bash">nitro-cli describe-enclaves

[
{
"EnclaveName": "secure-channel-example",
"EnclaveID": "i-0bc274f83ade02a62-enc18ef3d09c886748",
"ProcessID": 10131,
<strong>    "EnclaveCID": 16,
</strong>    "NumberOfCPUs": 2,
"CPUIDs": [
1,
3
],
"MemoryMiB": 1024,
"State": "RUNNING",
"Flags": "DEBUG_MODE",
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
]
</code></pre>

> [!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**](https://github.com/carlospolop/Vsock-scanner).

### Vsock Server/Listener

Pronađite ovde nekoliko primera:

- [https://github.com/aws-samples/aws-nitro-enclaves-workshop/blob/main/resources/code/my-first-enclave/secure-local-channel/server.py](https://github.com/aws-samples/aws-nitro-enclaves-workshop/blob/main/resources/code/my-first-enclave/secure-local-channel/server.py)

<details>

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

Primeri:

- [https://github.com/aws-samples/aws-nitro-enclaves-workshop/blob/main/resources/code/my-first-enclave/secure-local-channel/client.py](https://github.com/aws-samples/aws-nitro-enclaves-workshop/blob/main/resources/code/my-first-enclave/secure-local-channel/client.py)

<details>

<summary>Jednostavni Python Klijent</summary>
```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

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**](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-3-cryptographic-attestation#a-unique-feature-on-nitro-enclaves), ovo su PCR vrednosti:

<table><thead><tr><th width="97">PCR</th><th width="221">Hash of ...</th><th>Opis</th></tr></thead><tbody><tr><td>PCR0</td><td>Fajl slike enklave</td><td>Kontinuirano merenje sadržaja fajla slike, bez podataka o sekciji.</td></tr><tr><td>PCR1</td><td>Linux kernel i bootstrap</td><td>Kontinuirano merenje podataka kernela i boot ramfs.</td></tr><tr><td>PCR2</td><td>Aplikacija</td><td>Kontinuirano, u redosledu merenje korisničkih aplikacija, bez boot ramfs.</td></tr><tr><td>PCR3</td><td>IAM uloga dodeljena roditeljskoj instanci</td><td>Kontinuirano merenje IAM uloge dodeljene roditeljskoj instanci. Osigurava da proces atestacije uspeva samo kada roditeljska instanca ima ispravnu IAM ulogu.</td></tr><tr><td>PCR4</td><td>ID instance roditeljske instance</td><td>Kontinuirano merenje ID-a roditeljske instance. Osigurava da proces atestacije uspeva samo kada roditeljska instanca ima specifičan ID instance.</td></tr><tr><td>PCR8</td><td>Potpisni sertifikat fajla slike enklave</td><td>Merenje 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.</td></tr></tbody></table>

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

- [https://medium.com/@F.DL/understanding-vsock-684016cf0eb0](https://medium.com/@F.DL/understanding-vsock-684016cf0eb0)
- Sve delove Nitro tutorijala od AWS: [https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli)

{{#include ../../../../banners/hacktricks-training.md}}
