Skip to content

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.

References