AWS - Nitro Enum

Підтримайте HackTricks

Основна інформація

AWS Nitro - це набір інноваційних технологій, які формують базову платформу для AWS EC2 інстанцій. Введений Amazon для підвищення безпеки, продуктивності та надійності, Nitro використовує спеціальні апаратні компоненти та легкий гіпервізор. Він абстрагує більшість традиційних функцій віртуалізації до спеціального апаратного та програмного забезпечення, мінімізуючи поверхню атаки та покращуючи ефективність використання ресурсів. Відвантажуючи функції віртуалізації, Nitro дозволяє EC2 інстанціям забезпечувати майже металеву продуктивність, що особливо корисно для ресурсомістких додатків. Крім того, Nitro Security Chip спеціально забезпечує безпеку апаратного та мікропрограмного забезпечення, ще більше зміцнюючи його надійну архітектуру.

Nitro Enclaves

AWS Nitro Enclaves забезпечує безпечне, ізольоване обчислювальне середовище в межах Amazon EC2 інстанцій, спеціально розроблене для обробки надзвичайно конфіденційних даних. Використовуючи AWS Nitro System, ці enclaves забезпечують надійну ізоляцію та безпеку, ідеально підходять для обробки конфіденційної інформації, такої як PII або фінансові записи. Вони мають мінімалістичне середовище, значно знижуючи ризик витоку даних. Крім того, Nitro Enclaves підтримують криптографічну атестацію, дозволяючи користувачам перевіряти, що виконується лише авторизований код, що є важливим для дотримання суворих стандартів захисту даних та відповідності.

Зображення Nitro Enclave запускаються зсередини EC2 інстанцій, і ви не можете побачити з AWS веб-консолі, чи працює EC2 інстанція зображення в Nitro Enclave чи ні.

Встановлення Nitro Enclave CLI

Дотримуйтесь усіх інструкцій з документації. Однак, ось найважливіші з них:

# 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

Зображення, які ви можете запускати в Nitro Enclave, базуються на docker images, тому ви можете створювати свої Nitro Enclave images з docker images, таких як:

# 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

Як ви можете бачити, образи Nitro Enclave використовують розширення eif (Enclave Image File).

Вихідні дані будуть виглядати приблизно так:

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

Запуск зображення

Згідно з документацією, для запуску зображення enclave потрібно призначити йому пам'ять щонайменше в 4 рази більшу за розмір файлу eif. Можливо налаштувати ресурси за замовчуванням для нього у файлі

/etc/nitro_enclaves/allocator.yaml

Завжди пам'ятайте, що вам потрібно зарезервувати деякі ресурси для батьківського EC2 інстансу також!

Після визначення ресурсів для образу і навіть модифікації конфігураційного файлу, можливо запустити образ enclave за допомогою:

# 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

Перелічення Enclaves

Якщо ви скомпрометували EC2 хост, можливо отримати список запущених образів enclave за допомогою:

nitro-cli describe-enclaves

Це неможливо отримати shell всередині запущеного образу enclave, тому що це головна мета enclave, однак, якщо ви використовували параметр --debug-mode, можливо отримати stdout з нього за допомогою:

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

Terminate Enclaves

Якщо зловмисник компрометує EC2 instance, за замовчуванням він не зможе отримати shell всередині них, але він зможе terminate them за допомогою:

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

Vsocks

Єдиний спосіб спілкуватися з образом, що працює в enclave, це використання vsocks.

Virtual Socket (vsock) — це сімейство сокетів у Linux, спеціально розроблене для полегшення комунікації між віртуальними машинами (VMs) та їхніми гіпервізорами, або між самими VMs. Vsock забезпечує ефективну, двосторонню комунікацію без залежності від мережевого стека хоста. Це дозволяє VMs спілкуватися навіть без мережевих конфігурацій, використовуючи 32-бітний Context ID (CID) та номери портів для ідентифікації та управління з'єднаннями. API vsock підтримує як поточкові, так і датаграмні типи сокетів, подібно до TCP та UDP, надаючи універсальний інструмент для додатків на рівні користувача у віртуальних середовищах.

Отже, адреса vsock виглядає так: <CID>:<Port>

Щоб знайти CIDs образів, що працюють в enclave, можна виконати наступну команду і отримати 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"
}
}
]

Зверніть увагу, що з хоста немає жодного способу дізнатися, чи CID відкриває будь-який порт! Якщо не використовувати якийсь vsock порт-сканер, як https://github.com/carlospolop/Vsock-scanner.

Vsock Server/Listener

Тут наведено кілька прикладів:

Простий 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}")

</details>
```bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"

Vsock Client

Приклади:

Last updated