Skip to content

Control-Flow Bending (CFB)

Her bir transfer'in geçerli bir CFG edge'i olduğu ama genel trace'in hiçbir feasible benign çalışmaya karşılık gelmediği saldırılar; shadow stack olmadan fully-precise static CFI'nin bile kırık olduğunu kanıtlar.

Mechanism

Note

Carlini et al. (USENIX Security 2015), fully-precise static CFI'yi ulaşılabilecek en iyi stateless policy olarak tanımlar: bir branch ancak bir benign execution aynı transfer'i yapıyorsa izinlidir. Control-flow bending, non-control-data saldırılarını genelleştirir — her transfer geçerli CFG'nin içinde kalır, ama trace benign olarak infeasible'dır. Shadow stack olmadan saldırgan bir dispatcher function kullanır: saldırgan tarafından kontrol edilen argümanlar verildiğinde kendi return address'ini ezebilen herhangi bir fonksiyon (bir write-what-where). shadow-stack'siz CFI, static return set'indeki herhangi bir caller'a geri dönmeye izin verdiğinden, bir dispatcher neredeyse her yere geri dönebilir; bu da saldırganın CFG'de keyfince dolaşmasına olanak tanır. libc dispatcher'ları arasında memcpy() ve (%n aracılığıyla) printf() bulunur.

İşte bu yüzden return-address integrity'siz CFI kırıktır — bir shadow stack gereklidir (6 case-study binary'sinin 3'ünde arbitrary-code-execution yeteneğini ortadan kaldırdı).

Walkthrough

printf-oriented programming — bir shadow stack olsa bile, saldırgan tarafından kontrol edilen tek bir printf() Turing-complete'tir. Makalenin conditional-write primitive'i:

format: "%s%hhnQ%*d%n"
args  : (C, S, X-2, 0, T)

%s/%hhn kısmı bir control byte ile gate'lenir; son %n, çalışan output-byte sayısı X'i hedef address T'ye yazar. Appendix B, tam Turing-completeness için bu tür çağrıları logic gate'lere dönüştürür; test edilen biri hariç tüm binary'lere karşı çalıştı (istisna, kendi printf'ini yeniden yazmıştı).

Klasik ROP'tan farkı: CFB, ret ile biten mid-function gadget'ları yerine geçerli call/return edge'leri aracılığıyla bütün legitimate fonksiyonları zincirler; bu yüzden yapısal olarak CFG'ye uyar. Bkz. printf-oriented programming.

Mitigation

Korunan bir shadow stack devreye al — gerekli ama yeterli değil (printf-oriented programming onu atlatır). variadic/format yeteneğine sahip fonksiyonları kısıtla. Yazarlar, fully-precise static CFI'nin "ne tamamen kırık ne de tamamen güvenli" olduğu sonucuna varır. Mükemmel bir CFG yerine gerçek analiz'in imprecision'ına saldıran Control Jujutsu ile karşılaştır; ayrıca hardware desteği Intel CET shadow stack'e de bak.

References