Skip to content

Data-Oriented Programming (DOP)

Turing-complete non-control-data saldırılar: yalnızca veriyi, bir loop içinde, tekrar tekrar corrupt et.

Mechanism

DOP, Turing-complete non-control-data saldırılar inşa etmek için sistematik bir yöntemdir. Asla bir return address ya da code pointer'ı corrupt etmez — yalnızca mevcut bir loop içindeki tek bir memory error'ı exploit ederek, tekrar tekrar veri corrupt eder. Data-oriented gadget'lar, minimal Turing-complete bir dilin (MINDOP) operasyonlarını simüle eden kısa, mevcut instruction dizileridir: arithmetic/logic, assignment, load, store ve conditional jump — hepsi attacker-aimed pointer'lar üzerinden.

Note

Hiçbir code pointer hijack edilmediği için DOP, CFI'yı, shadow stack'leri ve DEP/W^X'i tamamen yener — execute edilen her instruction, program'ın legitimate olarak çalıştırdığı bir instruction'dır. Bir gadget dispatcher (mevcut bir loop + selector) gadget'ları sıralar; her iteration'da memory error selector'ı bir sonraki gadget'a yönlendirir.

Walkthrough

MINDOP virtual operasyonları gerçek data-oriented gadget'lara şöyle eşlenir:

Semantik C biçimi Data-oriented gadget
arithmetic/logic a op b *p op *q
assignment a = b *p = *q
load a = *b *p = **q
store *a = b **p = *q
conditional jump if a goto L vpc = &input if *p

Temsili bir target: gadget'lar normal koddur; while ise dispatcher'dır.

struct server { int *cur_max, total, typ; } *srv;
int connect_limit = MAX_CONN; int *size, *type;
char buf[MAXLEN];
size = &buf[8]; type = &buf[12];
while (connect_limit--) {
    readData(socketfd, buf);     // overflow -> corrupts size/type/srv pointers
    if (*type == NONE) break;
    if (*type == STREAM)
        *size = *(srv->cur_max); // load gadget
    else {
        srv->typ   = *type;      // assignment gadget
        srv->total += *size;     // addition gadget
    }
}

Her loop iteration'ında buf'ı overflow ederek attacker size/type/srv'yi yeniden hedefler ve load/assign/add gadget'larını chain'ler. Yazarlar 9 program genelinde toplam 7518 gadget ve 5052 dispatcher buldu; iki program instance'ında Turing-complete gadget zincirlerini doğruladı (yani 7518 gadget'tan 2 tanesi değil, 2 program üzerinde end-to-end Turing-complete saldırı kuruldu). End-to-end saldırılar bir leak olmadan ASLR'yi bypass etti, bir network bot çalıştırdı ve memory permission'larını flip'ledi.

Mitigation

Memory-safety (bounds checking, MTE, safe diller) altta yatan memory error'ı ortadan kaldırır. Fine-grained data-flow integrity (DFI) ve data-space randomization bar'ı yükseltir; control-flow savunmaları (CFI, shadow stack'ler, DEP) burada geçerli değildir.

References