Skip to content

Spectre-PHT same-address-space out-of-place

Victim conditional'ını hiç execute etmeden eğen same-process Spectre-PHT mistraining'i: attacker, virtual address'i PHT index'inde victim branch'e alias'lanan farklı bir "congruent" branch çalıştırır.

Mechanism

Note

Pattern History Table (PHT), branch instruction'ın virtual-address bit'lerinin bir subset'iyle global branch history'nin birleşimine göre index'lenir — tam address'le değil. Address'leri o index bit'lerinde uyuşan iki ayrı branch congruent'tir: aynı PHT entry'sine map'lenir ve tek bir saturating counter'ı paylaşır. Canella et al. taksonomisinde bu Spectre-PHT, same-address-space, out-of-place (PHT-OP)'dir. Attacker, victim branch'e congruent bir virtual address'te bir shadow branch inşa eder, sonra o branch'i "taken / in-bounds"a doğru eğer. Her iki branch de aynı counter'a alias'landığı için victim prediction'ı miras alır. In-place (Spectre v1) variant'ından temel fark şudur: in-place, aynı address'teki tam victim branch'ini eğitir; out-of-place ise PHT index'inde çakışan farklı bir congruent branch'i eğitir — attacker victim branch'i seçilen input'larla doğrudan süremediğinde ama aynı process'te seçilen bir virtual address'te kod çalıştırabildiğinde (örn. address space'i paylaşan bir JIT, plugin ya da sandbox'lı modül) yararlıdır.

Walkthrough

Attacker bir shadow branch'i kontrol eder ve PHT index bit'lerini bilir (ya da brute-force eder), böylece shadow victim branch'e alias'lanır.

  1. Congruent bir address bul. PHT'nin kullandığı index bit'lerini belirle; index bit'leri victim branch'le eşleşen bir virtual address'e bir shadow conditional branch yerleştir. Birden çok instruction tek bir PHT entry'sine map'lenir, dolayısıyla shadow'un victim'in tam address'ini paylaşması gerekmez — yalnızca onun index bit'lerini.
// Shadow (attacker) branch, placed at an address congruent to the victim
// branch in the PHT index. Trained to "taken" without touching the victim.
void shadow_train(void) {
    for (int i = 0; i < 1000; i++)
        if (1)                 // always-taken: biases the shared PHT counter
            asm volatile("nop");
}
  1. Out-of-place train et. shadow_train()'i tekrar tekrar çalıştır. Victim branch hiç execute olmasa da, her iteration paylaşılan PHT counter'ını "taken"e doğru iter.

  2. Victim'e devret. Victim yolunu bir kez çağır. Conditional'ı, shadow-biased counter'ı yeniden kullanır, "in-bounds" mispredict eder ve guarded body'yi bounds check'in ötesinde speculative olarak execute eder.

  3. Recover et. Tam olarak in-place durumundaki gibi, transient secret'ı bir covert channel üzerinden (bir probe array üzerinde Flush+Reload) oku.

Beklenen davranış
Variant:    Spectre-PHT, same-address-space, out-of-place (PHT-OP)
Trained:    a DIFFERENT congruent branch (shadow), not the victim branch
Aliasing:   shadow & victim share PHT index bits -> same counter
Trigger:    victim branch inherits the shadow's biased prediction
Use case:   attacker can run code at a chosen VA but not drive the victim
Channel:    Flush+Reload (cached slot == leaked secret byte)

Detection

Architectural seviyede normal branching'den ayırt edilemez; yalnızca microarchitectural artifact'ler (eğitilmemiş bir victim branch'inde anormal misprediction'lar) buna işaret eder. Savunmalar preventive'dir.

Mitigation

Victim gadget'ı üzerindeki speculation barrier'ları / index masking, PHT'nin nasıl poison'landığından bağımsız olarak etkili kalır. Context switch'te branch predictor'ı flush'lamak ya da partition etmek residual training'i azaltır; indirect-branch kardeşi için ../mitigation/retpoline.md ve ../mitigation/indirect-branch-prediction-barrier.md'a bakın.

References