
Ein praktisches Angriffsframework für präzise Steuerung der Enklavenausführung
SGX-Step ist ein Open-Source-Framework, das die Forschung zu Seitenkanalangriffen auf Intel x86-Prozessoren im Allgemeinen und Intel SGX-Plattformen im Besonderen erleichtert. SGX-Step besteht aus einem adversarialen Linux-Kernel-Treiber und einer kleinen User-Space-Betriebssystembibliothek, die es ermöglicht, nicht vertrauenswürdige Seitentabelleneinträge und/oder x86-APIC-Timer-Interrupts vollständig aus dem Benutzerraum zu konfigurieren. SGX-Step wurde sowohl in unserer eigenen Forschung als auch von unabhängigen Forschern genutzt, um mehrere neue und verbesserte Enclave-Ausführungsangriffe zu ermöglichen, die Seitenkanalbeobachtungen mit maximaler zeitlicher Auflösung sammeln (d.h. durch Unterbrechung der Opfer-Enclave nach jeder einzelnen Anweisung).
Lizenz. SGX-Step ist freie Software, lizenziert unter GPLv3. Das SGX-Step-Logo ist abgeleitet von Eadweard Muybridges ikonischer Public-Domain Fotoserie "Sallie Gardner at a Gallop", die, ähnlich wie unser Ziel des Enclave Single-Steppings, die Dynamik eines galoppierenden Pferdes in eine Reihe einzelner Frames zerlegt, um die Gesamtbewegungsabläufe des Pferdes sichtbar zu machen.
| SGX-Step release | Changelog features |
|---|---|
| v1.5.0 | Stabilisierungs-Fixes (KPTI, Kernel-ISR-Mapping); (experimenteller) Gramine-Port; IPI-Unterstützung. |
| v1.4.0 | Privilegierte Interrupt-/Call-Gates (Plundervolt). |
| v1.3.0 | Unterstützung für transiente Ausführung (Foreshadow). |
| v1.2.0 | User-Space-Interrupt-Handling und deterministisches Zero-Step-Filtering (Nemesis). |
| v1.1.0 | IA32-Unterstützung. |
| v1.0.0 | User-Space-Seitentabellenmanipulation und APIC-Timer-Single-Stepping. |
Publikationen. SGX-Step wurde von mehreren unabhängigen Forschergruppen eingesetzt und hat eine neue Reihe hochauflösender SGX-Angriffe ermöglicht. Eine vollständige aktuelle Liste bekannter Projekte, die SGX-Step verwenden, befindet sich am Ende dieser README. Eine Kopie des Originalpapiers ist hier verfügbar.``` @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, }
**Demo.** Das Verzeichnis [app/memcmp](https://github.com/jovanbulck/sgx-step/blob/master/app/memcmp) enthält eine kleine Demo-Anwendung, die die Leistungsfähigkeit von SGX-Step-Angriffen demonstriert, indem sie eine Beispiel-Enclave schrittweise ausführt, die eine subtile, nicht-konstantzeitliche `memcmp`-Passwortvergleichslogik enthält. Im Gegensatz zu traditionellen, bekanntermaßen verrauschten Timing-Angriffen kann SGX-Step das Passwort deterministisch Zeichen für Zeichen in _linearer_ Zeit erraten:

## Übersicht
Entscheidend für das Design von SGX-Step, im Gegensatz zu früheren Vorschlägen zur Enclave-Präemption, ist die Erstellung von Userspace-Virtual-Memory-Mappings für physische Speicherorte, die Seitentabelleneinträge enthalten, sowie für die lokalen APIC-Memory-Mapped-I/O-Konfigurationsregister und die x86 Interrupt Descriptor Table (IDT). Dies erlaubt einem nicht vertrauenswürdigen, angreiferkontrollierten Host-Prozess, einfach (i) Enclave-Seitentabelleneinträge zu verfolgen oder zu modifizieren, (ii) die APIC-Timer-Interruptquelle (Einmal-/Periodisch) zu konfigurieren, (iii) Inter-Processor-Interrupts auszulösen und (iv) benutzerdefinierte Interrupt-Handler vollständig _innerhalb_ des Userspace zu registrieren.

Die obige Abbildung fasst die Abfolge der Hardware- und Softwareschritte beim Interrupt und der Wiederaufnahme einer SGX-Enclave durch unser Framework zusammen.
1. Der lokale APIC-Timer-Interrupt trifft innerhalb einer Enclaved-Instruktion ein.
2. Der Prozessor führt die AEX-Prozedur aus, die den Ausführungskontext sicher im SSA-Frame der Enclave speichert, CPU-Register initialisiert und zum (Userspace-)Interrupt-Handler im IDT vektorisiert.
3. An diesem Punkt kann jeder angriffsspezifische Spy-Code einfach eingefügt werden.
4. Die Bibliothek kehrt zum Userspace-AEP-Trampolin zurück. Wir haben die nicht vertrauenswürdige Runtime des offiziellen SGX SDK modifiziert, um eine einfache Registrierung eines benutzerdefinierten AEP-Stubs zu ermöglichen. Darüber hinaus kann SGX-Step _optional_ instrumentiert werden, um den gespeicherten Befehlszeiger aus dem SSA-Frame der unterbrochenen Enclave abzurufen (unter Verwendung des Linux-`/proc/self/mem`-Interfaces und der `EDBGRD`-Instruktion), um eine präzise Evaluierung unseres Ansatzes auf angreiferkontrollierten Benchmark-Debug-Enclaves zu ermöglichen.
5. Danach konfigurieren wir den lokalen APIC-Timer für den nächsten Interrupt, indem wir in das Initial-Count-Memory-Mapped-I/O-Register schreiben, direkt bevor wir (6) `ERESUME` ausführen.
## Quellcode-Übersicht
Dieses Repository ist wie folgt organisiert:```
.
├── 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 ist ein universelles Ausführungskontroll-Framework, das die präzise Verschachtelung von Enklaven-Befehlen des Opfers mit beliebigem Angreifercode ermöglicht. Einige der Hauptanwendungsfälle des SGX-Step-Frameworks sind in der folgenden Abbildung zusammengefasst (siehe auch das Ende dieser README für eine aktuelle Liste der Publikationen, die SGX-Step verwenden).

SGX-Step benötigt einen SGX-fähigen Intel-Prozessor und einen handelsüblichen Linux-Kernel. Unsere ursprüngliche Bewertung wurde auf i7-6500U/6700 CPUs unter Ubuntu 18.04 mit einem Standard-Linux-4.15.0-Kernel durchgeführt. Neuere Linux-Kernel und Distributionen werden ebenfalls unterstützt. Wir fassen die Kernelparameter von Linux unten zusammen.