Что такое анклав, пример тестового проекта и анализ применения анклава в блеке

Тема в разделе "WASM.HEAP", создана пользователем X-Shar, 12 окт 2020.

  1. X-Shar

    X-Shar Active Member

    Публикаций:
    0
    Регистрация:
    24 фев 2017
    Сообщения:
    354
    Всем привет.

    Хотел что-то написать для конкурса на XSS, но потом понял, что для конкурса ещё недорос, а статью написал, короче получилось что-то составленное из разных статей и решил там не размещать, по крайне-мере на конкурс, думал может в какой-то другой раздел, в итоге оказалось там вообще сейчас работы какие-то ведутся, поэтому решил разместить здесь.

    Мотивация написать такую статью, было то-что часто слышу, что есть такой самый крутой анклав, который может прятать данные ваших программ от реверсера, антивирусов и даже операционной системы.

    Звучит как в сказке, а действительно было-бы не плохо прятать какие-то данные от лишних глаз реверсера, или еще кого.

    Я начал разбираться, а как можно создать такой анклав и что-то сделать с ним ?

    Кому интересно, предлагаю прочитать эту статью.

    Хочу отметить, что статья направлена больше для новичков, которые мало понимают что такое SGX и даёт поверхностные знания, что это за технология.

    Итак, что-же такое анклав ?

    Если кратко, то весь смысл Intel SGX (А мы будем говорить именно про него) по сути сводится к тому-что, в процессоре есть какая-то защищенная область памяти, которая доступна только процессору, больше никто даже операционная система доступ туда получить не может, по сути это и есть анклав.

    В модели SGX приложение делится на доверенную и ненадежную часть. Недоверенная часть - это та часть, которая взаимодействует с остальной системой, а также создает анклав, который считается безопасной частью приложения (Это доверенная часть).

    Внутри анклава хранятся важные данные, доступные только процессору.


    Все экземпляры анклава изолированы друг от друга, поэтому они могут взаимодействовать только через свою ненадежную часть.

    Доверенный и недоверенный код жестко связываются между собой ключами шифрования с использованием протокола Диффи-Хеллмана.

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

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

    Ещё пару строк про функции ECALL и OCALL:


    Доверенная часть представляет из себя набор функций и процедур, называемых ECALL (Enclave Call). Сигнатура таких функций должна быть прописана в специальном header-файле, а их реализация в файле с исходным кодом доверенного приложения, которое будет выполняться в процессоре.
    Enclave Call – Это реализация программы в анклаве.

    Также необходимо прописать прототипы тех функций, которые можно будет вызвать изнутри анклава в недоверенное приложение, такие функции называются OCALL (Outside Call). Прототипы прописываются в том же заголовочном файле, где и ECALL-функции, а реализация, в отличие от ECALL, прописывается соответственно в недоверенной части приложения.

    Давайте перейдем к реализации простого примера:


    Итак предлагаю написать демонстрационный пример, который просто передаст какие-то защищенные данные из анклава в наше приложение.

    Ну например, пусть в анклаве у нас будет хранится какой-то буфер:
    сhar* enclave_secret = "I am enclave !";

    Этот буфер нам и нужно передать в наше приложение, в будущем эти наработки можно использовать как каркас, для написания более сложных приложений, например внутри анклава можно реализовать алгоритмы шифрования/расшифрования, ну тогда вы будете уже передавать приложению расшифрованные данные и т. д.

    Итак, что-же нам нужно для работы:


    1)Скачать и установить Visual Studio, я использую 2019 версию...
    2)Cкачать и установить SDK для работы с SGX:https://software.intel.com/content/www/us/en/develop/topics/software-guard-extensions/sdk.html

    В процессе скачки, будет предложена утомительная регистрация, но думаю вы справитесь...)))


    На этапе установки будет предложено интегрировать пакет разработки в имеющуюся на компьютере версию VS, сделайте это.

    upload_2020-10-12_22-5-8.png

    Итак запускаем вижуалку и создаём проект:

    upload_2020-10-12_22-5-31.png


    upload_2020-10-12_22-5-50.png

    Далее такое окно:

    upload_2020-10-12_22-6-10.png

    Тут я оставил всё как есть:

    upload_2020-10-12_22-6-26.png

    Затем добавим к созданному решению, ещё один проект: обычное консольное приложение C++.

    upload_2020-10-12_22-6-40.png

    В результате у нас должно быть что-то такое в обозревателе решений:

    upload_2020-10-12_22-6-56.png

    Теперь необходимо связать анклав с нашей программой консоли (Это недоверенная часть), для этого жмем правой кнопкой на проекте «Console_demo»:

    upload_2020-10-12_22-7-11.png

    upload_2020-10-12_22-7-18.png

    Теперь нужно изменить некоторые свойства проекта «Console_demo» и «Enclave_demo»:

    ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ ЭТИ НАСТРОЙКИ ДЛЯ ДВУХ ПРОЕКТОВ:

    upload_2020-10-12_22-7-38.png

    upload_2020-10-12_22-7-45.png


    Ещё необходимо обозначить в свойствах решения главный проект.

    upload_2020-10-12_22-7-59.png


    Всё мы закончили настройки, теперь давайте кодить…)

    У нас два решения:
    «Console_demo» и «Enclave_demo»:

    Из сгенерированных файлов, нам будет интересно три файла:

    1) Enclave_demo.edl – Это по сути заголовочный файл, туда мы пропишем имена и прототипы ECALLs и OCALLs функций (Проект «Enclave_demo»).
    2) Enclave_demo.cpp – Это доверенная часть приложения (Проект «Enclave_demo»). Тут будет реализация ECALLs.
    3) Console_demo.cpp – Это недоверенная часть приложения (Проект «Console_demo»). Тут будет реализация OCALLs.

    Пропишем реализацию Console_demo.cpp:
    Код (C):
    1. #define ENCLAVE_FILE "Enclave.signed.dll" //Библиотека, через которую осуществляется подпись анклава
    2. #define BUFFER_LEN 256 //Размер буфера данных, которые мы отправляем в анклав
    3.  
    4. #include "sgx_urts.h"  //Базовый заголовочный файл, в котором реализованы функции управления анклавом
    5. #include "Enclave_demo_u.h" //Подключение автоматически сгенерированного файла
    6. #include "stdio.h"
    7.  
    8. void ocall_function(char* buf) //OCALL функция для вывода текстовой строки - секрета из анклава. Вызов из анклава.
    9. {
    10.     printf("+++ OCALL output: %s\n", buf);
    11. }
    12.  
    13. static sgx_enclave_id_t enclave_id = 0; // id анклава, в проекте может быть несколько анклавов, каждый со своим id
    14. static sgx_status_t enclave_ret = SGX_SUCCESS; //Статус выполнения операции
    15. static sgx_launch_token_t enclave_token = { 0 }; //Массив нициализации токена запуска для анклава
    16. static int enclave_token_updated = 0; // Флаг, что токен запуска не был изменен
    17. static char buffer[BUFFER_LEN]; // Буфер, в который будет записан секрет из анклава
    18.  
    19. int main()
    20. {
    21.     sgx_status_t ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &enclave_token, &enclave_token_updated, &enclave_id, NULL); //Функция создания анклава
    22.  
    23.     if (ret != SGX_SUCCESS)
    24.     {
    25.         printf("+++ Failed to create enclave with error number: %#x\n", ret);
    26.         return 0;
    27.     }
    28.  
    29.     ecall_function(enclave_id, buffer, BUFFER_LEN); //Вызов ECALL функции
    30.  
    31.     printf("\n+++ ECALL Output: %s\n", buffer); //Вывод полученного секрета
    32.  
    33.     system("pause");
    34. }
    Реализация Enclave_demo.cpp
    Код (C):
    1. #include "Enclave_demo_t.h"
    2. #include "sgx_trts.h"
    3. #include <cstring>
    4.  
    5. void ecall_function(char* str, size_t len)
    6. {
    7.     char* secret = "I am enclave !"; // Наша секретная фраза
    8.  
    9.     memcpy(str, secret, len); //Копируем секрет по адресу, которую получили
    10.  
    11.     ocall_function(secret); //Вызов OCALL-функции
    12. }
    13.  
    Реализация заголовочного файла Enclave_demo.edl:
    Код (Text):
    1. enclave {
    2.     from "sgx_tstdc.edl" import *;
    3.  
    4.     trusted {
    5.         /* define ECALLs here. */
    6.         public void ecall_function([out, size=len] char* str, size_t len);
    7.     };
    8.  
    9.     untrusted {
    10.         /* define OCALLs here. */
    11.         void ocall_function([in, string] char* buf);
    12.     };
    13. };
    14.  
    В итоге после запуска консольного приложения, отрабатывает функция анклава ecall_function доверенного приложения, которая вызывает функцию в недоверенное приложение ocall_function и будет вывод: +++ OCALL output: I am enclave !

    Далее функция ecall_function, копирует данные из анклава в буфер недоверенного приложения и этот буфер мы и распечатываем.
    И будет вывод: +++ ECALL Output: I am enclave !

    Выводы:


    Как видите если использовать SDK от интела и Visual Studio, то работать с анклавами достаточно не сложно, нужно просто реализовать ECALLs/OCALLs функции для обмена с анклавом из вашего приложения.
    Пример проекта можно глянуть в гите:https://github.com/XShar/Enclave_demo

    Теперь можно-ли это применять в малваре ?


    С одной стороны не плохо-бы делать так криптовку/раскриптовку строк, или самого зверька, реализовав весь алгоритм в ECALL функции.
    Но тут есть негативные моменты:
    1. Не все процессоры поддерживают SGX.А поддерживают только новые компьютеры, начиная с 2016-2017 годов.
    2. На некоторых компьютерах поддержку нужно включать в биос.

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

    Надеюсь данная статья даст объяснение новичкам что такое SGX, также приведенный тут проект можно использовать для экспериментов и дальнейшего изучения технологии.)
     
    Rel и Thetrik нравится это.
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Я на хсс'е вкинул идею, что в анклаве размещать виртуальную машину с байт-кодом, но само собой все внешние для машины функции, типа IO, вызов апи и тд должен быть реализован через OCALL. Но сегодня выяснил, что идея вообще не новая, и вот например чувачок виртуальную машину ЯП Идрис размещает в анклаве:
    --- Сообщение объединено, 12 окт 2020 ---
    Это наверное тот чувачек, которого выгнали с позором с конкурса за копипасту, досит сервер))
     
    X-Shar нравится это.
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    X-Shar,

    Начни с того, как из юзер права до ядерных повысить. А если это сделал то уже эти sgx не нужны. Что же ты в ядре скрывать собрался от ядра :sarcastic:

    > В итоге после запуска консольного приложения, отрабатывает функция анклава ecall_function доверенного приложения

    Драйвера имеют полный доступ ко всей памяти. Просто если сработает к примеру фаулт в не известной области ось упадёт.
     
  4. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    И чо даже визор с бэктрейсом не сможет спасти ось от таково падения?
     
    Indy_ нравится это.
  5. X-Shar

    X-Shar Active Member

    Публикаций:
    0
    Регистрация:
    24 фев 2017
    Сообщения:
    354
    А чего он хотел-то ?

    Скопировал статью с пикабу, или ещё от куда-то, т.к. на пикабу там ссылка на телегру была.

    Даже незахотел к формату нормальному привести.:crazy:

    Это конечно вообще жесть.
    --- Сообщение объединено, 13 окт 2020 ---
    В этой теме предполагается, что процессор поддерживает SGX, также как что уже установлен драйвер от интела.

    Как понимаю это уже будет по умолчанию в десятке.

    В итоге, вся работа с анклавами сводится в вызове апи функций драйвера, типо-там:

    sgx_create_enclave и т.д.

    Ну и реализуйте функции ECALLs/OCALLs и больше ничего делать не нужно, в общем-то всё для людей сделано.)))

    Да это не применимо для паблик малвари, т.к. нужны новые компы, начиная с 2017 года, на некоторых системах, SGX нужно включить в биосе.

    Но для защиты своего софта пойдет, из применений в комерсе:

     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    X-Shar,

    Так а смысл защиты в чём ?

    Если хард анклав привязан к процессу/потоку, то это вообще смысла не имеет. Ну создам я тред описатели скопирую и буду свободно от защиты юзать вашу область. Защита нт построена на ограничении прав, остальное всё бессмысленно. Если ты используешь какой то механизм защиты и у меня есть доступ к твоему процессу, то такой механизм больше не работает. Как минимум такого типа защитные механизмы должны работать во времени, те каждая инструкция должна быть отделена от другой таймингом, так реализуется софт анклавы, а хард это фигня. По цепочке защита работает, если есть доступ на некотором уровне, то защита отменяется. Другое совсем дело если используется софт реализация, тогда не важен мод железо и прочее.

    Дёрнуть анклав-апи не сложнее чем msgbox, вот только смысла это не имеет :)
    --- Сообщение объединено, 13 окт 2020 ---
    Аналогично как и гипервизоры - технология железячная и предназначена для виртуализации, тоесть запуска ос в ос. Этой технологией нельзя хард снять трассу. А если трасса не снимается - то это не визор, а тупо системные ловушки. Поэтому инструмент hoshimin ничего не решил ни одной самой простой задачи. Да какой там задачи, если этим ничего нельзя крутить. Вот весь ваш хвалёный гипер :sarcastic_hand:
     
  7. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    988
    Indy_, от имени кого ты посмотришь поток? процу похер на ось, он своими ключами недоступными оси же шифрует анклав. Разве не? в том и смысл, что похер на ось. Интел не теряет упрпвление своим железом.

    а, понял, если инжектиться в процесс, ну тут задача другая. ты же в хард анклав можешь и самопроверок накидать.
    --- Сообщение объединено, 13 окт 2020 ---
    а интелл процесс трейс?
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Да-да, мы это уже проходили, что кроме твоих аверских задач никакие другие задачи не существуют, это норма.
     
  9. X-Shar

    X-Shar Active Member

    Публикаций:
    0
    Регистрация:
    24 фев 2017
    Сообщения:
    354
    Инди, а софтверные анклавы, это что за звери ?

    Где можно про них почитать, есть какие примеры работы и т.д. ?
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Ты про них статью написал. Это оболочка, в которую входит поток ECALL'ом и выходит из нее OCALL'ом и есть анклав софтварный.
     
  11. X-Shar

    X-Shar Active Member

    Публикаций:
    0
    Регистрация:
    24 фев 2017
    Сообщения:
    354
    Так, а Инди тогда про что ?
    В своем посте, говорит, что софт. анклав это круто, а хард. это отстой...

    Или я непонял что ?
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Intel SGX = Intel Software Guard Extensions. Название как бы намекает.
     
  13. X-Shar

    X-Shar Active Member

    Публикаций:
    0
    Регистрация:
    24 фев 2017
    Сообщения:
    354
    Это я понял, а чем не доволен тогда Инде ?
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Инде по жизни недовольный, это нормально. И он может придумывать абсолютно любые термины, которые в природе не существуют, это тоже нормально.
     
    X-Shar нравится это.
  15. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    q2e74,

    > процу похер на ось

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

    X-Shar,

    > Где можно про них почитать

    Тут можно почитать. Мой акк смотришь там публикаций четыре вроде, по с-анклавам.
     
  16. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    X-Shar, не читай его статьи - авером станешь. А если серьезно, то да, почитай, потом нам расскажешь, что такое визоры, софтварные анклавы и другие выдуманные термины.
     
    M0rg0t нравится это.
  17. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    988
    Значит, что не добраться до анклава из кернелмода, как минимум, если ты инициализируешь анклав в UEFI на старте.
     
  18. X-Shar

    X-Shar Active Member

    Публикаций:
    0
    Регистрация:
    24 фев 2017
    Сообщения:
    354
    Я прочитал, там и читать-то немного, 4 статьи по три странички каждая...)

    Зря наверное пишу, т.к. Инди всё равно скорей-всего делать ничего не будет.

    Темы не раскрыты до конца в статьях, а интересно, может-даже есть применение этому всему.

    Я-бы сделал циклы статей, с более подробными раскрытиями терминов, примерами и т..д.

    Вот например в одной из статей, было написано, что типо можно применять для "Обнаружение KM фильтров.", как и что делать для этого, хз.

    Собственно как и всё в этих статьях, что-то сказанно, но ничего по факту не раскрыто.)))

    Но понятное дело, что врядли кто будет что-то раскрывать, т.к. на написание более раскрытых публикаций, может уйти месяцы, а если ещё приводить примеры кода и т.д., то может-быть и годы.

    Другое дело, что толку от текущих статей, мне кажется ноль, это если только для людей с большим опытом в теме, но вопрос зачем таким людям эти статьи, они и сами это знают.)
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Канеш не будет, у него есть мотивация только гуаном кидаться в других людей на форумах, да бить себя тапком в грудь за заслуги, которых никто в глаза не видел.

    Ну вряд ли даже тут найдется человек, который в состоянии прочитать статью на эльфийском, выписать себе конспект, потом телепатическими способностями выяснить, чего каждый выдуманный белорусским электриком термин означает, потом сопоставить эти термины с конспектом и догуглить еще инфы до полного понимания. Тут как минимум нужна куча свободного времени.
     
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    q2e74,

    До софтверного анклава не добраться никак не из какого мода, но всегда можно вызвать анклав апи в контексте их(sgx) использующего процесса. Ну и тогда в чём смысл, хардом скрыть память от ав - так он же выполнит теже вызовы и всё прочитает, имхо бред.

    На данной архитектуре технология бессмысленна.

    В софт анкл выборку выполняет доверенный тред. При это не нужнны никакие привилегии и спец железо. Так что SGX костыль практического применения на нт не имеет.

    Rel,

    > и другие выдуманные термины.

    А бывают не выдуманные, может от бога ?"

    Для новых понятий были сформулированы термины и описаны. У тебя же филфак наверно рядом если ты и правда преподаёшь в вузе хоть я и не верю сходи узнай, тебе обьяснят :sarcastic:

    X-Shar,

    Ты не системщик, у тебя околонулевой уровень знаний. Это значит что как и что не напиши ты всё равно не поймёшь читать не будешь.

    Не забывай каким образом ты сюда попал ;)

    Есть вещи которым дать оценку ты не можешь в связи с непониманием. Не лезь не в своё дело просто совет.
     
    Последнее редактирование: 14 окт 2020