Skip to content

Branch Shadowing (SGX BPU)

SGX, enclave exit'te branch history'yi temizlemediği için, saldırgan enclave branch'lerini aynı virtual address'lerde "shadow"layabilir ve her branch'in taken/not-taken sonucunu paylaşılan branch-prediction unit'inden okuyabilir.

Mechanism

Note

branch-prediction unit (BTB, directional predictor, LBR) virtual address ile indexlenir ve enclave/non-enclave sınırı boyunca paylaşılır. Branch Shadowing'in istismar ettiği kök neden, Intel SGX'in enclave mode'dan non-enclave mode'a geçerken branch history'yi temizlememesidir. Böylece saldırgan, enclave kodunun bir "shadow" kopyasını aynı virtual address'lerde map'ler, tek bir enclave branch'inin yürütülmesine izin verir, sonra çıkar ve shadow branch'i çalıştırır. BPU hâlâ enclave branch'inin durumunu tutuyorsa, shadow branch buna göre tahmin edilir — ve saldırgan enclave branch'inin alınıp alınmadığını (ve indirect branch'ler/return'ler için nereye gittiğini) öğrenir. Bunu branch başına çözünürlüğe dönüştürmek için saldırgan, enclave'i single-step etmek / hassas şekilde kesmek için APIC timer'ı kullanır, böylece her ölçüm bir branch'i izole eder ve sonucu gürültülü mispredict timing yerine Last Branch Record (LBR) / Intel PT'den okur. Sonuç, enclave'in ince taneli control-flow graph'ıdır — her seferinde bir branch.

Walkthrough

Saldırgan, memory map'leyebilen, APIC timer'ı programlayabilen ve LBR/Intel PT okuyabilen kötü niyetli bir OS'tur.

  1. Shadow kodunu map'le — enclave branch'leriyle aynı virtual address'lerde, böylece shadow branch'ler BPU'da kurbanınkilerle çarpışsın.

  2. Enclave'i single-step et — APIC-timer interrupt'ları kullanarak, böylece bir AEX'ten (asynchronous exit) önce ölçüm penceresi başına tam olarak bir hedef branch yürütülsün.

  3. Shadow branch'i probe et ve BPU durumunu LBR / Intel PT üzerinden oku, enclave branch'inin taken/not-taken'ını (ya da indirect target'ını) kurtar — hatalı mispredict-timing ölçümlerine güvenmeden.

  4. Control flow'u yeniden inşa et — enclave yürütmesi boyunca branch branch.

Raporlanan kapsam
Root cause : branch history not cleared on enclave -> non-enclave switch
Leakage    : per-branch control flow (taken/not-taken; indirect targets)
Readout    : Intel PT / LBR (precise) + APIC-timer single-stepping
Broke      : ORAM-based defenses, Sanctum, SGX-Shield, T-SGX
Defense    : Zigzagger (software control-flow obfuscation)
Venue      : USENIX Security 2017 (Lee, Shih, Gera, T. Kim, H. Kim, Peinado)

Warning

Branch Shadowing, scheduling, interrupt'lar ve page mapping'leri üzerinde kontrole sahip privileged bir saldırgan (kötü niyetli OS/hypervisor) — standart SGX threat model'i — varsayar. Control flow leak eder, dolayısıyla yalnızca secret'a bağlı branch'ler açığa çıkar; data-oblivious kod ona sinyal vermez.

Detection

Kanal yerine onu mümkün kılan primitive'i tespit et: APIC-timer single-stepping'den kaynaklanan anormal yüksek enclave AEX/interrupt oranları (AEX-counting savunmalarının gözlediği aynı sinyal). BPU çarpışmasının kendisi enclave tarafından doğrudan gözlemlenemez.

Mitigation

Zigzagger: control flow'u linearize et/obfuscate et, böylece branch'ler artık secret'a bağlı kararları ayırt edilebilir BPU durumlarına map'lemesin. Daha genel olarak: enclave exit'te branch history'yi flush'la (hardware), data-oblivious/branchless secret'a bağlı kod ve single-stepping'i işaretlemek için AEX-rate izleme.

References