AWS - Nitro Enum

Support HackTricks

Basic Information

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

Nitro Enclaves

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

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

Nitro Enclave CLI installation

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

# 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, тому ви можете створити свої зображення Nitro Enclave з зображень docker, таких як:

# 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"
}
}

Запустіть зображення

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

/etc/nitro_enclaves/allocator.yaml

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

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

# 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

Перерахунок Енклавів

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

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 екземпляр, за замовчуванням він не зможе отримати оболонку всередині них, але він зможе terminate them з:

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

Vsocks

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

Віртуальний сокет (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