Skip to content

Load Value Injection

LVI (CVE-2020-0551) Meltdown'ın data flow'unu tersine çevirir: victim'in secret'larını dışarı okumak yerine, attacker, attacker'ın kontrol ettiği değerleri victim'in transient execution'ının içine enjekte eder ve SGX enclave'lerinin keyfi şekilde hijack edilmesini mümkün kılar.

Mechanism

Neden çalışır

Modern CPU'lar, memory-access latency'sini gizlemek için değerleri microarchitectural buffer'lar (store buffer, fill buffer, load port) arasında şeffaf biçimde forward eder. Bir victim load fault verdiğinde ya da bir assist tetiklediğinde, processor fault handle edilene kadar beklemek yerine load'un değerini transient olarak bu buffer'lardan birinden alabilir. Eğer attacker daha önce o buffer'ı seçtiği bir değerle poison'lamışsa, o değer transient window sırasında victim'in register file'ına forward edilir. Dependent gadget instruction'lar daha sonra, processor fault'u tespit edip transient state'i squash etmeden önce attacker'ın enjekte ettiği değerle çalışır. Side-channel leakage (örneğin bir cache timing sinyali) squash'tan önce gerçekleşir; bu da attacker'a kendi enjekte ettiği input'a bağlı secret-dependent trace'leri gözlemleme imkânı verir — yani victim'i fiilen bir oracle'a dönüştürür.

Walkthrough

LVI, Van Bulck et al. (IEEE S&P 2020) tarafından belgelendiği üzere dört kavramsal fazda ilerler:

Phase 1 — Buffer poisoning

Attacker, hedeflenen bir microarchitectural buffer'ı (store buffer, fill buffer veya load port) seçtiği bir V değeriyle doldurur. Örneğin, attacker'ın kontrol ettiği bir adrese yapılan bir store, store buffer'a V yerleştirir.

// Attacker side: plant a value into a shared fill buffer entry
volatile uint8_t dummy;
*attacker_page = INJECTED_VALUE;   // populates fill buffer

Phase 2 — Fault or assist induction

Attacker, victim'in fault verecek ya da bir microcode assist gerektirecek bir load çalıştırmasını ayarlar. SGX threat model'inde bu, bir page-table entry'sinin present bit'i geri çekilerek tetiklenebilir; bu da victim'in sonraki erişiminde bir page fault'a yol açar.

// Attacker manipulates page table to make victim load fault
// (requires kernel/hypervisor privileges or SGX AEX capability)
revoke_present_bit(victim_page);
resume_enclave();   // victim load now faults transiently

Phase 3 — Transient gadget execution

Fault'u izleyen transient window sırasında CPU, load sonucu olarak V değerini (poison'lanmış buffer'dan) forward eder. Faulting load'dan sonraki instruction'lar, sanki meşru yüklenmiş değermiş gibi V değerini kullanarak transient olarak çalışır.

// Conceptual victim gadget (inside SGX enclave):
secret = *faulting_ptr;           // transiently receives INJECTED_VALUE
leak_via_cache(array[secret * 64]); // secret-dependent cache access

Phase 4 — Side-channel observation

Attacker, hangi cache line'a erişildiğini belirlemek için cache state'ini ölçer (örneğin array üzerinde Flush+Reload kullanarak); bu da ilgilenilen branch ya da hesaplamaya hangi enjekte edilmiş değerin yol açtığını ortaya çıkarır.

??? Expected Flush+Reload timing output (illustrative):
  array[0x00 * 64]: ~250 cycles  (cache miss)
  array[0x41 * 64]:  ~45 cycles  (cache hit -> INJECTED_VALUE == 0x41)
  array[0xff * 64]: ~250 cycles  (cache miss)

SGX'e özgü severity

Bir SGX enclave içinde attacker, untrusted OS'i kontrol eder ve enclave kodunun kendisinde herhangi bir güvenlik açığına ihtiyaç duymadan istediği zaman page fault tetikleyebilir. Meltdown'a (KPTI) ve Spectre'a (retpoline'lar) karşı mevcut mitigation'lar LVI'yı engellemez. Paper, yalnızca yazılım tabanlı savunmalar için 2x–19x performans overhead'i raporlar.

Detection

  • Enclave attestation auditing: Remote attestation, enclave binary'sinin yamalı bir compiler toolchain (lfence ile sertleştirilmiş SGX SDK) tarafından üretildiğini doğrulayabilir; bu da mitigation'ın dolaylı bir kanıtını sağlar.
  • Hardware performance counter'lar: Olağandışı oranlarda microcode assist ya da page-fault kaynaklı AEX (Asynchronous Enclave Exit) olayları aktif exploitation girişimlerine işaret edebilir; ancak amaca özel counter'lar olmadan LVI exploitation'ını normal enclave fault'larından ayırt etmek zordur.
  • Binary analysis: Enclave binary'lerinin static analysis'i, her load instruction'ından sonra lfence barrier'larının varlığını kontrol edebilir; yokluğu yamalanmamış bir build'e işaret eder.

Mitigation

  • Her load'dan sonra compiler tarafından eklenen lfence: Birincil yazılım savunması her load'dan sonra execution'ı serialize eder ve transient forwarding'i engeller. Intel'in mitigation rehberi ve SGX SDK güncellemesi bu eklemeyi otomatikleştirir.
  • ret instruction'ını blacklist'le: ret instruction'ı, return-address injection gadget'ı olarak özellikle tehlikelidir. Bir lfence; ret dizisiyle değiştirin ya da retpoline benzeri bir trampoline kullanın.
  • Microcode güncellemeleri: Intel, enclave entry/exit sırasında etkilenen buffer'ları flush'layan (VERW instruction kullanımı) microcode güncellemeleri yayımladı; bu attack surface'i azaltır ama tüm LVI varyantları için ortadan kaldırmaz.
  • Hardware fix'leri: Gelecek CPU nesilleri, faulting load'lardan illegal value forwarding'i engelleyen hardware mitigation'ları içerir.
  • Enclave attack surface'ini minimize et: SGX enclave'leri içinde memory load'larının ardından gelen code gadget sayısını azaltın; constant-time, branch-free hesaplamayı tercih edin.

References