Jump-Oriented Programming (JOP)¶
retyerine indirect jump'larla biten gadget'ları zincirleyen, execution'ı sürmek için bir dispatcher gadget ve bir dispatch table kullanan — stack'e ve return address'e tüm bağımlılığı ortadan kaldıran bir code-reuse technique'i.
Mechanism¶
Invariant: control flow call stack ile değil, bir dispatcher + dispatch table ile sıralanır
Bletsch, Jiang, Freeh & Liang (ASIACCS 2011) JOP'u,
return-oriented programming'de bulunan "stack'e ve ret
instruction'larına olan bağımlılığı ortadan kaldıran" bir code-reuse saldırısı olarak
tanıtır. ROP'ta stack pointer virtual program counter'dır: her gadget ret ile biter,
bu da sonraki gadget adresini stack'ten pop'lar. JOP bu bağımlılığı kırar. Functional
gadget'lar ret yerine bir indirect jump ile biter ve tek bir dispatcher gadget
program counter rolünü oynar: gadget adreslerinden oluşan bir dispatch table'a bir
pointer tutar, o pointer'ı ilerletir ve sonraki functional gadget'a jump eder. Her
functional gadget, bittiğinde, geri dispatcher'a jump eder, o da tekrar ilerler. "PC"
artık attacker-chosen bir register ve table'dır, dolayısıyla stack'i izleyen ya da ret'leri
sayan defense'ler (birçok anti-ROP check'inin orijinal motivasyonu) onu görmez.
Walkthrough¶
İki gadget rolü, paper'a göre:
- Functional gadget — asıl işi yapar (bir değer load et, add, store, syscall setup).
retyerine control'ü dispatcher'a geri transfer eden bir indirect branch ile bitmelidir. - Dispatcher gadget — dispatch table'a bir pointer ("virtual program counter") tutar, onu sabit bir stride ile ilerletir ve şimdi işaret ettiği functional gadget'a jump eder.
Bir dispatcher sonraki gadget adresini internal state'ten hesaplamalı ve ona branch etmelidir.
[edx]'teki bir table'ı gezen, her cycle bir slot ilerleyen schematic bir x86 dispatcher:
; dispatcher (schematic): edx = virtual PC into the dispatch table
add edx, 4 ; advance to next functional-gadget pointer
jmp dword ptr [edx] ; transfer control to the next functional gadget
Bir functional gadget ise ret ile değil, control'ü dispatcher'a döndüren bir indirect jump
ile biter; örneğin dispatcher cycle'ının ayarladığı bir register ya da pointer üzerinden:
; functional gadget (schematic): do work, then jump back to the dispatcher
... ; e.g. pop/add/mov performing the actual computation
jmp dword ptr [esi] ; return to dispatcher (esi -> dispatcher address)
Bu iki snippet schematic'tir, belirli bir libc build'inden alınmış gadget'lar değildir
Paper pratik JOP'u GNU libc'ye karşı gösterdi, ama gerçek dispatcher/functional gadget'lar
yazılmaz, bulunur — tam instruction'ları ve virtual PC olarak kullanılan register
tamamen target binary'ye bağlıdır. Gerçek image'da aday dispatcher ve indirect-jump
gadget'larını enumerate etmek için bir gadget finder (örn. JOP ROCKET gibi JOP-aware bir
tool ya da ropper --jop) kullan. Bu mnemonic'leri target'ında varmış gibi kopyalama.
Dispatch table, functional gadget'lara pointer'ların contiguous bir listesidir (artı gadget'ların
tükettiği herhangi bir inline data). Dispatcher her cycle sonraki entry'yi okuduğu ve functional
gadget'lar ona geri loop'ladığı için, program'ı stack değil table encode eder. JOP'un
non-executable bir stack ile ve hiç ret issue etmeden çalışmasını sağlayan budur.
JOP neden defensif açıdan önemli (DEP / anti-ROP bağlamı)
JOP önemlidir çünkü DEP/NX'i bypass ederken (ROP gibi var olan executable code'u reuse eder)
aynı zamanda özellikle ret etrafında kurulmuş defense'leri de atlatır:
rettarget'larını doğrulayan return-address integrity check'leri / shadow stack'lerret-frequency heuristic'leri (örn. her biriretile biten birçok kısa gadget'ı tespit etmek)- return'leri sınırlayan ama indirect jump/call'ları sınırlamayan bazı erken CFI implementasyonları
Indirect-branch target'larını geçerli function entry'lerine sınırlayan coarse-grained CFI
ve Intel CET'in indirect-branch tracking'i (ENDBRANCH) gibi donanım özellikleri, JOP'un
bağlı olduğu indirect-jump dispatch'i hedefleyen defense sınıflarıdır. JOP,
call-oriented programming (indirect call ile biten
gadget'lar) ile yakından ilişkilidir ve başlangıçtaki ROP tarzı bir foothold'dan geçiş
yaparken sıklıkla bir stack pivot ile kombine edilir.
Detection¶
- CFI / indirect-branch target validation: non-function-entry adreslerine giden indirect
jmp/call'ları flag'le; Intel CET ENDBRANCH birendbrlanding pad'i eksik instruction'lara giden branch'leri yakalar. - Mid-function code'a giden high-frequency indirect branch'ler için behavioral monitor'lar ("dispatcher loop" imzası).
Mitigation¶
- Indirect-branch target'larını legitimate destination'lara kısıtlayan fine-grained CFI.
- Hardware indirect-branch tracking (Intel CET IBT, ARM BTI).
- ASLR + DEP çıtayı yükseltir ama tek başına JOP'u durdurmaz — bu code-injection değil, code-reuse bir saldırıdır.