Bounds Check Bypass Store¶
Spectre v1 sub-variant (v1.1): bir store üzerindeki bounds check'i speculative olarak bypass et, böylece bir out-of-bounds yazma transient olarak yürütülsün ve speculative (ve zincirlenmiş) control flow'u ele geçirmek için return address'leri ya da pointer'ları üzerine yazsın.
Mechanism¶
Note
Klasik Spectre v1 (Bounds Check Bypass) veriyi bir transient out-of-bounds load üzerinden leak eder. BCBS (Spectre v1 sub-variant "v1.1" / CVE-2018-3693) fikri store'lara genişletir. Değişmez nokta: bir store'u koruyan conditional bir bounds check in-bounds olarak yanlış tahmin edildiğinde, CPU branch çözülmeden önce out-of-bounds bir adrese yazmayı speculative olarak gerçekleştirir. Store architectural olarak ezilse de, etkileri önemli olacak kadar uzun yaşar: bir transient store bir return address'i, bir function pointer'ı ya da store queue'da halihazırda buffer'lanmış başka bir değeri üzerine yazabilir ve sonraki bir transient load/branch zehirlenmiş değeri tüketebilir. Bu, "speculative buffer overflow"lar yaratır — klasik bir stack/heap overflow'un speculative karşılığı — ve saldırganın transient execution'ı keyfi bir disclosure gadget'ına yönlendirmesine ve leak'i tek bir array okumasının çok ötesine genişletmesine olanak tanır.
Walkthrough¶
Savunmasız bir desen, index'in saldırgan kontrollü olduğu bir buffer'a yapılan bounds-checked bir store'dur:
// 'idx' is attacker-controlled; the branch is trained to predict in-bounds.
if (idx < array_len) { // mispredicted as taken
array[idx] = value; // speculative OOB store (BCBS)
}
-
Predictor'ı eğit. in-bounds
idxile tekrar tekrar çağır, böylece branch predictor "taken"ı öğrensin. -
Mistrain + OOB index ver. Örneğin kaydedilmiş bir return address'e ya da bir code pointer'a işaret eden
idxver. Misprediction penceresi sırasında CPU orayavalue'yu speculative olarak yazar. -
Zincirle. Üzerine yazılan o pointer'ın speculative bir load'u ile birleştir, transient control flow'u bir disclosure gadget'ına yönlendir — speculative ROP / "return-oriented" transient execution.
// Conceptual chained gadget: a speculative store overwrites a pointer that a
// later speculative load dereferences and uses to index a probe array.
if (i < n) ptrs[i] = attacker_ptr; // BCBS speculative store
... // later, transiently:
char x = *ptrs[j]; // speculative load of poisoned pointer
probe[x * 4096]; // FLUSH+RELOAD leakage signal
Beklenen davranış
Detection¶
Runtime'da zordur. Static analysis / compiler araçları, indirect kullanımın takip ettiği bounds-checked store'ları işaretleyebilir; yoğun misprediction'da performance-counter anomalileri zayıf sinyallerdir.
Mitigation¶
Hassas store'larda bounds check'lerden sonra speculation barrier'ları (lfence)
ekle; Speculative Store Bypass / store-hardening mitigation'ları; index
masking (idx'i power-of-two bir mask'e clamp'le); güvenlik açısından kritik
konumlara (return address'ler, vtable'lar) speculative yazmalardan kaçın.
Compiler'lar işaretlenen desenlere barrier ekler.