Pathfinder¶
Conditional branch predictor'ın Path History Register'ını ve Pattern History Table'larını okuyup zehirleyerek bir victim'in tam branch history'sini yeniden inşa eden ve secret'ları sızdıran yüksek çözünürlüklü control-flow saldırıları.
Mechanism¶
Modern Intel core'ları conditional branch'leri iki kilit yapıdan oluşan TAGE-benzeri bir predictor ile tahmin eder: yakın branch'lerin adreslerini ve taken/not-taken sırasını birlikte katlayan bir Path History Register (PHR), ve (branch PC, PHR) hash'i ile indexlenmiş saturating counter'lardan oluşan bir Pattern History Tables (PHTs) kümesi. Pathfinder (Yavarzadeh et al., ASPLOS 2024) her ikisini de okunabilir ve yazılabilir state olarak ele alır.
Neden çalışır
PHR, taken/not-taken sonuçlarının basit bir bitmap'i değildir — "her taken branch için birden çok adresin ve target bit'inin karmaşık bir kombinasyonu"dur. Her taken branch PHR'yi adres- ve sıra-bağımlı bir şekilde perturbe ettiği için, yürütmenin bir noktasındaki PHR değeri ona ulaşan control-flow yolunun neredeyse benzersiz bir parmak izidir. Dolayısıyla PHR'yi recover edebilen bir attacker taken branch'lerin tam dizisini yeniden inşa edebilir (doğrudan ~194 yakın taken branch'e kadar, ve iteratif bir "extended read" ile fiilen sınırsız history). Ve PHT'ler paylaşımlı olduğu ve (PC, PHR) ile adreslenebildiği için, bir attacker counter state'lerini yazarak da bir victim'i seçtiği bir misprediction'a zorlayabilir — branch seviyesinde hassasiyete sahip Spectre tarzı bir mistraining primitive'i.
Walkthrough¶
Saldırı conditional branch predictor üzerinde dört primitive sunar:
- Read PHR — son taken branch'leri yeniden inşa etmek için mevcut PHR'yi recover et.
- Extended Read PHR — ~194-branch penceresinin ötesindeki branch history'yi recover etmek için iterate et.
- Read PHT — belirli bir
(PC, PHR)entry'sindeki saturating-counter state'ini oku. - Write PHT — bir counter'ı seçilen bir state'e zorla, gelecekteki bir prediction'ı biaslı hale getir.
Belirli bir PHT entry'sini okumak veya yazmak için attacker, hemen öncesinde seçilen bir PHR değeri bulunan, seçilen bir program counter ile bir conditional branch yürütür. Referans implementasyon bu PHR state'lerini assembly macro'larıyla (clear, shift ve "PHR_Model" setter'ları) inşa eder:
# Pathfinder primitives are assembly macros over the branch predictor
# (from attack.nasm in the reference PoC)
PHR_Clear ; reset the path history register to a known state
PHR_Shift ; advance PHR by one taken branch
PHR_Model ... ; set PHR to a specific target value before the probed branch
Yeniden inşa offline bir binary-analysis adımıdır: gözlemlenen PHR her seferinde 2 bit ("doublet") olarak decode edilir ve angr, victim binary'sindeki recover edilen PHR ile tutarlı control-flow yollarını enumere eder.
# Not: reference PoC repo'su github.com/hoseinyavarzadeh/Pathfinder_Attack;
# README'deki eski "pathfinder_source.git" clone URL'i artık 404 veriyor.
git clone --recursive https://github.com/hoseinyavarzadeh/Pathfinder_Attack.git
chmod a+x *.sh
./install.sh # build PoC + angr-based PHR analyzer
./run.sh # run read/write primitive demo against a victim function
Paper iki uçtan uca vaka çalışması gösterir:
- AES key recovery — ara değerleri recover edip secret AES anahtarını yeniden inşa etmek için branch'leri zehirleme/gözlemleme.
- Secret-image recovery —
libjpegrutinlerinin bir görüntüyü decode ederkenki eksiksiz control flow'unu yakalayıp görüntünün kendisini recover etme.
Warning
Public PoC, Intel 12./13./14. nesil P-core'ları hedefler; yazarlar tekniğin daha eski microarchitecture'lara genellenebildiğini ama branch-predictor'a özgü offset'lerin her core için yeniden türetilmesi gerektiğini belirtir. Bu bir microarchitectural saldırıdır, bir software bug değil — architectural-secret-bağımlı control flow okur, dolayısıyla herhangi bir data-bağımlı branch'leme (key schedule'lar, table lookup'lar, görüntü decode yolları) potansiyel olarak ifşa olur.
Mitigation¶
Pathfinder, Spectre v1 (PHT) sınıfıyla yakından ilişkilidir. Vendor'lar Nisan 2024'te yanıt verdi: Intel INTEL-2024-04-26-001 güvenlik duyurusunu yayımladı ve mevcut Spectre-v1 rehberliğine işaret etti; AMD AMD-SB-7015 yayımladı; CERT/CC bunu VU#157097 olarak takip etti. Savunmalar standart branch-predictor-isolation ve constant-time araç setidir: secret-bağımlı branch'lerden kaçın, data-oblivious / constant-time crypto kullan ve security domain'leri arasında branch-predictor flushing veya partitioning (ör. IBPB) uygula.