
Практический фреймворк для атак с точным контролем выполнения анклавов
SGX-Step — это фреймворк с открытым исходным кодом, предназначенный для облегчения исследований атак по побочным каналам на процессоры Intel x86 в целом и на платформы Intel SGX в частности. SGX-Step состоит из враждебного драйвера ядра Linux и небольшой библиотеки операционной системы пользовательского пространства, которая позволяет настраивать ненадёжные записи таблицы страниц и/или прерывания таймера APIC x86 полностью из пользовательского пространства. SGX-Step использовался в наших собственных исследованиях, а также независимыми исследователями для реализации нескольких новых и улучшенных атак на выполнение в анклавах, которые собирают наблюдения побочных каналов с максимальным временным разрешением (т.е. прерывая анклав жертвы после каждой отдельной инструкции).
Лицензия. SGX-Step — это свободное программное обеспечение, распространяемое по лицензии GPLv3. Логотип SGX-Step взят из культовой серии фотографий общественного достояния Эдварда Мейбриджа «Салли Гарднер на галопе», которая, как и наша цель пошагового выполнения анклавов, разбивает динамику скачущей лошади на серию отдельных кадров, чтобы выявить общие свойства походки лошади.
| Версия SGX-Step | Особенности изменений |
|---|---|
| v1.5.0 | Исправления стабильности (KPTI, отображение ISR ядра); (экспериментальный) порт Gramine; поддержка IPI. |
| v1.4.0 | Привилегированные шлюзы прерываний/вызовов (Plundervolt). |
| v1.3.0 | Поддержка транзиентного выполнения (Foreshadow). |
| v1.2.0 | Обработка прерываний в пользовательском пространстве и детерминированная фильтрация нулевого шага (Nemesis). |
| v1.1.0 | Поддержка IA32. |
| v1.0.0 | Манипуляция таблицами страниц в пользовательском пространстве и пошаговое выполнение с таймером APIC. |
Публикации. SGX-Step использовался несколькими независимыми исследовательскими группами и позволил создать новое направление атак на SGX с высоким разрешением. Полный актуальный список известных проектов, использующих SGX-Step, приведён в нижней части этого README. Копия оригинальной статьи доступна здесь.``` @inproceedings{vanbulck2017sgxstep, title = {{SGX-Step}: A Practical Attack Framework for Precise Enclave Execution Control}, author = {Van Bulck, Jo and Piessens, Frank and Strackx, Raoul}, booktitle = {2nd Workshop on System Software for Trusted Execution {(SysTEX)}}, publisher = {{ACM}}, pages = {4:1--4:6}, month = Oct, year = 2017, }
**Демо.** Каталог [app/memcmp](https://github.com/jovanbulck/sgx-step/blob/master/app/memcmp) содержит небольшое демонстрационное приложение, иллюстрирующее мощь атак SGX-Step путем пошагового выполнения образца анклава, содержащего тонкую, непостоянную во времени логику сравнения паролей `memcmp`. В отличие от традиционных, известных своей шумностью атак по времени, SGX-Step может детерминированно подобрать пароль посимвольно за _линейное_ время:

## Обзор
Ключевым аспектом дизайна SGX-Step, в отличие от предыдущих предложений по вытеснению анклавов, является создание отображений виртуальной памяти пользовательского пространства для физических ячеек памяти, содержащих записи таблиц страниц, а также для конфигурационных регистров локального APIC, отображенных в память ввода-вывода, и дескрипторной таблицы прерываний x86 (IDT). Это позволяет ненадежному, контролируемому атакующим хост-процессу легко (i) отслеживать или изменять записи таблиц страниц анклава, (ii) настраивать одноразовый/периодический источник прерываний таймера APIC, (iii) вызывать межпроцессорные прерывания и (iv) регистрировать пользовательские обработчики прерываний полностью _внутри_ пользовательского пространства.

Приведенный выше рисунок суммирует последовательность аппаратных и программных шагов при прерывании и возобновлении анклава SGX с помощью нашего фреймворка.
1. Прерывание локального таймера APIC поступает во время выполнения инструкции внутри анклава.
2. Процессор выполняет процедуру AEX, которая безопасно сохраняет контекст выполнения в кадре SSA анклава, инициализирует регистры ЦП и направляет к (пользовательскому) обработчику прерываний, зарегистрированному в IDT.
3. На этом этапе можно легко подключить любой специфический для атаки шпионский код.
4. Библиотека возвращается к трамплину AEP пользовательского пространства. Мы изменили ненадежную среду выполнения официального SDK SGX, чтобы обеспечить простую регистрацию пользовательского заглушки AEP. Кроме того, для точной оценки нашего подхода на контролируемых атакующим отладочных анклавах-бенчмарках SGX-Step может _опционально_ быть инструментирован для извлечения сохраненного указателя инструкции из кадра SSA прерванного анклава (с использованием интерфейса Linux `/proc/self/mem` и инструкции `EDBGRD`).
5. После этого мы настраиваем локальный таймер APIC для следующего прерывания, записывая в регистр начального счета, отображенный в память ввода-вывода, непосредственно перед выполнением (6) `ERESUME`.
## Обзор исходного кода
Этот репозиторий организован следующим образом:```
.
├── app -- Collection of sample client applications using SGX-Step to
│ attack different victim enclave scenarios.
├── doc -- Papers and reference material.
├── kernel -- Minimal dynamically loadable Linux kernel driver to export
│ physical memory to user space and bootstrap `libsgxstep`.
├── libsgxstep -- Small user-space operating system library that implements the
│ actual SGX-Step functionality, including x86 page-table and
│ APIC timer manipulations.
└── sdk -- Bindings to use SGX-Step with different SGX SDKs and libOSs.
SGX-Step — это универсальный фреймворк управления выполнением, который позволяет точно чередовать инструкции внутри vicitm enclave с произвольным кодом атакующего. Некоторые основные варианты использования фреймворка SGX-Step обобщены на рисунке ниже (см. также нижнюю часть этого README для актуального списка публикаций, использующих SGX-Step).

SGX-Step требует совместимый с SGX процессор Intel и стандартное ядро Linux. Наша первоначальная оценка проводилась на процессорах i7-6500U/6700 с Ubuntu 18.04 и стандартным ядром Linux 4.15.0. Также поддерживаются более новые ядра и дистрибутивы Linux. Ниже приведены параметры ядра Linux, которые мы используем.