SgxPectre¶
Bir SGX enclave'in dışından branch predictor'ları poison'layarak enclave secret'larını — register state dahil — bir cache covert channel üzerinden sızdıran Spectre tarzı bir transient-execution saldırısı.
Mechanism¶
Bug sınıfı / invariant
SGX'in threat model'i yalnızca enclave içindeki koda güvenir ve çevredeki OS ile process'lerin enclave belleğini okuyamayacağını varsayar. SgxPectre, mimariye değil micro-architecture'a saldırarak bunu kırar. Branch prediction yapıları — Branch Target Buffer (BTB), Return Stack Buffer (RSB) ve Pattern History Table (PHT) — kontrol bir enclave'e girdiğinde flush edilmez veya izole edilmez. Predictor state enclave sınırı boyunca paylaşıldığı için untrusted kod bu yapıları önceden eğitebilir; böylece enclave'in içine girildiğinde indirect/conditional branch'ler speculatively attacker'ın seçtiği bir "Spectre gadget"a sapar. O transient pencerede gadget, enclave belleğini ya da artık register değerlerini okur ve bunları data cache'e encode eder. Architectural sonuç geri alınır ama cache footprint kalır ve cache'i paylaşan attacker secret'ı kurtarır. Başarısız olan invariant, bir privilege/trust geçişi boyunca predictor isolation'dır: SGX speculation'ın sınırına saygı göstereceğini hiç vaat etmedi.
Walkthrough¶
Chen et al., "SgxPectre Attacks" (EuroS&P 2019) makalesinden üst seviye yeniden üretim.
Yalnızca kavramsal
Yayımlanan araştırma spesifik enclave kod pattern'lerine ve SDK-üretimi dizilere dayanıyordu. Aşağıdaki adımlar mantıksal saldırı şeklidir, kullanıma hazır bir exploit değil.
- Enclave'de bir gadget bul. Bir indirect branch'in veya conditional bir path'in, address'i enclave-kontrollü veriye bağlı bir load'a yol açtığı kodu bul (ya da SDK'nın ürettiğine güven) — speculatively erişilirse secret-dependent belleğe dokunan bir dizi.
- Predictor'ı dışarıdan poison'la. Untrusted bir process'ten, enclave-içi branch ile alias yapan virtual address'lerde branch'ler çalıştırarak BTB/PHT/RSB'yi gadget'a doğru eğit.
# representative logical flow, not runnable
train_branch_predictor(target = gadget_addr_in_enclave)
prime_probe_buffer() # set up the cache covert channel
ECALL enclave() # enter; enclave branch mispredicts into the gadget
reload_and_time_buffer() # read which line was touched -> secret byte
- Enclave'e gir.
EENTER/ERESUME'de, hedeflenen branch poison'lanmış predictor'a danışır ve gerçek target çözülmeden önce gadget'ı speculatively yürütür. - Cache üzerinden sızdır. Transient gadget
array[secret * stride]'i yükler; attacker sonra enclave dışındanarray'i reload'layarak hangi line'ın cache'lendiğini öğrenir ve secret'ı elde eder. Tekrarlamak bellek içeriğini, hatta register/SSA'da kalan değerleri kurtarır.
Makale, enclave belleğinin ve enclave'in sealing/attestation ile ilgili secret'larının kurtarıldığını gösterdi; SGX confidentiality'sini ve remote attestation garantilerini zayıflattı.
Detection¶
- Enclave çalıştıran core'larda anormal branch-misprediction ve cache-miss pattern'leri; performance-counter monitoring (izin verildiği yerde) yoğun mistraining'i ve enclave entry/exit'ine bitişik Flush+Reload tarzı probing'i ortaya koyabilir.
- Host process'inde cache-timing döngüleriyle eşleşen yüksek frekanslı ECALL/OCALL çalkantısı.
- Attestation/versiyon kontrolleri. Confidential workload'lar çalıştırırken yama uygulanmamış microcode (IBRS/IBPB/STIBP yok) raporlayan bir platform tek başına sinyaldir; remote attestation, yamalı baseline'ın altındaki CPUSVN/microcode'u işaretleyebilir.
- Sızıntı micro-architectural olduğundan host EDR veri akışını doğrudan göremez — tespit, payload incelemesi yerine davranışsal anomalilere (sıkı timing döngüleri, predictor mistraining) ve yama seviyesinin attestation'ına dayanır.
Mitigation¶
- Microcode + Spectre v2 savunmaları: IBRS, IBPB (indirect predictor'ları flush etmek için enclave girişinde verilir) ve STIBP, Intel microcode güncellemeleriyle teslim edilir ve cross-boundary BTB poisoning'i körleştirir.
- Retpoline / serialize edilmiş indirect branch'ler ve register'ları temizleyip enclave
girişinde
lfenceekleyen SDK yeniden derlemesi; kolay poison'lanan indirect branch'leri ve artık register state'ini kaldırır. EENTER/ERESUME'de predictor-hassas dizileri temizleyip serialize eden güncellenmiş SGX SDK/PSW.- Attestation baseline'ını (CPUSVN/microcode) yükselt ki güvenen taraflar yamasız silicon üzerindeki enclave'leri reddetsin.