Skip to content

Arbitrary write primitive (write-what-where)

Hem yazılan değeri hem de hedef adresi kontrol et — evrensel corruption primitive'i (CWE-123).

Mechanism

Note

CWE-123 Write-what-where Condition: "Attacker'ın, çoğu zaman bir buffer overflow sonucu olarak, keyfi bir değeri keyfi bir konuma yazma kabiliyetine sahip olduğu herhangi bir durum." Herhangi bir N-byte store tamamen attacker-controlled olduğunda, programın sonradan control flow için dereference ettiği bir pointer'ı overwrite edebilirsin. Bu, store noktasında code-pointer integrity'sinin zorunlu kılınmaması sayesinde işler — MITRE belirtir ki attacker "bir function pointer'ı kendi malicious code'una yönlendirebilir."

Invariant şu: tek bir kontrollü store, en küçük ortak payda olan primitive'dir. Aşağı akıştaki her şey (RIP kontrolü, privilege escalation) bir target seçimidir. MITRE'nin sonuçları Integrity/Confidentiality/Availability'yi kapsar: Modify Memory; Execute Unauthorized Code; Gain Privileges; DoS; Bypass Protection Mechanism.

Tipik target'lar: GOT entry'leri (Full RELRO olmadan), __free_hook/__malloc_hook (glibc ≤ 2.33), kaydedilmiş return address, vtable'lar ve application function pointer'ları.

Walkthrough

Bir format-string %n klasik bir write-what-where'dir (%n o ana kadar yazdırılan byte sayısını pointer argümanına yazar):

printf(user_input);     // attacker controls the format string
from pwn import *
# write value V to address A, split into byte-sized %hhn writes
target = elf.got['exit']
writes = {target: (libc.sym['system'] & 0xff),
          target+1: ((libc.sym['system'] >> 8) & 0xff), ...}
payload = fmtstr_payload(offset, {target: libc.sym['system']})
p.sendline(payload)

Beklenen davranış: A adresindeki pointer (örn. exit@GOT) system ile overwrite edilir; onun üzerinden yapılan bir sonraki call kontrolü attacker'ın target'ına aktarır — arbitrary code execution. Kaydedilmiş bir return address'i clobber eden bir stack overflow, eşdeğer stack-tabanlı write-what-where'dir.

Heap-metadata write-what-where

Allocator atakları (tcache poisoning, unsafe unlink) attacker'ın seçtiği bir adreste bir chunk döndürür; o chunk'a yazmak bizzat write-what-where'dir, hook'lara, GOT'a ya da __exit_funcs'a ulaşır.

Detection

  • ASan/Valgrind out-of-bounds ve birçok geçersiz write'ı işaretler.
  • Control-flow integrity / shadow stack'ler, write'ın kendisinden ziyade corrupt olmuş bir code pointer'ın kullanımını tespit eder.

Mitigation

  • Full RELRO GOT'u bir target olmaktan çıkarır; glibc ≥ 2.34 malloc hook'larını kaldırdı; pointer mangling exit handler'ları ve TLS dtor'ları korur.
  • Stack canary'leri + NX + CFI, write'ı execution'a çevirmenin maliyetini yükseltir.
  • Target'lar sertleşir, ama gerçek bir write-what-where güçlü kalır — savunmalar altta yatan bug'ı elemeye odaklanır.

References