Indirect Branch Predictor Mistraining¶
CPU'nun indirect-branch predictor'ını (BTB/global history) zehirle, böylece bir victim'in
jmp/call [reg]'i speculatively attacker'ın seçtiği bir gadget'a atlasın — Spectre v2'nin (Branch Target Injection) özü.
Mechanism¶
Indirect branch'ler predict edilir ve prediction paylaşılır
Bir indirect branch'in (jmp *%rax, virtual call, vb.) hedefini CPU, operand
çözülene kadar bilmez. Stall'ı önlemek için front end, hedefi Branch Target
Buffer (BTB)'de saklanan history'den predict eder; bu genellikle branch'in
virtual address bit'lerinin bir alt kümesiyle birlikte birikmiş global branch
history (BHB) kullanılarak indeksenir. Kritik olarak, bu predictor state'i sık
sık privilege level'lar, SMT sibling'lar ve address space'ler arasında
paylaşılır ve kısmi address bit'leri üzerinde alias yapar.
Kendi branch'lerini, victim'in kullanacağı aynı predictor entry'lerine düşecek şekilde çalıştıran bir attacker, kötü niyetli bir hedef kurabilir. Victim daha sonra indirect branch'ini çalıştırdığında, CPU gerçek hedefi çözmeden önce speculatively attacker'ın seçtiği adrese (bir "disclosure gadget") atlar. Transient execution ardından veriyi bir cache side channel üzerinden sızdırır; architectural state geri alınır, ama microarchitectural iz kalır.
Bu, Branch Target Buffer Poisoning (Spectre v2) arkasındaki predictor-poisoning mekanizmasıdır; ilgili collision'lar BTB Collision'da, history efektleri ise Branch History Buffer fingerprinting'de ele alınır.
Walkthrough¶
1. Mistraining mode'unu seç.
out-of-place, cross-address-space : train aliasing branches in attacker
process to steer victim's branch
in-place, same-address-space : repeatedly run the victim's own branch
with valid inputs to bias its BTB entry
In-place training, domain girişinde BTB'yi flush/partition eden savunmalardan sağ çıkabilir, çünkü poisoning victim domain'inin içinde gerçekleşir.
2. History ve adresi hizala. BHB ve indeksleme address bit'leri victim branch'inkiyle eşleşecek bir dizi çalıştır; böylece kötü niyetli hedefini victim'in danışacağı entry'ye map'le.
replay a branch trail to set BHB == victim's history at the indirect branch
ensure source address aliases the victim branch in the BTB index
3. Tetikle ve exfiltrate et. Victim'i zehirlenmiş indirect branch'i çalıştırmaya zorla; o, speculatively gadget'ı koşar ve secret'a bağlı veriyi cache'e yükler. Flush+Reload / Prime+Probe ile geri kazan.
Speculative redirect (conceptual)
Tam adres değil, aliasing yeterli
BTB, address bit'lerinin bir alt kümesi artı history üzerinden indekslediği için, attacker'ın nadiren özdeş virtual adreslere ihtiyacı olur — aynı entry'ye kısmi aliasing yeterlidir; cross-address-space mistraining'i pratik kılan da budur.
Detection¶
- Attack loop'ları sırasında
perfmispredict/br_misp_retiredsıçramaları. - Hassas geçişlerden önce tekrarlanan, history-şekillendiren branch trail'leri.
Mitigation¶
- IBRS / eIBRS, STIBP, IBPB, privilege ve SMT arasında predictor paylaşımını kısıtlar veya bariyerler; retpoline, indirect branch'leri BTB'den predict edilmeyen return tabanlı bir yapıyla değiştirir.
- BHB clearing / BHI controls, global-history tabanlı varyantlar için.
References¶
- Kocher et al. Spectre Attacks: Exploiting Speculative Execution. IEEE S&P 2019 — https://spectreattack.com/spectre.pdf
- Canella et al. A Systematic Evaluation of Transient Execution Attacks and Defenses. USENIX Security 2019 — https://arxiv.org/pdf/1811.05441
- Li et al. Indirector: High-Precision Branch Target Injection Attacks. USENIX Security 2024 — https://www.usenix.org/system/files/usenixsecurity24-li-luyi.pdf