
27
Intel SGX (Software Guard eXtensions) – это хардварная технология изоляции, которая создаёт так называемые enclaves – зашифрованные области памяти, защищённые даже от операционной системы. Но “защищённый” не значит “непробиваемый”. Давай разберём, как это ломают.
Что такое SGX и почему это интересно
SGX создаёт изолированные области (enclave) прямо в памяти процессора. Данные внутри enclave зашифрованы аппаратно – их не видит ни ОС, ни гипервизор, ни другие процессы. Используется для хранения криптоключей, приватных вычислений, биометрии и т.п.. Коммуникация с внешним миром идёт только через строго определённые ECALL (вход в enclave) и OCALL (выход) – это и есть главная поверхность атаки.
Вектор 1: Side-Channel через кэш (Prime+Probe)
Самый классический путь – атаки по побочным каналам через кэш. Суть в том, что SGX прячет содержимое памяти, но не прячет паттерны доступа к ней.
Prime+Probe – атакующий заполняет кэш-сет своими данными (prime), даёт enclave поработать, затем измеряет время доступа (probe). Долгий доступ = этот кэш-сет был использован enclave’ом.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Псевдокод концепции Prime+Probe import time def prime_cache_set(cache_set): """Забиваем кэш-сет своими данными""" return [access_memory(addr) for addr in cache_set] def probe_cache_set(cache_set): """Измеряем время — если долго, enclave использовал этот сет""" timings = [] for addr in cache_set: t = time.perf_counter_ns() access_memory(addr) timings.append(time.perf_counter_ns() - t) return timings # Если timing > threshold — enclave обращался к данным в этом сете # => утекает информация о паттернах доступа к секретным данным |
Controlled Channel Attack – злоумышленник с контролем над ОС намеренно создаёт page faults, отслеживая доступ к страницам памяти enclave на уровне PTE (Page Table Entries). Это даёт пошаговую картину того, какие страницы использует enclave при обработке разных входных данных.
Вектор 2: SGXPectre – Spectre внутри enclave
SGXPectre – это Spectre, заточенный под SGX. Атака заставляет процессор спекулятивно выполнять код внутри enclave таким образом, что данные утекают через кэш-side-channel.
Механика:
FLUSH+RELOAD атакующий вытаскивает прочитанные данные|
1 2 3 4 5 6 7 8 9 10 |
// Гаджет внутри SGX enclave, уязвимый к SGXPectre // (упрощённая схема) void vulnerable_enclave_func(size_t x) { if (x < array_size) { // <- BTB-отравление заставит пропустить эту проверку // Спекулятивно читаем данные за границей enclave uint8_t val = *(uint8_t*)(untrusted_mem + array[x]); // Данные утекли в кэш — атакующий считает их через timing flush_reload_probe[val * 512]; } } |
Вектор 3: SGX-Step + AEX-NStep (Single-Stepping)
SGX-Step – это наступательный фреймворк, который позволяет прерывать enclave после каждой инструкции . Делается это через манипуляцию с PTE: атакующий сбрасывает accessed bit страницы перед входом в enclave, что вызывает микрокодовый путь при каждом обращении – и значительно растягивает окно выполнения инструкции, давая таймеру APIC точно попасть в нужный момент.
Intel ответил AEX-Notify – механизмом, который делает prefetch рабочего набора следующей инструкции перед её выполнением, сужая окно для прерывания. Казалось бы, защита работает. Но в 2025 году появился AEX-NStep:
wbinvd), что делает prefetch-митигацию AEX-Notify бесполезной, затем стреляет IPI (Inter-Processor Interrupt) с соседнего потока SMT. Вероятность попасть в одну инструкцию – 45% для 5-цикловых инструкций|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Атака на ECDSA через LBMS — детектируем bias в nonce // Если nonce усечён — выполняется длинная ветка (+N инструкций) // Атакующий фиксирует это через прерывание и собирает сигнатуры // с биасом для полного восстановления приватного ключа (LLL-атака) for (int sig = 0; sig < NEEDED_SIGS; sig++) { arm_ipi_after_n_instructions(N_SHORT_BRANCH); trigger_ecdsa_sign(enclave, message[sig]); if (aex_occurred_after_ipi()) { // Прерывание сработало = была длинная ветка = nonce biased collect_biased_signature(sig); } } // После ~300 biased сигнатур — восстанавливаем приватный ключ через LLL |
Вектор 4: SmashEx / SIGY – атаки через исключения
SmashEx эксплуатирует обработку асинхронных исключений в SGX. Суть: ОС посылает исключение в enclave, пока он выполняет не атомарную последовательность – возникает состояние гонки (re-entrancy). Результат: утечка 1024-битного RSA приватного ключа через OpenSSL внутри enclave. Уязвимость пофикшена в SGX SDK 2.14+.
SIGY (2025) – аналогичная атака нового поколения: untrusted ОС инжектирует поддельные hardware events и сигналы в enclave в произвольный момент выполнения. По сути – управляемый chaos-инжекшн в доверенную среду.
Вектор 5: TEE.Fail – физическая атака за $1000
Самый хардкорный вектор 2025 года – TEE.Fail от исследователей Georgia Tech и Purdue. Атака использует устройство-интерпозер, собранное из off-the-shelf железа дешевле $1000, которое физически инспектирует весь трафик памяти внутри DDR5-сервера.
Результат: извлечение криптографических ключей из Intel TDX и AMD SEV-SNP, включая секретные attestation ключи с полностью обновлённых машин
CVE: свежие дыры в SGX
| CVE | Тип | Суть | CVSS |
|---|---|---|---|
| CVE-2024-36293 | Improper Access Control | Манипуляция EDECCSSA инструкцией → DoS enclave, corruption SSA frames | Medium |
| Downfall (CVE-2022-40982) | Transient Execution | GDS-атака через AVX-инструкции, утечка данных между процессами | High |
| ÆPIC Leak | Arch. Bug | Первая архитектурная утечка SGX данных без side-channel | High |
Как защититься (если ты на стороне защиты)
Инструменты для исследования
|
1 2 3 4 5 6 7 8 9 10 11 |
# SGX-Step — фреймворк для single-stepping атак git clone https://github.com/jovanbulck/sgx-step # EnclaveFuzz — фаззинг SGX приложений (NDSS 2024) # https://github.com/enclavefuzz # Intel SGX SDK (для разработки и анализа) # https://github.com/intel/linux-sgx # Утилиты для работы с SGX sudo apt install libsgx-enclave-common libsgx-dcap-ql |
SGX – это не серебряная пуля, а сложная система с огромной поверхностью атаки на уровне микроархитектуры. Каждый год выходят новые CVE и исследования, которые показывают: хардварная изоляция ломается так же, как и программная – просто требует больше скилла и понимания CPU internals.