Control Jujutsu¶
Fully-precise analiz tabanlı fine-grained CFI bile hâlâ RCE'ye izin verir, çünkü gerçek programlar CFG'nin legitimate biçimde tehlikeli hedeflere bağladığı generic indirect call site'lar içerir — ACICS gadget'ı.
Mechanism¶
Note
Control Jujutsu (Evans et al., CCS 2015), scalable pointer analysis'in incompleteness'ını (LLVM'deki DSA algoritması) artı yaygın software-engineering pattern'lerini (kayıtlı function-pointer hook'lar aracılığıyla modular dispatch, macro ile üretilmiş wrapper'lar) suistimal eder. Argument Corruptible Indirect Call Site (ACICS) gadget'ını tanıtır: öyle bir indirect call site ki (1) forward-edge function pointer'ı ve argümanları heap'te ya da bir global'de yaşar (birçok data flow'dan erişilebilir), (2) argümanlar çağrıdan önce crash olmadan değiştirilebilir ve (3) site external input'tan erişilebilir. Over-approximate CFG, generic bir dispatch site'ından güçlü bir hedefe bir edge içerdiğinden, bozulabilir pointer+argümanları o hedefe yönlendirmek CFG'yi ihlal etmez — forward- ve backward-edge CFI'nin ikisi de geçer.
Precise bir CFI'nin dayatmaya çalıştığı invariant (her edge bir benign çalışmaya karşılık gelir), gerçek dispatch kodu generic call site'ları legitimate biçimde tehlikeli fonksiyonlara bağladığında hâlâ fazla permissive kalır.
Walkthrough¶
Apache HTTPD 2.4.12'ye karşı işlenmiş örnek (makaleden):
- Apache'nin hook sistemi,
AP_IMPLEMENT_HOOK_RUN_FIRSTaracılığıylaap_run_dirwalk_stat()wrapper'ını üretir; bu wrapper global_hooksstruct'ındaki kayıtlı function pointer'ları iterate eder ve her birini indirect olarak çağırır —dirwalk_stat'taki bir ICS (server/request.c). - Seçilen target, config'den verilen argümanlarla harici bir programı başlatan
piped_log_spawn(yani birexec/systemRCE primitive'i). piped_logstruct'ının ilk field'ı birapr_pool_t*'dir; bu layout birçok Apache struct'ı tarafından paylaşılır, dolayısıyla ona ulaşan bozulabilir site daha az geçerli pointer value'ya ve hiçapr_pool_tleak'ine ihtiyaç duymaz.- DSA ile üretilen CFG,
dirwalk_stat → piped_log_spawn'a legitimate biçimde izin verir, böylece hijack CFG-valid kalır ve CFI-korumalı bir sunucuda RCE verir. (İkinci bir PoC Nginx'i hedefler.)
Yazarlar, gadget'ları bulmak ve liveness'ı ölçmek için GDB reverse-execution ve backward reaching-definition dataflow kullanan bir ACICS Discovery Tool geliştirdi.
Mitigation¶
Daha kısıtlayıcı CFG'ler üretmek için unsound pointer analysis kullan (over-conservative edge'leri kaldırır), false positive'ler pahasına. Temelde makale, fine-grained Clang CFI tarzı enforcement'ın data integrity olmadan yetersiz olduğunu savunur. Mükemmel bir static CFG'ye bile saldıran Control-Flow Bending ile karşılaştır.