musl mallocng Fake Meta Construction¶
Controlled bir free/alloc path'ini sürmek için bir
struct metaforge 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:
ctx.secret'ı leak et.- Writable bir page seç; 4 KB-aligned başlangıcına
check = secretile sahte birstruct meta_areayerleştir. - 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/sizeclassile sahte birstruct metahazırla. - İ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_areaallocation'larının içine düştüğünü doğrula; assertion'lar etkinken fuzz et. - Attacker-writable page'lere karşı
meta_area->checkokumaları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.