SGX-Step single-stepping¶
Local APIC timer'ı artı user-space page-table düzenlemelerini kullanarak bir SGX enclave'i tek instruction'dan sonra kesen ve böylece instruction-granular, interrupt-driven side channel'ları mümkün kılan açık bir framework (Van Bulck et al., SysTEX 2017).
Mechanism¶
SGX-Step, untrusted işletim sisteminin interrupt'lar ve page table'lar üzerindeki kontrolünü, trusted bir enclave üzerinde hassas bir execution-control primitive'ine dönüştürür. SGX, enclave kodunu OS ile aynı core'da çalıştırır; enclave ortasında bir interrupt ateşlendiğinde CPU bir Asynchronous Enclave Exit (AEX) yapar, enclave register state'ini State Save Area (SSA) içine kaydeder ve OS handler'ına vector'lar; ardından ERESUME enclave'i sürdürür. SGX-Step local APIC timer'ı öyle kurar ki bir sonraki interrupt tam da bir sonraki enclave instruction'ının içine düşer; böylece her AEX/ERESUME döngüsü enclave'i tam olarak bir instruction ilerletir.
Note
Invariant şudur: OS'in zaten kontrol ettiği iki mimari gerçekten kurulan deterministik bir single-step oracle: (1) local APIC timer, one-shot modda ayarlanabilir, çok kısa bir aralıktan sonra ateşlenecek şekilde programlanabilir ve (2) page-table "accessed" (A) bit'i, enclave o page'de gerçekten bir instruction yürüttüğünde donanım tarafından set edilir. SGX-Step, victim'in page-table entry'lerini user space'e map'ler (/dev/sgx-step ve /dev/mem üzerinden), her adımdan önce enclave'in code page'indeki A-bit'i temizler, APIC timer'ı kurar, sonra ERESUME yapar. AEX'ten sonra A-bit set ise tam olarak bir instruction retire olmuştur (bir single-step); hâlâ temizse timer çok erken ateşlenmiştir ve enclave hiç ilerlememiştir (bir zero-step), tekrar denenmelidir. Bu A-bit oracle'ı, stepping'i istatistiksel değil deterministik kılan şeydir ve üzerine katmanlanan her interrupt-latency side channel'ının temelidir (örn. Nemesis, Frontal, CopyCat).
Walkthrough¶
SGX-Step bir kernel driver, libsgxstep user kütüphanesi ve timer'ı CPU başına kalibre etmek için kullanılan bir benchmark uygulaması içerir.
- Driver'ı derle ve yükle. Loadable module
/dev/sgx-step'i açar, APIC timer IDT vector'ünü hook'lar ve page-table remapping için physical-memory erişimini etkinleştirir. - Kernel command line'ı yapılandır. SGX-Step ham APIC/IDT kontrolüne ihtiyaç duyar, örn.
nox2apic iomem=relaxed no_timer_check nmi_watchdog=0 isolcpus=1, böylece adanmış, sessizleştirilmiş bir core victim'i çalıştırır. - Timer aralığını kalibre et. NOP-slide benchmark'ını çalıştır ve temiz single-step'ler alana kadar
libsgxstep/config.hiçindekiSGX_STEP_TIMER_INTERVAL'ı ayarla. Projeye göre: "Too many zero-steps indicate that you have to increase the timer interval, whereas multi-steps demand lowering the timer interval." - Victim enclave'i single-step et. Her instruction için runtime: code-page A-bit'ini temizler, APIC timer'ı programlar (
APIC_LVTTvector'ü seçer,APIC_TMICTone-shot başlangıç sayımıdır),ERESUMEyapar, AEX'i özel IRQ handler'a (spy hook noktası) alır, sonra yeniden kurmadan önce bir single-step'i doğrulamak için A-bit'i tekrar kontrol eder.
Instruction başına stepping döngüsü (kavramsal)
// libsgxstep: arm a one-shot APIC timer and resume the enclave.
void single_step(void) {
clear_a_bit(enclave_code_pte); // A-bit set only if an insn retires
apic_write(APIC_LVTT, APIC_VECTOR | APIC_TIMER_ONESHOT);
apic_write(APIC_TMICT, SGX_STEP_TIMER_INTERVAL); // CPU-specific count
eresume(); // -> AEX fires inside next insn
}
// AEX trampoline / IRQ handler (the side-channel measurement point):
void aep_handler(void) {
if (!a_bit_set(enclave_code_pte)) zero_step_count++; // retry
else { record_irq_latency(); single_step(); } // advance 1 insn
}
SGX_STEP_TIMER_INTERVAL microcode ve core frequency'ye bağlı olarak kabaca 19–255 aralığına düşer; ERESUME'den sonraki ilk instruction, timer için güvenilir bir iniş penceresi açan bir page-miss microcode assist'i tarafından uzatılır.
Detection¶
Bir enclave içinden, single-stepping kısmen gözlemlenebilir: bir runtime, SSA'nın AEX sayacını okuyup anormal derecede yüksek bir interrupt oranını (instruction başına bir AEX) işaretleyebilir. Constant-time control flow stepping'i durdurmaz ama attacker'ın her adımda elde ettiği bilginin çoğunu kaldırır. Intel'in AEX-Notify'ı (interrupt-notification handler) gibi hardware/SDK mitigation'ları, enclave'lerin şüpheli AEX storm'larına tepki vermesini sağlar.
Mitigation¶
Warning
SGX-Step kendi başına bir exploit değil, bir araştırma framework'üdür — hassas, interrupt-driven SGX side channel'larını pratik kılan altyapıdır. Mitigation'lar framework'ü değil, onun mümkün kıldığı kanalları hedefler.
- Secret-dependent timing/control flow'u ortadan kaldır ki instruction başına interrupt latency hiçbir secret taşımasın (Nemesis/Frontal tarzı timing leak'lerini alt eder).
- AEX-Notify, her asynchronous exit'i trap'leyerek enclave koduna single-stepping'i tespit etme ve ona direnme şansı verir.
- Threat model izin verdiği yerde attacker'ın page-table/APIC kontrolünü azalt (örn. page table'ları untrusted host'tan çıkaran confidential-VM tasarımları), çünkü A-bit oracle'ı host kontrollü paging'e dayanır.