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