Загрузите приложение в анклав Intel SGX

Есть ли способ напрямую загрузить существующее приложение в анклав Intel SGX?


person Jinwen Wang    schedule 14.03.2017    source источник


Ответы (3)


Intel SGX предназначен для защиты данных, а не для загрузки всего приложения. Вы можете выполнять безопасные вычисления внутри анклавов SGX с вашими данными, отправляя временные буферы из пользовательской программы (app.cpp) в ваш анклав SGX (Enclave.cpp). Но почему?

  1. Размер анклава невелик, и вы не можете загрузить в него все свои данные одновременно.
  2. Внутри анклавов вы ограничены набором программных примитивов, таких как if-then-else, for-loop и т. д. Кроме того, вы не можете использовать системные вызовы, такие как open, для открытия файла.

Таким образом, если ваше приложение большое или содержит какие-то системные вызовы или даже какие-то запрещенные SGX реализацией стандартные функции библиотеки C, невозможно полностью импортировать его внутри анклава. Но если ваше приложение выполняет какие-то примитивные операции без необходимости какого-либо специального системного вызова или вызова функции, вы можете свободно портировать его внутри анклава. Тем не менее, вы не можете напрямую загрузить его внутри анклава, вам нужно изменить свою реализацию, чтобы сделать его доверенным вызовом анклава внутри файла Enclave.cpp.

В качестве примера я реализовал набор криптографических операций, например. SHA-2, HMAC SHA-2, AES и т. д. внутри анклава. Я отправляю/получаю временные буферы данных pliantext/зашифрованного текста в/из анклава, выполняя операции шифрования/дешифрования внутри анклава и сохраняя результаты вычислений, такие как хеш-дайджест или зашифрованные тексты, в пользовательском пространстве. Таким образом, я гарантирую, что никто не сможет подделать результаты операций, потому что они выполняются внутри анклава, защищенного инструкциями ЦП.

Вы можете прочитать больше об этом примере здесь и проверить реализацию здесь.

person hmofrad    schedule 14.03.2017
comment
Итак, вы имеете в виду, что если у меня есть текстовый файл размером 100 МБ, я могу прочитать первые 50 МБ, отправить его в анклав для шифрования, а затем сохранить в файл. И для других 50 МБ я делаю то же самое, но на этот раз я добавляю к зашифрованному файлу, это сработает? - person Roshan Mehta; 27.09.2017
comment
Вам даже не нужно сохранять фрагменты зашифрованного текста на диске. Алгоритм шифрования поймет, что идет следующий фрагмент, и добавит его к зашифрованному тексту. Например, в AES CBC (или ECB) вы должны передавать блоки открытого текста фиксированного размера, например. 128 бит. Когда шифрование будет завершено, он отправит обратно зашифрованный текст через временные буферы, и вы сможете сохранить весь зашифрованный текст на диске. - person hmofrad; 28.09.2017

Хотя hmofrad прав, утверждая, что SGX не предназначен для запуска всего существующего приложения, существуют существуют подходы для достижения именно этого: Существует SCONE (с закрытым исходным кодом) и Graphene (открытый код). Так что вы можете прочитать об Graphene с SGX и проверьте, соответствует ли это вашим потребностям.

person user2804197    schedule 16.03.2017
comment
Существует также система Haven (с закрытым исходным кодом), которая запускает ОС внутри анклава. - person savx2; 10.06.2017

Как указывалось в предыдущих ответах, конструкция Intel SGX по умолчанию не позволяет запускать немодифицированные приложения в целом, поскольку последние содержат (скорее всего) подпрограммы, которые не поддерживаются (все системные вызовы) доверенной libc, предоставляемой Intel SGX SDK. Такие инструменты, как Scone, Graphene SGX, Haven или SGX-LKL позволяют запускать без изменений приложения в анклавах Intel SGX.

Большинство вышеупомянутых инструментов запускают мини-ОС внутри анклава для обработки (через эмуляцию) неподдерживаемых системных вызовов. Это приводит к большому размеру анклава, что очень вредно для приложений, требующих больших ресурсов памяти; память анклава ограничена 128 МБ (или 256 МБ в более поздних версиях SGX).

Решение, которое вы выберете, будет во многом зависеть от приложения, которое вы пытаетесь запустить. Если последний не такой большой, вы можете попробовать перенести его на Intel SGX. Портирование включает в себя разделение вашего приложения на доверенные и ненадежные части. Только доверенная часть будет работать в анклаве и может безопасно взаимодействовать с ненадежной частью (помощником) вне среды выполнения анклава. Во время переноса у вас может остаться доверенный код, который зависит от неподдерживаемых подпрограмм, таких как системные вызовы. Вы можете решить эту проблему, реализовав/расширив свою собственную доверенную библиотеку libc (только системные вызовы, которые вам нужны) в анклаве, которая переопределяет системные вызовы как оболочки для вызовов ocall, которые затем вызывают настоящие подпрограммы (безопасно) из анклава; хороший пример здесь. Однако этот подход не для новичков. Таким образом, вы максимизируете память анклава и предотвратите раздувание ее до полноценной библиотечной ОС.

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

person Peterson Yuhala    schedule 16.07.2020