Skip to content

musl mallocng Fake Group Construction

Attacker-resolved bir base'e forge edilmiş bir struct group yerleştir, böylece get_meta() onu izleyerek controlled bir meta'ya gitsin ve bir arbitrary-malloc primitive versin.

Mechanism

Bu not in-band struct group'u forge etmeye odaklanır (base = p - UNIT*offset - UNIT, kırılan invariant assert(meta->mem == base)); kardeş musl mallocng Fake Meta Construction ise out-of-band struct meta/meta_area'yı (area->check == ctx.secret kapısı) forge eder. İkisi aynı zincirin tamamlayıcı yarılarıdır, aynı teknik değildir.

Kırılan invariant

mallocng'nin struct group'u, in-band offset'ten hesaplanan base'de durur (p - UNIT*offset - UNIT):

struct group {
    struct meta *meta;
    unsigned char active_idx:5;
    char pad[UNIT - sizeof(struct meta *) - 1];
    unsigned char storage[];
};

İlk alanı out-of-band struct meta'ya bir pointer'dır; active_idx aktif slot'ları sınırlar. get_meta() base->meta'yı izleyip ardından meta->mem == base assert'i yaptığı için, offset'i (bkz. musl-mallocng-cycling-offset) artı hesaplanan base'deki byte'ları kontrol etmek, saldırgana tamamen forge edilmiş bir group sunma imkanı verir.

Walkthrough

Üst düzey, musl kaynağı ve mooosl write-up'ından. ctx.secret'ın bir leak'ini artı writable bir bellek bölgesi üzerinde kontrol gerektirir:

  1. İstenen in-band offset'i yaz, böylece get_meta() attacker-controlled bellek içinde bir base hesaplasın.
  2. Oraya meta alanı sahte bir struct meta'yı işaret eden sahte bir struct group yerleştir (bkz. musl-mallocng-fake-meta-construction).
  3. Sahte meta'nın mem'inin sahte group'a geri işaret etmesini sağla, böylece assert(meta->mem == base) geçsin.
  4. Kalan get_meta() kontrollerini sağla (index <= last_idx, slot avail_mask/freed_mask'te değil, area->check == ctx.secret). arbitrary-malloc / controlled-pointer primitive'ini veren şey, forge edilmiş group üzerinden free/allocate yapmaktır.

Detection

  • Group base'lerinin bilinen group mmap'leri içine düştüğünü doğrula; group'ların etrafında canary / guard page'ler.
  • Test/fuzz build'lerinde get_meta() assert'lerini enstrümante et; malloc()'un herhangi bir izlenen arena dışında pointer döndürmesinde alarm ver.

Mitigation

  • ctx.secret'ı koru — onun leak'i kilit noktadır; o olmadan area->check assert'i başarısız olur.
  • Assertion'ları etkinleştir; ASLR + guard page'ler saldırganın sahte bir group'u tahmin edilebilir bir noktaya yerleştirme yeteneğini azaltır.

References