# AWS - Nitro Enum

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

## Basiese Inligting

AWS Nitro is 'n suite van **innoverende tegnologieë** wat die onderliggende platform vir AWS EC2-instanties vorm. Ingevoerd deur Amazon om **veiligheid, prestasie en betroubaarheid** te **verbeter**, benut Nitro op maat gemaakte **hardewarekomponente en 'n liggewig hypervisor**. Dit abstraheer baie van die tradisionele virtualisering funksionaliteit na toegewyde hardeware en sagteware, **minimaliseer die aanvaloppervlak** en verbeter hulpbron doeltreffendheid. Deur virtualisering funksies af te laai, laat Nitro EC2-instanties toe om **naby bare-metal prestasie** te lewer, wat dit veral voordelig maak vir hulpbron-intensiewe toepassings. Boonop verseker die Nitro Veiligheidschip spesifiek die **veiligheid van die hardeware en firmware**, wat sy robuuste argitektuur verder versterk.

### Nitro Enclaves

**AWS Nitro Enclaves** bied 'n veilige, **geïsoleerde rekenaaromgewing binne Amazon EC2-instanties**, spesifiek ontwerp vir die verwerking van hoogs sensitiewe data. Deur die AWS Nitro Stelsel te benut, verseker hierdie enclaves robuuste **isolasie en veiligheid**, ideaal vir **die hantering van vertroulike inligting** soos PII of finansiële rekords. Hulle beskik oor 'n minimalistiese omgewing, wat die risiko van data blootstelling aansienlik verminder. Boonop ondersteun Nitro Enclaves kriptografiese attestering, wat gebruikers in staat stel om te verifieer dat slegs geautoriseerde kode loop, wat van kardinale belang is vir die handhawing van streng nakoming en databeskeringsstandaarde.

> [!CAUTION]
> Nitro Enclave beelde word **van binne EC2-instanties uitgevoer** en jy kan nie vanaf die AWS webkonsol sien of 'n EC2-instantie beelde in Nitro Enclave uitvoer of nie.

## Nitro Enclave CLI installasie

Volg al die instruksies [**uit die dokumentasie**](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). Hierdie is egter die belangrikste:
```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 Beelde

Die beelde wat jy in Nitro Enclave kan hardloop, is gebaseer op docker beelde, so jy kan jou Nitro Enclave beelde van docker beelde soos:
```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
```
Soos wat jy kan sien, gebruik die Nitro Enclave beelde die uitbreiding **`eif`** (Enclave Beeld Lêer).

Die uitvoer sal soortgelyk lyk aan:
```
Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
```
### Voer 'n Beeld uit

Volgens [**die dokumentasie**](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), om 'n enclave beeld uit te voer, moet jy dit toewys met geheue van **ten minste 4 keer die grootte van die `eif` lêer**. Dit is moontlik om die standaard hulpbronne wat aan dit gegee moet word in die lêer te konfigureer.
```shell
/etc/nitro_enclaves/allocator.yaml
```
> [!CAUTION]
> Onthou altyd dat jy **ook 'n paar hulpbronne vir die ouer EC2** instansie moet **bespreek**!

Nadat jy die hulpbronne weet wat aan 'n beeld gegee moet word en selfs die konfigurasie-lêer gewysig het, is dit moontlik om 'n enklave-beeld te laat loop met:
```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
```
### Enumereer Enklaves

As jy 'n EC2-gasheer kompromitteer, is dit moontlik om 'n lys van hardloop enklave-beelde te kry met:
```bash
nitro-cli describe-enclaves
```
Dit is **nie moontlik om 'n shell** binne 'n lopende enclave-beeld te kry nie, omdat dit die hoofdoel van die enclave is, egter, as jy die parameter **`--debug-mode`** gebruik, is dit moontlik om die **stdout** daarvan te kry met:
```shell
ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}
```
### Beëindig Enklaves

As 'n aanvaller 'n EC2-instantie kompromitteer, sal hy standaard nie in staat wees om 'n shell binne-in hulle te kry nie, maar hy sal in staat wees om hulle te **beëindig** met:
```shell
nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}
```
## Vsocks

Die enigste manier om te kommunikeer met 'n **enclave** wat 'n beeld uitvoer, is deur **vsocks**.

**Virtual Socket (vsock)** is 'n soketfamilie in Linux wat spesifiek ontwerp is om **kommunikasie** tussen virtuele masjiene (**VMs**) en hul **hypervisors**, of tussen VMs **selfs** te fasiliteer. Vsock stel doeltreffende, **bi-rigting kommunikasie** in staat sonder om op die gasheer se netwerkstapel te staatmaak. Dit maak dit moontlik vir VMs om te kommunikeer selfs sonder netwerk konfigurasies, **met 'n 32-bit Context ID (CID) en poortnommers** om verbindings te identifiseer en te bestuur. Die vsock API ondersteun beide stroom- en datagram soket tipes, soortgelyk aan TCP en UDP, wat 'n veelsydige hulpmiddel bied vir gebruikersvlak toepassings in virtuele omgewings.

> [!TIP]
> Daarom lyk 'n vsock adres soos volg: `<CID>:<Port>`

Om **CIDs** van die enclave wat beelde uitvoer te vind, kan jy eenvoudig die volgende cmd uitvoer en die **`EnclaveCID`** kry:

<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]
> Let daarop dat daar van die gasheer af geen manier is om te weet of 'n CID enige poort blootstel nie! Tensy jy 'n **vsock poort skandeerder soos** [**https://github.com/carlospolop/Vsock-scanner**](https://github.com/carlospolop/Vsock-scanner) gebruik.

### Vsock Server/Listener

Vind hier 'n paar voorbeelde:

- [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>Simple 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 Kliënt

Voorbeelde:

- [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>Simpele Python Kliënt</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

Die hulpmiddel vsock-proxy laat jou toe om 'n vsock-proxy met 'n ander adres te proxy, byvoorbeeld:
```bash
vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml
```
Dit sal die **lokale poort 8001 in vsock** na `ip-ranges.amazonaws.com:443` stuur en die lêer **`your-vsock-proxy.yaml`** mag hierdie inhoud hê wat toegang tot `ip-ranges.amazonaws.com:443` toelaat:
```yaml
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }
```
Dit is moontlik om die vsock adresse (**`<CID>:<Port>`**) wat deur die EC2 gasheer gebruik word te sien met (let op die `3:8001`, 3 is die CID en 8001 die poort):
```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 Atestasie & KMS

