musl dlmalloc Unbin Abuse¶
Bir free chunk'ın
prev/next'ini corrupt et, böylece 1.2.1 öncesi musl'un kontrolsüzunbin()'i attacker-controlled bir write yapsın.
Mechanism¶
Kırılan invariant
musl, 1.2.1 öncesinde dlmalloc-türevi bir allocator kullanıyordu: free chunk'lar,
bir binmap bitmap'i ile seçilen 64 doubly-linked dairesel bin'de yaşıyordu. Bir chunk'ı bir
bin'den çıkarmak unbin() ile yapılır; bu, fd/bk consistency kontrolü olmayan klasik
güvensiz bir doubly-linked-list unlink'tir (glibc'nin P->fd->bk == P'sinin aksine).
static void unbin(struct chunk *c, int i)
{
if (c->prev == c->next)
a_and_64(&mal.binmap, ~(1ULL<<i));
c->prev->next = c->next; // write c->next near c->prev
c->next->prev = c->prev; // write c->prev near c->next
c->csize |= C_INUSE;
NEXT_CHUNK(c)->psize |= C_INUSE;
}
Walkthrough¶
Üst düzey, musl kaynağı ve Safe-Linking analizinden:
- In-bin bir free chunk'ın
prev/next'ini corrupt et (bitişik bir free chunk'a heap overflow ya da sahte bir free chunk forge edip allocator'a onu bin/unbin ettir). unbin()çalıştığında,c->prev->next = c->nextvec->next->prev = c->prevbir write primitive olur:prev = target - offsetof(next)venext = valueile,valuetarget'ın yakınına yazılır (artıvalue'nun yakınına karşılıklı bir write).- Her iki pointer da writable olmalı (her biri dereference edilip yazılır), dolayısıyla
bu, writable bir pointer table'ına / function-pointer'a bitişik bir yapıya nişan alır. musl'da
__malloc_hook/__free_hookyok, bu yüzden write allocator hook'ları yerine uygulama pointer'larını hedefler.
Detection¶
- Chunk'lar arası heap-consistency canary'leri; bir unbin'lenen chunk'ın
c->prev->next == c && c->next->prev == c'yi sağladığını doğrulayan runtime kontrolleri. - CI'da AddressSanitizer / hardened-malloc shim'leri; bin churn'ü ile allocator path'lerini
fuzz etme;
free()'den kısa süre sonra pointer table'larına düşen write'ların izlenmesi.
Mitigation¶
- 1.2.1 öncesi musl'dan yükselt (bu allocator sınıfı mallocng'de yok).
- Takılı kalındığı yerde: safe-unlink consistency kontrolleri ve pointer obfuscation
(
fd/bk'nin heap başına bir secret ile Safe-Linking tarzı XOR'lanması). - Overflow detection ile derle; metadata'yı user data'dan izole et.