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.