
正確なエンクレーブ実行制御のための実用的な攻撃フレームワーク
SGX-Stepは、Intel x86プロセッサ全般、特にIntel SGXプラットフォームにおけるサイドチャネル攻撃研究を促進するためのオープンソースフレームワークです。SGX-Stepは、敵対的なLinuxカーネルドライバと、ユーザ空間から完全に信頼できないページテーブルエントリやx86 APICタイマ割り込みを設定できる小さなユーザ空間オペレーティングシステムライブラリで構成されています。SGX-Stepは、私たち自身の研究だけでなく、独立した研究者にも活用され、最大の時間分解能(つまり、被害エンクレーブをすべての命令の後に割り込み)でサイドチャネル観測を収集する、いくつかの新しく改良されたエンクレーブ実行攻撃を可能にしました。
ライセンス. SGX-Stepはフリーソフトウェアであり、GPLv3の下でライセンスされています。SGX-Stepのロゴは、Eadweard Muybridgeの象徴的なパブリックドメイン「サリー・ガードナー・アット・ア・ギャロップ」の写真シリーズから派生したものです。このシリーズは、エンクレーブのシングルステッピング目標と同様に、疾走する馬の動きを一連の個別の写真フレームに分解し、馬全体の歩様特性を明らかにします。
| 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)ディレクトリには、微妙で非定数時間の`memcmp`パスワード比較ロジックを含むサンプルエンクレーブをシングルステップ実行することで、SGX-Step攻撃の威力を示す小さなデモアプリケーションが含まれています。従来のノイズの多いタイミング攻撃とは対照的に、SGX-Stepはパスワードを1文字ずつ_線形_時間で確定的にブルートフォースできます。

## 概要
SGX-Stepの設計において、以前のエンクレーブプリエンプション提案とは対照的に重要なのは、ページテーブルエントリを保持する物理メモリ位置、ローカルAPICメモリマップドI/O設定レジスタ、およびx86割り込みディスクリプタテーブル(IDT)に対するユーザー空間仮想メモリマッピングを作成することです。これにより、信頼できない攻撃者制御のホストプロセスは、(i) エンクレーブページテーブルエントリを追跡または変更し、(ii) APICタイマーのワンショット/定周期割り込みソースを設定し、(iii) プロセッサ間割り込みをトリガーし、(iv) カスタム割り込みハンドラを完全に_ユーザー空間_内に登録することが容易にできます。

上図は、当フレームワークを通じてSGXエンクレーブを中断および再開する際のハードウェアとソフトウェアの一連のステップをまとめたものです。
1. ローカルAPICタイマー割り込みがエンクレーブ化された命令内で到着します。
2. プロセッサは、エンクレーブのSSAフレームに実行コンテキストを安全に保存し、CPUレジスタを初期化し、IDTに登録された(ユーザー空間)割り込みハンドラにベクタリングするAEX手順を実行します。
3. この時点で、攻撃固有のスパイコードを簡単に組み込むことができます。
4. ライブラリはユーザー空間のAEPトランポリンに戻ります。公式SGX SDKの信頼できないランタイムを変更し、カスタムAEPスタブの簡単な登録を可能にしました。さらに、攻撃者が制御するベンチマークデバッグエンクレーブで当アプローチの正確な評価を可能にするため、SGX-Stepは_オプションで_、中断されたエンクレーブのSSAフレームから保存された命令ポインタを取得するように計装できます(Linuxの`/proc/self/mem`インターフェースと`EDBGRD`命令を使用)。
5. その後、`ERESUME`を実行する直前に、initial-countメモリマップドI/Oレジスタに書き込むことで、次の割り込み用にローカルAPICタイマーを設定します。
## ソースコードの概要
このリポジトリは次のように構成されています。```
.
├── 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は、被害エンクレーブ命令の正確なインターリーブを_任意の_攻撃者コードと可能にする汎用実行制御フレームワークです。 SGX-Stepフレームワークの主なユースケースの一部を以下の図にまとめています(SGX-Stepを使用した最新の出版物リストについては、このREADMEの下部も参照してください)。

SGX-StepはSGX対応のIntelプロセッサと、市販のLinuxカーネルを必要とします。我々の最初の評価は、Ubuntu 18.04を実行するi7-6500U/6700 CPU上で、標準のLinux 4.15.0カーネルを用いて実施しました。より新しいLinuxカーネルやディストリビューションもサポートされています。以下にLinux カーネルパラメータの概要を示します。
| Linuxカーネルパラメータ | 説明 |
|---|---|
nox2apic | オプションでローカルAPICデバイスをメモリマップドI/Oモードに設定します(SGX-Stepの正確なシングルステッピング機能を利用するため)。設定した場合は、libsgxstep/config.hでX2APICを0に設定してください。あるいは、CPUをx2APICモードのままにしても、最近のSGX-Stepディストリビューションは互換性があるはずです。 |
iomem=relaxed no_timer_check | カーネルログに不要な警告メッセージを抑制します。 |
nmi_watchdog=0 | カーネルのNMIウォッチドッグを抑制します。 |
isolcpus=1 | 被害プロセスをアイソレートされたCPUコアにアフィニティ設定します。 |
clearcpuid=308,295,514 | スーパーバイザーモードアクセス防止(SMAP, bits 295)、スーパーバイザーモード実行防止(SMEP, bits 308)、ユーザーモード命令防止(UMIP, bits 514)機能を無効化します。 |
pti=off | カーネルページテーブル分離を無効化します(ユーザーIRQハンドラによるカーネルパニックを回避するため)。 |
rcupdate.rcu_cpu_stall_suppress=1 | カーネルの読み取りコピー更新(RCU) CPUストール検出器を無効化します(カーネルのタイマー割り込みハンドラを呼び出さずに長時間シングルステップ実行する際の警告を回避するため)。 |
msr.allow_writes=on | SGX-Stepによるモデル固有レジスタ(MSR)書き込みに対するカーネル警告メッセージを抑制します。 |
vdso=0 | 最近のLinuxカーネルのみ:vdso_sgx_enter_enclaveライブラリを無効化します(AEPインターセプションパッチと互換性がありません)。 |
dis_ucode_ldr | オプションでCPUマイクロコードの更新を無効化します(最近のトランジェント実行攻撃対策により、シングルステッピング間隔の再調整が必要になる場合があります)。 |
目的のブートパラメータをカーネルに以下のように渡します:```bash
$ sudo vim /etc/default/grub