Skip to content

Spectre-BTB same-address-space in-place

Spectre-BTB (branch target injection / Variant 2)'nin, Branch Target Buffer'ın victim'in kendi aynı vulnerable indirect branch'ini çalıştırmasıyla mistrain edildiği hali — ayrı bir attacker process'e veya aliasing branch'e gerek yok.

Mechanism

Neden çalışır

Spectre-BTB (Spectre Variant 2), Branch Target Buffer (BTB)'ı poison'lar; böylece CPU bir indirect branch'in target'ını mispredict eder ve attacker'ın seçtiği bir hedefte transient olarak execute eder. Canella et al. tüm history-based Spectre variant'larını iki eksen üzerinde düzenler (makalenin Figure 3'ü):

  • Address space — SA vs CA. Branch prediction buffer'ları "yaygın olarak branch instruction'ın virtual address'ine göre index'lenir," dolayısıyla mistraining ya victim'in kendi address space'i içinde (SA) ya da "farklı, attacker-controlled bir process"ten (CA) gerçekleşebilir.
  • Location — IP vs OP. Mistraining ya "vulnerable branch'in kendisini (in-place)" ya da "congruent bir virtual address'teki bir branch'i (out-of-place)" kullanabilir — ikincisi virtual address'in yalnızca bir subset'inin prediction'da kullanıldığı gerçeğini suistimal eder.

BTB-SA-IP, her iki seçimin de kendi/aynı opsiyon olduğu köşedir: victim process, geçerli input'larla vulnerable indirect branch'in kendisini tekrar tekrar execute eder ve BTB'yi victim'in meşru biçimde kullandığı bir target'a doğru eğitir. Canella et al. şunu söyler: "Spectre-BTB mistraining'in, vulnerable indirect branch'i geçerli input'larla tekrar tekrar çalıştırarak da ilerleyebileceğini fark eden ilk biziz," yani "altta yatan branch target predictor'ı mistrain etmek için victim'in kendi execution'ını" suistimal ederler.

Azalmış attacker kontrolü

Branch hedefi artık "attacker'ın doğrudan kontrolünde olmayıp victim koduyla belirlendiği" için, BTB-SA-IP klasik cross-process Spectre-v2'nin sağladığı keyfi transient control-flow yönlendirmesinin tam gücünü sunamaz. Bunun yerine kendini speculative type confusion olarak gösterir: bir TypeA object üzerinde tekrar tekrar çağrılan bir C++ virtual call, predictor'ı öyle mistrain edebilir ki aynı call site, nihayet bir TypeB object üzerinde çağrıldığında TypeA method'una misspeculate eder.

Walkthrough

Tanımlayıcı özellik, ayrı bir trainer bulunmamasıdır — victim kendini eğitir. Kavramsal olarak, tek bir gözlemlenen target tarafından domine edilen bir indirect call site, gelecekteki prediction'ları o target'a doğru eğen BTB state'i inşa eder:

// Conceptual: a polymorphic dispatch repeatedly seen with TypeA...
for (i = 0; i < N; i++)
    obj_a->vtable->handle(obj_a);   // BTB at this call site learns A::handle

// ...then invoked once with a TypeB object:
obj_b->vtable->handle(obj_b);       // architecturally B::handle,
                                    // but may transiently run A::handle
                                    // (speculative type confusion)

Speculative window boyunca yanlış method body, obj_b'nin memory'si üzerinde çalışır; field'ları farklı bir type'mış gibi ele alıp bir transient leak gadget'ı besleyebilir (örn. address'i bir secret'a bağlı olan out-of-bounds bir load).

Mistraining-strategy matrix (Canella et al., Figure 3)

                     in-place (IP)             out-of-place (OP)
                     (same branch)             (congruent branch)
same-addr (SA)   victim runs the victim    victim runs a congruent
(intra-process)  branch  <-- THIS DOC      branch at aliasing vaddr

cross-addr (CA)  attacker runs a "shadow"  attacker runs a congruent
(cross-process)  branch at same vaddr      branch in another process
BTB-SA-IP, sol-üst hücredir: aynı address space, in-place.

Detection

  • indirect-branch / BTB misprediction'ları için performance counter'lar (örn. Intel'deki BR_MISP_* ailesi), bir call site'ın gözlemlenen target'ı architectural olandan saptığında ani yükselir.
  • Target'ı type-dependent olan ve birden çok object type'ın aynı site'a ulaştığı indirect/virtual call site'lar için code seviyesinde inceleme — speculative type confusion'ın ön koşulu budur.

Mitigation

Canella et al., victim domain içindeki in-place mistraining'in "victim'e girmeden önce BTB'yi flush eden ve/veya partition eden, yaygın biçimde dağıtılmış mitigation'ları bypass etmeye olanak tanıyabileceğini" belirtir — çünkü poisoning barrier'dan sonra, victim'in kendi içinde gerçekleşir. Dolayısıyla yalnızca cross-domain poisoning'i ele alan kontroller burada yetersizdir:

  • IBRS / enhanced IBRS — privileged koddaki indirect branch'lerin daha az ayrıcalıklı kod tarafından etkilenmesini kısıtlar; eIBRS, daha yeni Intel parçalarındaki hardware Spectre-BTB savunmasıdır.
  • IBPB — domain switch'inde BTB'yi flush'lar, böylece önceki kod sonraki prediction'ları etkileyemez. Cross-domain poisoning'e karşı işe yarar, ama victim'in kendini in-place eğitmesini durdurmaz.
  • STIBP — SMT sibling'ler arası BTB paylaşımını engeller (yine cross-thread bir kontrol, intra-victim değil).
  • retpoline — indirect branch'leri, zararsız bir loop'a speculate eden ret-tabanlı bir yapıya dönüştürür ve korunan site'ta BTB-driven target prediction'ı tümüyle ortadan kaldırır.

References