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:
%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.