Skip to content

musl dlmalloc Unbin Abuse

Bir free chunk'ın prev/next'ini corrupt et, böylece 1.2.1 öncesi musl'un kontrolsüz unbin()'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:

  1. 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).
  2. unbin() çalıştığında, c->prev->next = c->next ve c->next->prev = c->prev bir write primitive olur: prev = target - offsetof(next) ve next = value ile, value target'ın yakınına yazılır (artı value'nun yakınına karşılıklı bir write).
  3. 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_hook yok, 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.

References