Skip to content

musl mallocng Fake Meta Construction

Controlled bir free/alloc path'ini sürmek için bir struct meta forge et (meta_area.check'i leak edilmiş ctx.secret'a eşit olan bir page'de).

Mechanism

Bu not out-of-band struct meta ve onu kapsayan struct meta_area'yı forge etmeye odaklanır (kırılan invariant area->check == ctx.secret); kardeş musl mallocng Fake Group Construction ise in-band struct group'u (assert(meta->mem == base) kapısı) forge eder. İkisi aynı zincirin farklı katmanlarıdır, aynı teknik değildir.

Kırılan invariant

mallocng'nin out-of-band struct meta'sı ve onu kapsayan struct meta_area:

struct meta {
    struct meta *prev, *next;
    struct group *mem;
    volatile int avail_mask, freed_mask;
    uintptr_t last_idx:5;
    uintptr_t freeable:1;
    uintptr_t sizeclass:6;
    uintptr_t maplen:8*sizeof(uintptr_t)-12;
};
struct meta_area { uint64_t check; struct meta_area *next; int nslots; struct meta slots[]; };

get_meta(), meta pointer'ını page-align ederek meta_area'yı türetir (area = (void*)((uintptr_t)meta & -4096)) ve area->check == ctx.secret assert'i yapar. Bu yüzden forge edilmiş bir meta, ilk 8 byte'ı leak edilmiş secret'a eşit olan bir page'de yaşamalıdır — o secret, tüm zincirin geçmesi gereken tek kapıdır.

Walkthrough

Üst düzey, musl kaynağı ve mooosl write-up'ından:

  1. ctx.secret'ı leak et.
  2. Writable bir page seç; 4 KB-aligned başlangıcına check = secret ile sahte bir struct meta_area yerleştir.
  3. O page'in içinde, mem -> fake group (bkz. musl-mallocng-fake-group-construction), amaçlanan unlink hedefi için set edilmiş prev/next (bkz. musl-mallocng-meta-unlink-attack) ve ilgili assert'lerin geçmesi ve allocator'ın bir slot'un free edilebilir olduğuna inanması için seçilmiş avail_mask/freed_mask/last_idx/sizeclass ile sahte bir struct meta hazırla.
  4. İstenen sink'e ulaşmak için forge edilmiş group->meta üzerinden bir free() (ya da alloc) sür — ya bir arbitrary-malloc primitive ya da meta-unlink write.

Detection

  • Meta pointer'larının gerçek meta_area allocation'larının içine düştüğünü doğrula; assertion'lar etkinken fuzz et.
  • Attacker-writable page'lere karşı meta_area->check okumalarını izle.

Mitigation

  • ctx.secret'ı güçlü biçimde koru / rotate et.
  • meta_area'ları özel, guard-page-izole mapping'lerde tut (mallocng meta'yı tam da user data'dan ayırmak için out-of-band allocate eder).
  • Hardened build'lerde assertion'ları etkinleştir.

References