Skip to content

BTB Covert Channel

İki process arasında (veya SMT core'lar üzerinden) Branch Target Buffer collision'ları oluşturup tespit ederek bir covert channel kur — bir process bit'leri branch varlığı olarak encode eder, diğeri onları misprediction timing olarak okur.

Mechanism

Note

Branch Target Buffer (BTB), yakın zamanda çalıştırılmış branch'lerin tahmin edilen hedeflerini, branch'in virtual address'inin (bir alt kümesi) ile indexleyerek cache'ler. Sonlu, set-associative bir yapıdır ve bir core'u time-share eden process'ler ile SMT sibling'lar arasında paylaşılır. Değişmez nokta şu: farklı process'lerden iki branch aynı BTB set/way'ine map'leniyorsa, birinin çalışması diğerinin entry'sini evict eder. BTB'yi kendi branch'leriyle doldurmuş bir receiver, colliding bir entry'nin evict edilip edilmediğini kendi branch'ini timing'leyerek anlayabilir — evict edilmiş bir entry mispredict olur ve yavaş çalışır, hayatta kalan bir entry doğru tahmin edilir ve hızlı çalışır. Bir sender bunu modüle eder: 1 göndermek için receiver'ın izlediği entry'lerle collide olan (ve onları evict eden) branch'ler çalıştırır; 0 göndermek için sessiz kalır. Bu, BTB tabanlı ASLR kırma (Jump-over-ASLR) işlemlerinin altında yatan transmit/receive primitive'i ve Spectre-v2 mistraining için bir yapı taşıdır.

Walkthrough

  1. BTB indexing'i reverse et (opsiyonel ama daha güçlü). Hangi adres bit'lerinin BTB set'ini seçtiğini belirle ki sender ve receiver kasıtlı olarak collide olabilsin (orijinal çalışma BTB hash'i bilgisini kullanır).

  2. Receiver bir branch kümesini prime + probe eder ve onları timing'ler:

// Receiver: time a monitored branch; slow == evicted by the sender (bit 1).
static inline uint64_t time_branch(void (*target)(void)) {
    uint64_t a = rdtscp_serialize();
    target();                         // taken branch into 'target'
    uint64_t b = rdtscp_serialize();
    return b - a;                     // > threshold => mispredict => evicted
}
  1. Sender bit'leri encode eder: her symbol penceresinde colliding branch'ler çalıştırarak (evict = 1) ya da boş durarak (eviction yok = 0). Receiver, bit stream'ini geri kazanmak için kendi branch timing'ine bir threshold uygular.
Expected behavior
Structure:  Branch Target Buffer (set-associative, addr-indexed, shared)
Primitive:  collision/eviction detected by branch-misprediction timing
Channel:    cross-process / cross-SMT covert channel
Related:    Jump-over-ASLR (BTB collisions to derandomize), Spectre-v2
            BTB mistraining

Detection

Branch misprediction'larda performance-counter anomalileri; address-aligned branch'lerin sıkı (tight) loop'larının tespit edilmesi. Pratikte genelde yakalanması zordur.

Mitigation

Context switch'ler ve privilege transition'lar boyunca BTB'yi flush'la/partition'la (IBPB tarzı barrier'lar); hassas kod için SMT'yi devre dışı bırak; daha büyük entropy'li ASLR artı BTB isolation; BTB indexing'i randomize et. Spectre-v2 BTB mistraining'i engelleyen aynı hijyen, bu channel'ı da engeller.

References