Skip to content

Out Of Control (CS/EP gadget CFI bypass)

Goktas et al. (IEEE S&P 2014), coarse-grained CFI'nın CFI'yı ve kBouncer/ROPecker'ın behavioral heuristic'lerini bypass eden Turing-complete bir saldırı kurmaya yetecek kadar policy-uyumlu gadget — Call-Site (CS) ve Entry-Point (EP) gadget'ları — bıraktığını gösterir.

Mechanism

Note

Coarse-grained CFI, ideal CFG'yi iki ucuz kurala gevşetir: bir return, herhangi bir call-preceded site'ı (bir call'un hemen ardını) target edebilir ve bir indirect call/jump, herhangi bir function entry point'i target edebilir. "Out of Control" paper'ı, bu sınıfların hâlâ büyük olduğunu gözlemler — CFI olası target'ların %98'inden fazlasını bloklar, ama hayatta kalan %2 yeterlidir. Bu kurallara uyan iki gadget tipi tanımlar:

  • Call-Site (CS) gadget'ları — bir call instruction'ının hemen ardında konumlanan ve bir ret ile biten bir instruction block'u. Call-preceded bir adreste başlayıp bir return ile bittiği için, return-call-preceded-site'ı-target-eder kuralını sağlar ve klasik bir ROP gadget'ı gibi zincirlenir.
  • Entry-Point (EP) gadget'ları — bir function'ın entry point'inde başlayan ve bir indirect call/jmp ile biten bir block. Indirect-branch-function-entry'yi-target-eder kuralını sağlar ve CS gadget'lar arasında dispatch / chain için kullanılır.

CS ve EP gadget'larını birleştirerek yazarlar, tamamen CFI-legal target'lardan bir Turing-complete gadget set'i bir araya getirir ve policy'yi hiç ihlal etmeden yenerler.

Walkthrough

Saldırı ayrıca, kBouncer ve ROPecker gibi savunmaların CFI üzerine katmanladığı behavioral heuristic'leri de atlatır:

Heuristic                         How CS/EP gadgets evade it
--------------------------------  ------------------------------------------
ret must follow a call            CS gadgets are call-preceded by construction
"gadget chains are short"         use longer, function-like CS/EP gadgets
"N short gadgets in a row"        break the run with long EP-dispatched blocks
indirect branch -> function entry EP gadgets begin exactly at entry points

Warning

Çıkarım yapısaldır: yalnızca coarse equivalence class'ları zorunlu kılan herhangi bir CFI ("geçerli return target'ları" için bir sınıf, "geçerli indirect-call target'ları" için bir sınıf) bypass edilebilirdir, çünkü sınıflar çok büyüktür. Bu, fine-grained forward-edge CFI'nın ve return'leri herhangi bir call-preceded site yerine gerçek caller'a kısıtlayan shadow-stack backward-edge korumasının ampirik motivasyonudur.

Raporlanan değerlendirme

Paper, dönemin coarse-grained CFI şemalarına ve heuristic savunmalarına (örn. CCFIR, bin-CFI, kBouncer, ROPecker) karşı değerlendirme yapar ve yalnızca CS/EP gadget'larından kurulmuş çalışan bir exploit gösterir, %98'den fazla-bloklandı rakamının yine de pratik olarak istismar edilebilir bir kalıntı bıraktığını ortaya koyar.

Mitigation

  • Shadow stack'ler (örn. Intel CET shadow stack), bir return'ün herhangi bir call-preceded adresle değil, gerçek caller'la eşleşmesini gerektirerek CS gadget'larını kırar.
  • Fine-grained forward CFI (örn. Clang CFI, RAP), indirect-call target set'ini "her function entry"nin çok altına küçültür ve EP gadget'larını dışarı sıkıştırır.
  • Coarse donanımsal IBT tek başına yetersizdir; aynı fikrin Intel CET'e karşı nasıl uygulandığı için bkz. CET call-site reuse kernel writeup.

References