Heap buffer overflow¶
Heap'te allocate edilmiş bir buffer'ın ötesine yazarak komşu heap data'sını, allocator metadata'sını veya komşu object'leri corrupt etme.
Mechanism¶
MITRE'ye göre: "Bir heap overflow koşulu, overwrite edilebilen buffer'ın memory'nin heap
kısmında allocate edildiği bir buffer overflow'dur; genellikle buffer'ın malloc() gibi
bir rutin kullanılarak allocate edildiği anlamına gelir." Chunk'ın sınırlarının ötesine
yazmak, komşu heap data'sını corrupt eden bir out-of-bounds write'tır.
Note
CWE-122 hem CWE-787'nin (Out-of-bounds Write) hem de CWE-788'in ChildOf'udur.
Corruption komşu bir object'in function pointer'larını, C++ virtual method
table'larını veya GOT entry'lerini, ya da allocator'ın kendi inline metadata'sını
(chunk size, prev_size, fd/bk) overwrite edebilir; bu da tüm
house-of-force/unlink ailesinin giriş noktasıdır.
Walkthrough¶
MITRE'nin 1. Örneği (C):
#define BUFSIZE 256
int main(int argc, char **argv) {
char *buf;
buf = (char *)malloc(sizeof(char)*BUFSIZE);
strcpy(buf, argv[1]); // no check that argv[1] fits in 256 bytes
}
İkinci bir MITRE örneği bir encoding-expansion bug'ıdır: 4*sizeof(char)*MAX_SIZE
allocate edilirken bir ampersand-encoding'in input'u 4 değil 5 karakter genişletmesi,
çok sayıda & içeren input'ta overflow verir. ASan altında böyle bir copy, bir redzone
READ veya WRITE teşhisiyle bir heap-buffer-overflow raporlar. Overflow'u kontrole
çevirmek için saldırgan önce heap layout'unu düzenler (bkz. heap-grooming-feng-shui),
böylece overflow seçilen bir hedefe düşer.
Detection¶
AddressSanitizer (heap chunk'larının etrafında poisoned redzone'lar →
"heap-buffer-overflow"); hardened allocator'lar ve guard page'ler; static analysis.
glibc'nin kendi integrity check'leri (malloc(): corrupted top size, corrupted size vs.
prev_size) metadata corruption'da abort eder.
Mitigation¶
Memory-safe / bounds-checked diller; compiler korumaları (/GS, _FORTIFY_SOURCE); ASLR
ve PIE; strcpy/sprintf yerine length-bounded API'ler (snprintf, strlcpy); input
sınırlarını validate et.