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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Основна інформація
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
Слідуйте всім інструкціям з документації. Однак, ось найважливіші з них:
# 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
caution
Завжди пам'ятайте, що вам потрібно зарезервувати деякі ресурси для батьківського 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
Це неможливо отримати оболонку всередині запущеного образу енклаву, оскільки це основна мета енклаву, однак, якщо ви використовували параметр --debug-mode
, можливо отримати stdout з нього за допомогою:
ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}
Завершення енклавів
Якщо зловмисник зламає EC2 екземпляр, за замовчуванням він не зможе отримати оболонку всередині них, але він зможе завершити їх за допомогою:
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
#!/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}")
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"
Vsock Client
Приклади:
Простий 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()
# Using socat
echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000
Vsock Proxy
Інструмент vsock-proxy дозволяє проксувати vsock проксі з іншою адресою, наприклад:
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
:
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }
Можливо побачити адреси vsock (<CID>:<Port>
), які використовуються хостом EC2 за допомогою (зверніть увагу на 3:8001
, 3 - це CID, а 8001 - порт):
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. |
PCR4 | ID екземпляра батьківського екземпляра | Безперервне вимірювання 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
- https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
- Усі частини навчального посібника Nitro від AWS: https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.