Skip to content

Jump-Oriented Programming (JOP)

ret yerine 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). ret yerine 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:

  • ret target'larını doğrulayan return-address integrity check'leri / shadow stack'ler
  • ret-frequency heuristic'leri (örn. her biri ret ile 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 bir endbr landing 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.

References