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
callinstruction'ının hemen ardında konumlanan ve birretile 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/jmpile 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.