musl mallocng Cycling Offset¶
Bir slot'un altında saklanan in-band
offsetalanını yeniden yaz, böyleceget_meta()attacker-chosen bir group base'i çözsün.
Mechanism¶
Kırılan invariant
mallocng'de (musl >= 1.2.1) her slot in-band bir offset alanı taşır: p-2'de bir
uint16_t, user pointer'dan group base'e geri olan mesafeyi (16-byte UNIT'ler cinsinden)
verir, böylece get_meta() base = p - UNIT*offset - UNIT'i hesaplar.
Deterministik reuse'a direnmek ve slack'i tüketmek için enframe(), slot'un
başlangıç offset'ini ardışık allocation'lar boyunca context başına bir counter
(ctx.mmap_counter++, enframe()'e ctr olarak geçilir) kullanarak cycle eder;
UNIT adımlarında artar ve mevcut slack'i aştığında wrap eder. Offset, kontrol eden
group/meta'yı işaret etmesi için in-band ve trusted'dır — o güven sınırdır.
Walkthrough¶
Üst düzey, musl kaynağı ve mooosl / NCC-Fox-IT write-up'larından:
- Komşu bir chunk'ın user data'sının hemen altındaki byte'lara ulaşan bir lineer
overflow / off-by-one, bu offset'i (ve
p-3'teki index byte'ını, artıp-4flag'ini) yeniden yazabilir. - Yeniden yazılan offset,
get_meta()'yı saldırganın seçtiği bir fake group base'i hesaplamaya yönlendirir — fake-group / fake-meta construction'ın giriş noktası. get_meta()ardından ortaya çıkan yapıları doğrular (bkz.musl-mallocng-fake-group-construction), dolayısıyla çıplak bir offset yeniden yazımı, o assert'leri geçen forge edilmiş group/meta ile eşleştirilmelidir. Bu in-band byte'ları leak etmek slot layout'unu haritalamaya da yardımcı olur.
Detection¶
- In-band header bölgesinin üzerine binen guard byte'ları / canary'ler.
- musl birkaç
get_meta()kontrolünüassert()olarak içerir; bunları fuzz/test build'leri için derlemeye dahil et. - Beklenen mmap region'ı dışında bir group base'i çözen
offsetdeğerlerini tespit et.
Mitigation¶
- Hardened deployment'larda musl'u assertion'lar etkin olarak derle.
- Allocation'ları attacker-controllable lineer overflow'lardan uzak tut; guard-page mapping'leri kullan (mallocng bunu büyük group'lar için zaten yapar).
- In-band header'a yapılan herhangi bir adjacency overflow'unu kritik say — in-band tasarım kasıtlı bir alan ödünleşimidir.