Skip to content

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)
victim:  call  *handler          ; predicted target = attacker gadget
gadget:  mov   al, [secret]       ; transient
         mov   rbx, [array+al*4096] ; leaks 'al' into cache set
attacker: time array accesses -> recover secret byte

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 perf mispredict/br_misp_retired sıç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