Die Nitro Enclaves SDK laat 'n enclave toe om 'n **kriptografies geskrewe atestasiedokument** van die Nitro **Hypervisor** aan te vra, wat **unieke metings** spesifiek vir daardie enclave insluit. Hierdie metings, wat **hashes en platformkonfigurasie registre (PCRs)** insluit, word tydens die atestasieproses gebruik om die **identiteit van die enclave te bewys** en **vertroue met eksterne dienste te bou**. Die atestasiedokument bevat tipies waardes soos PCR0, PCR1, en PCR2, wat jy voorheen teëgekom het toe jy 'n enclave EIF gebou en gestoor het.

Van die [**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), is dit die PCR waardes:

<table><thead><tr><th width="97">PCR</th><th width="221">Hash van ...</th><th>Beskrywing</th></tr></thead><tbody><tr><td>PCR0</td><td>Enclave beeldlêer</td><td>‘n Aaneengeskakelde meting van die inhoud van die beeldlêer, sonder die afdelingdata.</td></tr><tr><td>PCR1</td><td>Linux-kern en bootstrap</td><td>‘n Aaneengeskakelde meting van die kern en boot ramfs data.</td></tr><tr><td>PCR2</td><td>Toepassing</td><td>‘n Aaneengeskakelde, in-volgorde meting van die gebruikers toepassings, sonder die boot ramfs.</td></tr><tr><td>PCR3</td><td>IAM rol toegeken aan die ouer instansie</td><td>‘n Aaneengeskakelde meting van die IAM rol toegeken aan die ouer instansie. Verseker dat die atestasieproses slegs slaag wanneer die ouer instansie die korrekte IAM rol het.</td></tr><tr><td>PCR4</td><td>Instansie ID van die ouer instansie</td><td>‘n Aaneengeskakelde meting van die ID van die ouer instansie. Verseker dat die atestasieproses slegs slaag wanneer die ouer instansie 'n spesifieke instansie ID het.</td></tr><tr><td>PCR8</td><td>Enclave beeldlêer ondertekeningssertifikaat</td><td>‘n Meting van die ondertekeningssertifikaat wat vir die enclave beeldlêer gespesifiseer is. Verseker dat die atestasieproses slegs slaag wanneer die enclave vanaf 'n enclave beeldlêer wat deur 'n spesifieke sertifikaat onderteken is, geboot is.</td></tr></tbody></table>

Jy kan **kriptografiese atestasie** in jou toepassings integreer en gebruik maak van voorafgeboude integrasies met dienste soos **AWS KMS**. AWS KMS kan **enclave atestasies valideer** en bied atestasie-gebaseerde voorwaardesleutels (`kms:RecipientAttestation:ImageSha384` en `kms:RecipientAttestation:PCR`) in sy sleutelsbeleid. Hierdie beleid verseker dat AWS KMS operasies met die KMS-sleutel **slegs toelaat as die enclave se atestasiedokument geldig is** en aan die **gespesifiseerde voorwaardes voldoen**.

> [!TIP]
> Let daarop dat Enclaves in debug (--debug) modus atestasiedokumente genereer met PCRs wat uit nulles bestaan (`000000000000000000000000000000000000000000000000`). Daarom sal KMS-beleid wat hierdie waardes nagaan, misluk.

### PCR Bypass

Van 'n aanvaller se perspektief, let daarop dat sommige PCRs dit sou toelaat om sekere dele of die hele enclave beeld te wysig en steeds geldig te wees (byvoorbeeld PCR4 kyk net na die ID van die ouer instansie, so om enige enclave beeld in daardie EC2 te loop, sal hierdie potensiële PCR vereiste vervul).

Daarom mag 'n aanvaller wat die EC2 instansie kompromitteer, in staat wees om ander enclave beelde te loop om hierdie beskermings te omseil.

Die navorsing oor hoe om nuwe beelde te wysig/te skep om elke beskerming te omseil (veral die nie so voor die hand liggende) is steeds TODO.

## Verwysings

- [https://medium.com/@F.DL/understanding-vsock-684016cf0eb0](https://medium.com/@F.DL/understanding-vsock-684016cf0eb0)
- Alle dele van die Nitro tutoriaal van 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}}
