Skip to content

musl mallocng Cycling Offset

Bir slot'un altında saklanan in-band offset alanını yeniden yaz, böylece get_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:

  1. 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-4 flag'ini) yeniden yazabilir.
  2. 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ı.
  3. 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 offset değ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.

References