banner
Дом / Новости / Игра в прятки
Новости

Игра в прятки

Nov 03, 2023Nov 03, 2023

21 октября 2022 г.

В первой части мы объяснили, что такое анклавы Intel SGX и какую пользу они приносят авторам программ-вымогателей. Во второй части мы исследуем гипотетическую пошаговую реализацию и обрисовываем ограничения этого метода.

Посмотрите эту демонстрацию атаки в реальном времени, чтобы узнать, как платформа CrowdStrike Falcon® и управляемая группа обнаружения и реагирования CrowdStrike Falcon Complete™ защищают от программ-вымогателей.

В этом разделе мы пошагово создадим пример программы-вымогателя, использующей анклавы для асимметричного шифрования. Программа-вымогатель разделена на две части:

Представленные здесь фрагменты кода будут поступать из обычного ядра приложения (main.c) или из анклава (enclave.c). Анклав сгенерирует пару ключей RSA, запечатает закрытый ключ и зашифрует данные жертвы внутри анклава с помощью Intel SGX API. Давайте посмотрим, как это делается и как ядро ​​приложения взаимодействует с анклавом.

Сначала штатное ядро ​​приложения инициализирует ресурсы, необходимые для выполнения программы-вымогателя, включая создание и настройку анклава. Чтобы загрузить анклав, мы используем функцию sgx_create_enclave() из sgx_urts.lib.1. Прототип функции:

Аргументы этой функции представляют некоторые атрибуты анклава, такие как режим компиляции или информацию о предыдущих загрузках. Например, sgx_launch_token_t — это непрозрачная структура, представляющая токен запуска анклава. Информация токена содержит информацию об анклаве на протяжении всего его выполнения и может быть сохранена для облегчения будущих загрузок анклава.

Рис. 1. Фрагмент кода создания анклава (нажмите, чтобы увеличить)

После загрузки анклава обычное ядро ​​приложения может выполнить ECALL, чтобы начать процесс генерации ключей.

Внутри анклава генерация ключей основана на Intel SGX SDK, получившем название sgx_tcrypto.lib. Это документированный API, который можно вызывать напрямую из анклава. Внутри API основан на других криптографических библиотеках, разработанных Intel: интегрированных примитивах производительности (Intel® IPP) и криптографической библиотеке Intel® Software Guard Extensions SSL (Intel® SGX SSL),2 обе из которых основаны на OpenSSL. .

Первым шагом в этом процессе является создание компонентов RSA для закрытых и открытых ключей из анклава с помощью функции sgx_create_rsa_key_pair(). Это предварительный вызов, выполняемый перед вызовами функций, которые создают ключи и используются для создания компонентов, соответствующих предопределенному размеру модуля ключа RSA и публичному показателю.

Рис. 2. Фрагмент кода, генерирующего компоненты ключей RSA (нажмите, чтобы увеличить).

Из этих компонентов ключа RSA мы используем функцию sgx_create_rsa_pub1_key() для генерации открытого ключа RSA, который будет использоваться для шифрования файлов жертвы.

Рис. 3. Фрагмент кода, создающего открытый ключ RSA (нажмите, чтобы увеличить).

Следующим логическим шагом обычно будет генерация закрытого ключа, как мы сделали с открытым ключом. В этом случае, однако, нам пока не нужен закрытый ключ, поскольку закрытый ключ будет использоваться только для целей расшифровки, если жертва выполнит требования авторов вымогателя. На данный момент нам просто нужно безопасно хранить и скрывать компоненты закрытого ключа, чтобы их можно было получить в будущем. С этой целью мы используем метод запечатывания данных, чтобы гарантировать, что закрытый ключ может быть записан и сохранен в зашифрованном виде на диске, никогда не появляясь в виде открытого текста в обычной памяти ОС.

Один из способов сделать это — сгенерировать закрытый ключ и затем запечатать его непосредственно на диске, но мы не будем действовать таким образом. Рассмотрим прототип функции из Intel SGX SDK3, который генерирует закрытый ключ, показанный ниже.

Обратите внимание, что значение закрытого ключа записывается в void**, но фактически используемая структура — это структура EVP_PKEY, сложная структура, происходящая из библиотеки OpenSSL.

Рис. 4. Фрагмент кода, определяющего структуру EVP_PKEY, из библиотеки openssl (нажмите, чтобы увеличить)