SGX - В чем разница между доверенным мостом и доверенным прокси?
В руководстве разработчика Intel SGX по обработке указателей упоминается:
Когда буфер копируется, доверенный мост должен избегать перезаписи памяти анклавов в ECALL, а доверенный прокси-сервер должен избегать утечки секретов в OCALL.
Что такое доверенный мост и доверенный прокси здесь?
--- отредактировано ---
Из Обработки указателей в ECALL и Обработки указателей в OCALL я заметил, что доверенный мост используется для выделения и копирования буфера из внешнего анклава во внутренний анклав, где доверенный прокси-сервер используется для выделения и копирования буфера из внутреннего анклава во внешний анклав. Итак, мой личный вывод заключается в том, что оба они являются своего рода делегатом, ответственным за распределение и копирование буферов памяти в двух разных направлениях. Их имена "мост" и "прокси" используются для дифференциации их рабочего процесса.
Правильно ли мое понимание?
2 ответа
Доверенный мост и Доверенные прокси-интерфейсы между приложением и анклавом. Этот код взаимодействует с / из анклава. Инструмент Edger (входит в среду сборки), который анализирует файл EDL и генерирует доверенный мост и доверенные прокси-файлы (файлы.c и.h).
Надежный мост:
Для ECALL задача доверительного моста состоит в том, чтобы гарантировать, что структура маршаллинга не перекрывает память анклава.
[in]: Когда указатель на ненадежную память с атрибутом in передается в анклав, доверенный мост выделяет память внутри анклава и копирует память, на которую указывает указатель, в память анклава.
[out]: когда указатель на ненадежную память с атрибутом out передается в анклав, доверенный мост выделяет буфер в доверенной памяти, обнуляет содержимое буфера для очистки любых предыдущих секретов и передает указатель на этот буфер доверенной функции, После возврата доверенной функции доверенный мост копирует содержимое доверенного буфера в ненадежную память.
Доверенный прокси
Для OCALL доверенный прокси-сервер выделяет память во внешнем стеке для прохождения структуры маршалинга и проверяет, что параметры указателя с их полным диапазоном находятся в анклаве.
[in]: Когда указатель на доверенную память с атрибутом in передается из анклава (OCALL), доверенный прокси-сервер выделяет память вне анклава и копирует память, указанную указателем из анклава, в недоверенную память.
[out]: Когда указатель на доверенную память с атрибутом out передается из анклава (OCALL), доверенный прокси-сервер выделяет буфер в ненадежном стеке и передает указатель на этот буфер ненадежной функции. После возврата ненадежной функции доверенный прокси-сервер копирует содержимое ненадежного буфера в доверенную память.
Что такое доверенный мост и доверенный прокси здесь?
Концепция моста и прокси-сервера происходит от кода вызывающего и вызываемого абонентов, а не от прямой связи друг с другом: между ними есть клейкий код. Код вызывающего абонента вызывает прокси-сервер, который притворяется "похожим" на вызываемого, и его цель - принять вызов и передать аргументы другой (доверенной или ненадежной) стороне. Мост - это то, что вызывает фактического вызываемого абонента на другой стороне и имитирует вызывающего абонента.
В COM-маршалинге есть похожая концепция: COM- прокси и заглушки.
Доверенный прокси-сервер - это то, что вызывает код анклавов в OCALL, ожидая, что такой вызов будет доставлен аналогичным образом на ненадежной стороне фактическому вызываемому абоненту.
Доверенный мост - это то, что обрабатывает вызов, полученный ненадежным прокси, подготавливает аргументы стека для функции анклава, выполняет актуальный вызов вызываемого и принимает выходные аргументы в противоположном направлении.
Раздел документации объясняет, что во избежание переопределения памяти сгенерированным кодом прокси и моста, соглашение состоит в том, что код приложения в ненадежном пространстве должен работать с указателями ненадежной памяти, а доверенный код анклава должен использовать аргумент указателя доверенной памяти. Клеевой слой отвечает за магию копирования данных туда и обратно между ненадежным и доверенным пространством, заменяя указатели соответственно, чтобы они указывали на одни и те же (копируемые) данные, даже если сами указатели (как числа) изменились.