Skip to content

SGX-Step: A Practical Attack Framework for Precise Enclave Execution Control

Untrusted bir host'un, APIC timer interrupt'larını ve user-space page-table kontrolünü kullanarak bir SGX enclave'i her seferinde tek instruction olacak şekilde single-step etmesini sağlayan açık kaynaklı bir Linux framework'ü.

Mechanism

Bug sınıfı / invariant

Intel SGX, enclave yürütmesinin malicious bir OS'e karşı bile confidential ve tamper-resistant olduğunu vaat eder. Ama interrupt subsystem'i, local APIC'i ve enclave belleğini destekleyen page table'ları hâlâ OS sahiplenir. SGX-Step tam da bu ayrıcalıkları silah haline getirir. "Aşılan" güvenlik sınırı temporal resolution: SGX instruction başına micro-architectural state sızdırır (dokunulan cache line'lar, alınan branch'ler, erişilen page'ler) ve herhangi bir side channel'ın değeri, attacker'ın onu ne kadar hassas örnekleyebildiğiyle orantılıdır. Framework, enclave'i her Asynchronous Enclave Exit (AEX) başına tam olarak bir instruction ilerleterek kaba, gürültülü trace'leri temiz, instruction-granular bir sinyale dönüştürür. Bellek doğrudan okunmaz; bunun yerine OS'in zaman ve address translation üzerindeki meşru kontrolü suistimal edilerek diğer her side channel (Prime+Probe, page fault'lar, port contention, branch shadowing) tek-instruction kesinliğine yükseltilir.

SGX-Step, küçük bir kernel module üzerinden hepsi user space'ten sürülen üç privileged primitive'i bir araya getirir:

  • APIC timer single-stepping. Local APIC timer, ERESUME'den kısa süre sonra ateşlenecek one-shot bir kaynak olarak yapılandırılır. Bir enclave instruction'ı içinde ateşlendiğinde CPU bir AEX yapar, enclave state'ini SSA'ya kaydeder ve bir user-space handler'a döner.
  • User-space page-table mapping. Enclave'in page-table entry'lerini ve APIC MMIO register'larını tutan physical page'ler attacker process'ine map'lenir; böylece PTE Accessed/Dirty bit'leri okunabilir ve timer syscall'suz yeniden kurulabilir.
  • IDT kontrolü. Özel bir interrupt handler kurulur ki attacker, enclave resume edilmeden önce AEX'te hemen kontrolü geri alsın.

Walkthrough

Kamuya açık framework'ün (Van Bulck, Piessens, Strackx, SysTEX '17) üst seviye yeniden üretimi.

Yalnızca kavramsal

Bu, framework'ün yayımlanmış mantıksal akışıdır, çalıştırılabilir bir exploit değil. Gerçek kullanım kernel module'ü, bir victim enclave ve dikkatli timer kalibrasyonu gerektirir.

  1. Tesisatı map'le. Enclave'in page-table entry'lerinin ve APIC'in physical address'lerini çözümle, sonra bunları mmap et ki PTE bit'leri ve APIC register'ları user space'ten erişilebilir olsun.
  2. Bir "assist window" oluştur. Enclave'in translation path'indeki bir page'de Accessed bit'ini temizle. ERESUME'den sonraki ilk instruction yavaş bir micro-code page-table assist'i (yüzlerce cycle) tetikler; bu da timer interrupt'ının düşebileceği pencereyi genişletip stabilize eder.
// representative fragment, not a working PoC
*pte_for_enclave_code &= ~PTE_ACCESSED;   // force a micro-code assist
apic_timer_oneshot(SINGLE_STEP_TICKS);    // arm a tuned one-shot
eresume_enclave();                        // re-enter the enclave
  1. Single-step et. Enclave'i resume et; timer ilk instruction içinde ateşlenir; AEX özel handler'a döner. Code page'deki Accessed bit, tam olarak bir instruction'ın retire olup olmadığını ("adım attık mı?" oracle'ı) ortaya koyar; böylece attacker zero-step ve multi-step event'lerine göre ince ayar yapabilir.
  2. Instruction başına örnekle. Adımlar arasında bir side channel çalıştır (örn. L1'de Prime+Probe ya da PTE A/D bit'lerini incele) ki tek instruction'ın hangi cache set'e, page'e ya da branch'e dokunduğunu öğrenesin. Tüm enclave çalışması boyunca tekrarla ki control flow'u veya secret-dependent erişimleri kurtarasın.

Bu hassasiyet, daha sonra Foreshadow, CopyCat, Frontal ve LVI gibi saldırıları mümkün kıldı ya da keskinleştirdi ve SGX micro-architectural araştırması için standart altyapı oldu.

Detection

  • Enclave thread'lerinde anormal AEX / interrupt oranı. Single-stepping neredeyse her instruction'dan sonra bir enclave exit üretir — benign scheduling'den kat kat fazla AEX. Per-thread interrupt sayaçları ve SGX_AEX telemetrisi fırlar.
  • User space'ten APIC timer yeniden programlama. Privileged görünmeyen bir process'in sık sık one-shot timer kurması ve IDT manipülasyonu anormaldir.
  • PTE Accessed-bit çalkantısı. Enclave'i destekleyen page'lerde Accessed bit'lerinin tekrar tekrar temizlenmesi güçlü bir göstergedir; page-table monitoring veya hypervisor introspection bunu işaretleyebilir.
  • Enclave-içi tespit. AEX-Notify ile instrument edilmiş enclave'ler, forward progress yapmadan önce interrupt'a uğradıklarını gözlemleyip ardışık single-step event'lerini sayabilir.
  • Bir enclave çağrısının baseline'a kıyasla çılgınca şişmiş yürütme süresi (binlerce interrupt) kaba ama güvenilir bir host tarafı kırmızı bayraktır.

Mitigation

  • AEX-Notify (Intel SGX extension'ı). AEX'te enclave-içi bir handler teslim eden hardware/SDK desteği; enclave'in ileriye "constant-time prefetch" yapmasını sağlar, böylece bir interrupt onu artık güvenilir biçimde tek instruction'da durduramaz — single-step oracle'ını çökertir.
  • Trusted runtime'lar içinde defansif bir sezgisel olarak interrupt-rate / single-step tespiti (AEX'leri saymak, anomalide abort etmek).
  • Constant-time, data-oblivious enclave kodu. Secret-dependent branch'leri ve bellek erişimlerini kaldırmak, stepping başarılı olsa bile kanalı reddeder.
  • CPU microcode'unu ve SGX SDK/PSW'yi güncel tut, çünkü hassas stepping, microcode düzeltmesi de alan transient-execution enclave saldırılarının asıl etkinleştiricisidir.

References