musl mallocng Fake Group Construction¶
Attacker-resolved bir base'e forge edilmiş bir
struct groupyerleştir, böyleceget_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:
- İstenen in-band offset'i yaz, böylece
get_meta()attacker-controlled bellek içinde bir base hesaplasın. - Oraya
metaalanı sahte birstruct meta'yı işaret eden sahte birstruct groupyerleştir (bkz.musl-mallocng-fake-meta-construction). - Sahte meta'nın
mem'inin sahte group'a geri işaret etmesini sağla, böyleceassert(meta->mem == base)geçsin. - Kalan
get_meta()kontrollerini sağla (index<= last_idx, slotavail_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 olmadanarea->checkassert'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.