Intel SGX Explained
https://www.youtube.com/watch?v=mPT_vJrlHlg
PRM: Processor Reserved memory
kernel, hypervisor, SMM(System Management Mode), DMA(Direct Memory Access)などのnon-enclave memoryからのアクセスから保護
loading stage時にCPUがunprotected memoryからEPC pagesにcodeとdataをコピーし、全てのコピーが完了したらinitializeし、そのデータのハッシュ値がそのenclaveのmesurement hashとなりsoftware attestationに使われる。
pageは仮想メモリの最小単位
EINITがファイナライズ
https://gyazo.com/17ee810013829a5972559fa8abefb49a
https://gyazo.com/928cc3a390f40ed1b8e42f5738350dd9
機密データのリークを防ぐためにenclaveのコードを実行するCPUは直接interrupt/fault/VM exitをせず、enclacve codeからring3 codeに移行するためにAEX(Asynchronous Enclave Exit)を行ってからinterrupt/fault/VM exitする。
Enclave executionはring3のprotected modeで実行し、OS kernelがセットしたaddress translationを利用。
EnclaveへのEPC pagesの割り当てはOS kernelが。
Privilege switching mechanism
ソフトウェアに対してより高い権限の必要な操作の権限を与える
SMM(System Management Mode): マザーボード製造元などがfan control, deep sleepなどのコードを提供。
VMX(Virtual Machine Extensions) Root: Cloud providerなどのOSより権限の強いhypervisorが利用者に対して同じ物理マシンをシェアする複数のOSに置いてハードウェアのリソースを割り当てるなど
いわゆるカーネルモード・supervisorモードがVMX Non-RootのRing0権限
SGX Enclaveを含むアプリケーションコードがRing3
https://gyazo.com/9177beb1e85344d5d075cf576b2d19a6
https://gyazo.com/138a691a5e0903e5a10e803d5a552832
https://gyazo.com/2b873764464e735ac4d625cbe41ff3c5
4つの物理アドレス空間
register space: CPUのregister fileにアクセス
memory space (address space, physical address space): DRAMにアクセス
I/O space (ports): デバイス間でのコミュニケーション
MSR(Model Specific Regsiter) space: CPU operationの設定
IA-32e
64bits os
48bitsの仮想アドレスを52bitsの物理アドレスへ変換
https://gyazo.com/840e470886d906ca851ec144afc74a78
hypervisorにより起動する複数のosにおいてDRAMのデータ競合が起こらないようにguest osのためのアドレス変換レイヤーを挟む。
https://gyazo.com/87fbc7e0b43d36e503a47d1e5c4e6b73
page tableには物理アドレスの他にattributes(flags)のboolean値を指定。
present(P) : 0の場合使われないアドレス空間で例外処理。
64bit intel architectureのレジスタ
https://gyazo.com/c5ef8fd26e53db3b8ef4a9084d174667
16のgeneral purpose registers
RAZ~RBP: 32bit Intel architectureのGPRsの拡張ver
R9-R16は追加の8GRPs
RSP: スタックポインタ:stackトップのメモリアドレス
スタックはメモリアドレスの小さい方向に積まれていくのでpushでdecrement、popでincrement
RIP: 現在の実行命令のアドレス
RFLAGS: carry flagとして制御用など
メモリアクセス時に起点となるセグメントアドレスの管理
CS: code: 実行中の機械語プログラムを格納
DS: data: レジスタとメモリのデータ転送時に参照
ES: extra: DSと同様
SS: stack: stack操作時に使われるメモリ領域であるスタックセグメント、OSが設定。
Faults
障害
application code実行しにhardware exceptionが起こるとCPUがring3からring0へring swhitch
GP (general protection fault)
PF (page fault)
VMCS (Virtual Machine Control Structure)
hypervisorがVMCSを生成し複数のVMを管理することで複数のOSを起動することをサポート
例えばアドレス変換プロセスにおいてP flagが0にセットされているとCPUがVM exitを行いpageをRAMへ。
ME (Intel Management Engine)
troubleshooting and fixing situations su ch as failing hardware.
hardware failuresの際もembedded computerゆえ機能を保つ。
SMBus(System Management bus)を利用できるのでCPUのサポートなしにcomputerにremote access可能。
Processor Die
https://gyazo.com/10b8fc83b1cfcc09c9ecfa4a05e0d5d9
coreとuncoreから成る。
latencyとpower consumption削減のためuncoreもCPU dieへ統合。
processor dieがmemory controllerとI/O controllerが含んでいるのでDMA(Direct Memory Access) transfersを介して保護領域のメモリにデバイスがアクセスすることを防ぐことができる。
DDR: double data rate
CPUとDRAMをつなぐbus
CPUからアドレスバスを介し読み込みたいデータのアドレスを送り、メモリは指定アドレスのデータをデータバスに書き込みCPUがそれを読み出す。
https://gyazo.com/312ee9d6fd2b16a0151f54fbe42f8b4e
hyper-threading(SMT)
モチベーションはExecution unitsの利用率を向上させること。
複数のレジスタコピーを持ち同時に命令を並列処理可能に。
2スレッドのSMTの場合は同時に実行可能な命令数=2*CPUコア数
CPU処理はDRAMのデータ読み込みに比べて高速なので、hyper-threading、out-of-order、speculative execution、cachingによりギャップをできるだけうめている。
約200倍速い
out-of-order
In instruction scheduler
例えば算術操作を行うALUとメモリ操作を行うload/store unitは全く異なる影響を与えるので並列処理することが可能。
例えばLOADとADDを同じクロックサイクルで処理。
Speculative execution
decode stageにおいて条件分岐操作に対してどっちの条件が過去の操作の履歴から操作される確率が高いかbranch predictorに問い合わせる。
CPUがmemory読み取りパターンの予測をできるようにcacheへ読み込むmemory locationsのprefetchも行う。
cache
system softwareがcacheのアドレス変換を管理。
system softwareが信頼できない場合は問題に。
全てのソフトウェアでcacheは共有
キャッシュされたメモリとされていないメモリに対するアクセスの時間差を観測するcacche timing attacksが問題に。
https://gyazo.com/5d34cb426fdbdb3459fb2cf9dfbeb180
L1 cacheはD-cache(data cache)とI-cache(Instruction cache)から成る。
instruction fetch/decode stageはI-cacheに直接接続。
まずcache lookupがメモリアドレスを使い該当データがcacheに存在するかどうかを決める
アドレスが見つかった場合はcache hitがメモリアクセスをすぐに行う。
それぞれのcoreがそれぞれのL1/L2 cacheを持ち、L2 cachはuncoreに存在しpackage内の全てのcoreで共有。
cache line: DRAMの一部連続範囲のコピーであるデータとそのデータ由来のメモリアドレスを識別するタグ。
cache coherence
TSO(Total Store Order) memory model
全てのlogical processorは同じ順番のDRAM書き込み
同じメモリlocationは異なるcoreに同時にcacheされたりする可能性があるのでTSOにより同じメモリアドレスを参照するcache lineをシンクロ。
CPU Microcode
低頻度かつ複雑な命令列をよりシンプルな命令列に変換するために利用。
高頻度に使われる命令はシンプルなdecoderから成るcoreで処理。
1命令につきせいぜい4 micro-ops
低頻度利用の命令や4micro-ops以上必要な命令はより遅いdecoding pathを利用
MSROM(microcode store ROM)からmicro-opsを読み取りそれを利用しdecoding。
例えば、XSAVEは200micro-opsを使うのでmicrocodeで処理され、単純な算術計算やメモリアクセスは直接ハードウェアで処理。
アーキテクチャなどの拡張機能はより開発コストを下げられるようにmicro codeを利用してアップデート。
MEE以外のSGXは全てmicrocodeで実装。
life cycle
ECREATE: 新しいenclaveのためにEPC pageをSECSに
EADD: initial codeとdataをenclaveにload
LE(Launch Enclave)がEINITトークン構造体を取得しEINIT
Enclaveが意図していた計算を終えたらEREMOVEにより使ったEPC pagesをdeallocate。
SGX Implementation Overview
物理攻撃からSGXのEPCを保護するためにプロセッサーのuncoreにMEEを追加
MEEはMC(memory controller)に内包されておりMCへのインターフェースは最小限に。
MCはMEE領域に属するアドレスを探知し、ルーティング。
MEEによるMACsとDRAMデータの暗号化
MEEはプロセッサのメモリコントローラにありcachesより下層(L3~DRAMの間)にあるので、そのままではソフトウェア攻撃からenclave memoryを保護することはできない
cacheのデータはrawデータとして見ることが可能
ソフトウェアのメモリアクセスチェック
enclave外のコードはPRM外のメモリにしかアクセスできず、enclave内のコードはPRM外にもEPC pagesにもアクセス可能
ELRANGE: enclaveの仮想アドレスレンジ
PMH(Page Miss Handler)
仮想アドレスがcoreのTLBに含まれていない場合、PMHが仮想アドレスへ変換するためにpage walkを行う
TLB(Translation Look-aside Buffer)
address変換の結果のcacheを保持