Heap overflow to arbitrary read/write¶
Linear bir heap overflow'u, komşu bir object'in length field'ini (OOB read) ya da pointer field'ini (write-what-where) veya komşu allocator metadata'sını bozarak kontrollü bir read/write'a yükselt.
Mechanism¶
Note
Bir heap buffer overflow, bir allocation'ın sınırını aşıp fiziksel olarak komşu
olan chunk'a yazar. Yükseltme, yan tarafta ne olduğundan gelir. Komşu bir
application object'inin length/size field'ını ezmek, sınırlı bir buffer'ı bir
out-of-bounds read veya write'a çevirir; komşu bir object'in pointer'ını ezmek
ise o pointer üzerinden yapılan sonraki işlemleri arbitrary read/write yapar
(write-what-where). Alternatif olarak allocator metadata'sını
(size/prev_size, PREV_INUSE) bozmak, free/malloc'u (unlink veya
freelist tarzında) kontrollü bir write'a dönüştürür. Aşılan sınır spatial memory
safety'dir: contiguous bir write, seçilen bir victim'e karşı kontrollü bir primitive olur.
Walkthrough¶
Kavramsal reçete (public heap referanslarından):
- Heap'i groom et ki kontrol edilebilir bir buffer, bir victim allocation'ın hemen önünde otursun — length taşıyan bir object, pointer taşıyan bir object veya bir chunk header (heap-grooming-feng-shui.md).
- Overflow'u tetikle ve victim'in length'ini büyük bir değerle (ya da data pointer'ını bir target adresiyle) ez.
- OOB read için: şişirilmiş length'i kullanarak komşu belleği oku ve heap/libc pointer'larını leak'le (ASLR'yi yenerek).
- Arbitrary write için: victim'e bozulmuş pointer'ı üzerinden işlem yap ya da metadata'sı bozulmuş bir chunk'ın üzerine yeniden allocate ederek overlapping bir allocation elde et.
- Write'ı yüksek değerli bir target'a (GOT, function pointer,
__free_hook, bir FILE vtable) yönelt ki control-flow hijack olsun.
Warning
Komşuluk garanti değildir — allocator bin davranışına ve grooming'e bağlıdır; metadata-corruption yolları version'a özgüdür.
Detection¶
- AddressSanitizer / heap red-zone'lar komşu chunk'a yapılan write'ları işaretler; ASAN altında fuzz et.
- Allocator integrity check'leri (glibc
malloc"corrupted size vs. prev_size" abort'ları). - Guard/quarantine page'leri ve object'ler arası canary'ler.
Mitigation¶
- Metadata checksum'ları, inline canary'ler, safe unlinking ve out-of-line/encrypted metadata içeren hardened allocator'lar.
- length/pointer field'larının bounds validation'ı;
memcpy/strcpyiçin_FORTIFY_SOURCE. - ASLR + non-executable heap; untrusted data'yı hassas object'lerden izole et.