Skip to content

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_FIRST aracılığıyla ap_run_dirwalk_stat() wrapper'ını üretir; bu wrapper global _hooks struct'ı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 bir exec/system RCE primitive'i).
  • piped_log struct'ının ilk field'ı bir apr_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_t leak'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.

References