AWS - Nitro Enum

Reading time: 10 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

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

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

Nitro Enclaves

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

caution

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

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

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

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

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

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

Як ви можете бачити, зображення 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. Можливо налаштувати ресурси за замовчуванням, які потрібно надати в файлі.

shell
/etc/nitro_enclaves/allocator.yaml

caution

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

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

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

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

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

bash
nitro-cli describe-enclaves

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

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

Завершення енклавів

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

shell
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, надаючи універсальний інструмент для програм на рівні користувача у віртуальних середовищах.

tip

Отже, адреса 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"
}
}
]

warning

Зверніть увагу, що з хоста немає жодного способу дізнатися, чи 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}")
bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"

Vsock Client

Приклади:

Простий Python клієнт
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

Інструмент vsock-proxy дозволяє проксувати vsock проксі з іншою адресою, наприклад:

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

Це перенаправить локальний порт 8001 у vsock на ip-ranges.amazonaws.com:443, а файл your-vsock-proxy.yaml може містити цей вміст, що дозволяє отримати доступ до ip-ranges.amazonaws.com:443:

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

Можливо побачити адреси vsock (<CID>:<Port>), які використовуються хостом EC2 за допомогою (зверніть увагу на 3:8001, 3 - це CID, а 8001 - порт):

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 Atestation & KMS

SDK Nitro Enclaves дозволяє енклаву запитувати криптографічно підписаний документ атестації від Nitro Hypervisor, який містить унікальні вимірювання, специфічні для цього енклаву. Ці вимірювання, які включають хеші та регістри конфігурації платформи (PCR), використовуються під час процесу атестації для доказу ідентичності енклаву та побудови довіри з зовнішніми сервісами. Документ атестації зазвичай містить значення, такі як PCR0, PCR1 та PCR2, з якими ви вже стикалися під час створення та збереження EIF енклаву.

З документації, це значення PCR:

PCRХеш ...Опис
PCR0Файл зображення енклавуБезперервне вимірювання вмісту файлу зображення, без даних секції.
PCR1Ядро Linux та завантаженняБезперервне вимірювання даних ядра та завантажувального ramfs.
PCR2ДодатокБезперервне, впорядковане вимірювання користувацьких додатків, без завантажувального ramfs.
PCR3Роль IAM, призначена батьківському екземпляруБезперервне вимірювання ролі IAM, призначеної батьківському екземпляру. Забезпечує, що процес атестації успішний лише тоді, коли батьківський екземпляр має правильну роль IAM.
PCR4ID екземпляра батьківського екземпляраБезперервне вимірювання ID батьківського екземпляра. Забезпечує, що процес атестації успішний лише тоді, коли батьківський екземпляр має конкретний ID екземпляра.
PCR8Сертифікат підпису файлу зображення енклавуВимірювання сертифіката підпису, вказаного для файлу зображення енклаву. Забезпечує, що процес атестації успішний лише тоді, коли енклав був завантажений з файлу зображення енклаву, підписаного конкретним сертифікатом.

Ви можете інтегрувати криптографічну атестацію у свої додатки та використовувати готові інтеграції з такими сервісами, як AWS KMS. AWS KMS може перевіряти атестації енклавів та пропонує ключі умов атестації (kms:RecipientAttestation:ImageSha384 та kms:RecipientAttestation:PCR) у своїх політиках ключів. Ці політики забезпечують, що AWS KMS дозволяє операції з використанням ключа KMS лише якщо документ атестації енклаву є дійсним і відповідає вказаним умовам.

tip

Зверніть увагу, що енклави в режимі налагодження (--debug) генерують документи атестації з PCR, які складаються з нулів (000000000000000000000000000000000000000000000000). Тому політики KMS, які перевіряють ці значення, зазнають невдачі.

PCR Bypass

З точки зору атакуючого, зверніть увагу, що деякі PCR дозволяють змінювати деякі частини або все зображення енклаву і все ще залишатися дійсними (наприклад, PCR4 просто перевіряє ID батьківського екземпляра, тому запуск будь-якого зображення енклаву в цьому EC2 дозволить виконати цю потенційну вимогу PCR).

Отже, атакуючий, який зламав EC2 екземпляр, може бути в змозі запускати інші зображення енклаву, щоб обійти ці захисти.

Дослідження про те, як змінювати/створювати нові зображення для обходу кожного захисту (особливо тих, що не є очевидними) все ще в процесі.

References

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks