Есть ли способ напрямую загрузить существующее приложение в анклав Intel SGX
?
Загрузите приложение в анклав Intel SGX
Ответы (3)
Intel SGX
предназначен для защиты данных, а не для загрузки всего приложения. Вы можете выполнять безопасные вычисления внутри анклавов SGX
с вашими данными, отправляя временные буферы из пользовательской программы (app.cpp
) в ваш анклав SGX
(Enclave.cpp
). Но почему?
- Размер анклава невелик, и вы не можете загрузить в него все свои данные одновременно.
- Внутри анклавов вы ограничены набором программных примитивов, таких как if-then-else, for-loop и т. д. Кроме того, вы не можете использовать системные вызовы, такие как
open
, для открытия файла.
Таким образом, если ваше приложение большое или содержит какие-то системные вызовы или даже какие-то запрещенные SGX
реализацией стандартные функции библиотеки C, невозможно полностью импортировать его внутри анклава. Но если ваше приложение выполняет какие-то примитивные операции без необходимости какого-либо специального системного вызова или вызова функции, вы можете свободно портировать его внутри анклава. Тем не менее, вы не можете напрямую загрузить его внутри анклава, вам нужно изменить свою реализацию, чтобы сделать его доверенным вызовом анклава внутри файла Enclave.cpp
.
В качестве примера я реализовал набор криптографических операций, например. SHA-2, HMAC SHA-2, AES и т. д. внутри анклава. Я отправляю/получаю временные буферы данных pliantext/зашифрованного текста в/из анклава, выполняя операции шифрования/дешифрования внутри анклава и сохраняя результаты вычислений, такие как хеш-дайджест или зашифрованные тексты, в пользовательском пространстве. Таким образом, я гарантирую, что никто не сможет подделать результаты операций, потому что они выполняются внутри анклава, защищенного инструкциями ЦП.
Вы можете прочитать больше об этом примере здесь и проверить реализацию здесь.
Хотя hmofrad прав, утверждая, что SGX не предназначен для запуска всего существующего приложения, существуют существуют подходы для достижения именно этого: Существует SCONE (с закрытым исходным кодом) и Graphene (открытый код). Так что вы можете прочитать об Graphene с SGX и проверьте, соответствует ли это вашим потребностям.
Как указывалось в предыдущих ответах, конструкция Intel SGX по умолчанию не позволяет запускать немодифицированные приложения в целом, поскольку последние содержат (скорее всего) подпрограммы, которые не поддерживаются (все системные вызовы) доверенной libc, предоставляемой Intel SGX SDK. Такие инструменты, как Scone, Graphene SGX, Haven или SGX-LKL позволяют запускать без изменений приложения в анклавах Intel SGX.
Большинство вышеупомянутых инструментов запускают мини-ОС внутри анклава для обработки (через эмуляцию) неподдерживаемых системных вызовов. Это приводит к большому размеру анклава, что очень вредно для приложений, требующих больших ресурсов памяти; память анклава ограничена 128 МБ (или 256 МБ в более поздних версиях SGX).
Решение, которое вы выберете, будет во многом зависеть от приложения, которое вы пытаетесь запустить. Если последний не такой большой, вы можете попробовать перенести его на Intel SGX. Портирование включает в себя разделение вашего приложения на доверенные и ненадежные части. Только доверенная часть будет работать в анклаве и может безопасно взаимодействовать с ненадежной частью (помощником) вне среды выполнения анклава. Во время переноса у вас может остаться доверенный код, который зависит от неподдерживаемых подпрограмм, таких как системные вызовы. Вы можете решить эту проблему, реализовав/расширив свою собственную доверенную библиотеку libc (только системные вызовы, которые вам нужны) в анклаве, которая переопределяет системные вызовы как оболочки для вызовов ocall, которые затем вызывают настоящие подпрограммы (безопасно) из анклава; хороший пример здесь. Однако этот подход не для новичков. Таким образом, вы максимизируете память анклава и предотвратите раздувание ее до полноценной библиотечной ОС.
С другой стороны, если вы имеете дело с очень сложным приложением, перенос которого невозможен, я посоветую вам выбрать такое решение, как Graphene-SGX, которое имеет открытый исходный код и хорошо документировано.