Skip to content

BlindSide (speculative probing)

Corrupt code pointer'ları yalnızca speculatively-executed path'lerde dereference ederek KASLR-randomized bir kernel'i crash'lemeden probe et; bu, Spectre döneminde BROP tarzı blind exploitation'ı mümkün kılar.

Mechanism

Note

BlindSide, memory-corruption tabanlı speculative control-flow hijacking yapar. Control flow'u architectural olarak hijack etmek yerine, attacker yalnızca architectural olarak alınmayan ama speculatively execute edilen bir branch path'inde dereference edilen bir code pointer'ı corrupt eder. Tekrarlanan probing'den gelen tüm fault'lar speculative domain'de bastırılır; bu sırada attacker success/failure sinyalini bir crash yerine bir microarchitectural (cache) side channel üzerinden leak eder.

Bu, klasik Blind ROP'un (BROP) "crash-on-wrong-guess" varsayımını kırar: yanlış bir address tahmini normalde target'ı crash'lerdi ve attacker'ın iyi ile kötü tahminleri ayırmasını sağlardı. Speculative probing altında yanlış-tahmin dereference'ı, misprediction çözüldüğünde squash edilir ve architectural bir fault üretmez — dolayısıyla attacker randomized kernel'i hiç crash'lemeden tekrar tekrar probe edebilir. Retpoline yardım etmez, çünkü pointer gerçek kod içinde sahiden corrupt edilmiştir ve yalnızca speculative olarak execute edilir.

Walkthrough

Probing sinyali bir FLUSH+RELOAD cache timing channel'ıdır: eğer speculative execution seçilen bir memory konumuna dokunduysa, ona yapılan sonraki bir erişim ölçülebilir biçimde daha hızlıdır (cached). Primitive'ler katmanlanır:

stage 1  - locate base addresses of important regions (derandomize KASLR)
stage 2  - probe gadgets:  is this a valid code page? a data page? a specific gadget?
           (each probe = corrupt-pointer-on-speculative-path + FLUSH+RELOAD readout)

Paper'dan gösterilen uçtan uca sonuçlar:

  • ROP kurmak için KASLR'ı derandomize etmek.
  • execute-only memory / FGKASLR dahil fine-grained şemaları kırmak; bir root password hash'i leak ederek gösterilmiştir.
  • JIT-ROP'u mümkün kılmak için kernel text'i dump etmek.

Warning

BlindSide, corrupt pointer'ı yerleştirmek için bir memory-corruption primitive'i (örn. bir heap overflow) varsayar; sonraki probing'i crash'siz yapan şey speculative açıdır, başlangıçtaki corruption'ın kendisi değil.

Mitigation

Paper, mevcut Spectre mitigation'larının ve FGKASLR'ın yetersiz olduğunu savunur, çünkü corruption architectural'dır ve yalnızca dereference speculative'dir. Savunma yönü, corrupt pointer'ların speculative dereference'ını engellemektir (örn. vulnerable indirect branch'lerin / pointer load'larının etrafında speculation barrier'ları ile).

References