Counterfeit Object-Oriented Programming (COOP)¶
Turing-complete code reuse by invoking whole C++ virtual functions through forged objects.
Mechanism¶
COOP, arbitrary computation'ı code pointer inject etmeden ve fonksiyonların
ortasına return etmeden elde eder — yalnızca mevcut, bütün C++ virtual
fonksiyonlarını ("vfgadget") legitimate olan mevcut virtual call site'lar üzerinden
çağırır. Attacker belleği, vptr field'ları mevcut vtable'lara işaret eden
counterfeit object'lerle doldurur; böylece her virtual dispatch seçilmiş bir
vfgadget'a resolve olur. Counterfeit object'ler field'ları örtüşecek şekilde
yerleştirilir: bir gadget'ın output field'ı bir sonrakinin input field'ı olur ve
veriyi chain boyunca taşır.
Note
COOP, coarse-grained CFI ve vtable-protection şemalarını yenmek için tasarlandı: her call target legitimate bir virtual function girişidir ve her call site gerçek bir virtual call'dur, dolayısıyla backward-edge ve basit forward-edge kontrolleri geçer.
Walkthrough¶
Sıralama primitive'i Main-Loop Gadget (ML-G)'dir: object pointer'lardan oluşan bir container üzerinde iterate eden ve her biri üzerinde bir virtual function çağıran mevcut bir virtual function. Attacker, counterfeit object'lere işaret eden counterfeit bir pointer container'ı sağlar; böylece ML-G tüm chain'i sürür — ROP'taki "return"ün COOP karşılığı.
// An ML-G is an existing virtual function shaped like this loop:
for (auto *obj : this->container) // attacker-controlled array of counterfeit-object ptrs
obj->virtualFunc(); // each call resolves through a faked vptr -> vfgadget
// Counterfeit object the attacker forges in memory:
// [ vptr -> existing vtable (or offset into one) ]
// [ field A ] <-- overlaps next object's field to pass data
// [ field B ]
Paper, vfgadget'leri rolüne göre sınıflandırır: ML-G (dispatcher), REC-G
(recursion), ARITH-G (arithmetic), W-G/R-G (field üzerinden write/read),
INV-G (system gibi bir API'yi invoke etme). Bir ML-G altında ARITH-G + W-G +
INV-G chain'lemek Turing-complete bir hesaplama ve nihayetinde hassas bir API'ye
yapılan bir call üretir.
Mitigation¶
Her virtual call site'ta beklenen static type'ı kontrol eden fine-grained /
type-aware forward-edge CFI (örn. clang CFI -fsanitize=cfi-vcall) ve object'in o
vtable'a gerçekten sahip olduğunu doğrulayan vtable-pointer integrity. Coarse CFI,
shadow stack'ler ve naif vtable-in-rodata kontrolleri COOP'u durdurmaz.