Skip to content

Function-Oriented Programming (FOP)

CFI'dan kaçınmak için return-address manipülasyonundan kaçınarak, bir dispatcher aracılığıyla bütün fonksiyonları gadget olarak zincirleyen code-reuse attack.

Mechanism

Function-Oriented Programming, reuse gadget'ları olarak — ret ile biten kısa instruction-suffix gadget'lar yerine — bütün fonksiyonları zincirler. ROP'un aksine FOP return address'leri değiştirmez; her "gadget" mevcut bir fonksiyona onun meşru entry point'inden girer ve özel bir dispatcher function gadget function-gadget'ları bir chain'e yapıştırıp aralarında dispatch eder.

Note

Her transfer bir fonksiyonun yasal entry adresini hedeflediğinden, FOP backward-edge savunmalarının aradığı anormal return-to-non-call-site davranışından kaçınır. Tanıtan makale (Guo, Chen, Shi — IEEE CNS 2018) bunun coarse-grained CFI'ı bypass ettiğini gösterir ve algoritmalar artı FOP gadget'larını bulan bir araç sunar. FOP hiçbir return address forge etmediğinden, backward-edge / shadow-stack scope'una takılmaz (yani bir shadow stack'in koruduğu return-adres bütünlüğünü ihlal etmez); bu, FOP'un fine-grained backward-edge savunmaları için neden zor bir hedef olduğunun mekanik nedenidir. (Makalenin shadow-stack'i bu kesin terimlerle "bypass" olarak iddia ettiği bu denetimde birincil kaynaktan doğrulanamadı; ifade mekanizmadan türetilmiştir.)

Walkthrough

Kurulum öncelikle bir dispatcher function gadget bulmayı gerektirir: tekrar tekrar yeniden girilebilen ve diğer function-gadget'ları bir chain'e yapıştırmak için kullanılan bir fonksiyon (jump-oriented-programming'deki loader/dispatcher gadget kavramına benzer, ama bütün-fonksiyon granülaritesinde). Zincirlenen her gadget mevcut bir C fonksiyonunun entry'sidir, dolayısıyla call'dan önce gelmeyen site'lara return'leri işaretleyen indirect-branch ve shadow-stack check'leri tetiklenmez.

Warning

"FOP" aşırı yüklü bir terimdir. Yetkili exploitation anlamı Guo–Chen–Shi 2018 code-reuse attack'idir. Uygulayıcılar gevşek bir şekilde "function-oriented"ı, bütün library fonksiyonlarını ROP tarzı gadget olarak zincirleme anlamında da kullanır (ret2libc/ROP chaining ile örtüşür); ve alakasız software-engineering yazıları "FOP"u bir programlama paradigması için kullanır. Yalnızca ilki bu tekniktir.

Mitigation

FOP özellikle CFI'ın sınırlarını hedeflediğinden, ilgili savunmalar daha güçlü forward-edge CFI (kesin call-target kısıtlaması), call-graph/path-sensitive politikalar ve bir backward-edge shadow stack'i sıkı forward-edge enforcement ile birleştirmektir. Generic mitigation'lar (ASLR, fine-grained code randomization, CET tarzı indirect-branch tracking) da kullanılabilir function-gadget ve dispatcher yüzeyini daraltır.

References