Skip to content

musl mallocng Meta Unlink Attack

Bir write primitive elde etmek için attacker-controlled prev/next'e sahip forge edilmiş bir struct meta üzerinde dequeue()'yu sür — mallocng'nin safe-unlink kontrolü yoktur.

Mechanism

Kırılan invariant

Bir struct meta tamamen free olduğunda, dequeue() tarafından doubly-linked aktif list'inden çıkarılır:

static inline void dequeue(struct meta **phead, struct meta *m)
{
    if (m->next != m) {
        m->prev->next = m->next;   // write
        m->next->prev = m->prev;   // write
        if (*phead == m) *phead = m->next;
    } else *phead = 0;
    m->prev = m->next = 0;
}

m->next->prev == m && m->prev->next == m olduğuna dair hiçbir kontrol yoktur. Attacker-controlled prev/next ile (cycling-offset -> fake-group -> fake-meta zinciri üzerinden forge edilmiş), m->prev->next = m->next next'i *(prev + offsetof(next))'e yazar ve m->next->prev = m->prev prev'i *(next + offsetof(prev))'e yazar — her iki operand'ın da writable olması gereken (yarı-)arbitrary bir write.

Walkthrough

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

  1. get_meta()'nın kabul etmesi için sahte bir offset -> fake group -> fake meta zinciri kur (bkz. musl-mallocng-cycling-offset, -fake-group-construction, -fake-meta-construction).
  2. Sahte meta'yı tamamen free görünecek şekilde ayarla, böylece free path dequeue() çağırsın.
  3. prev/next'i target ve value'yu encode edecek şekilde set et.
  4. Free'yi tetikle; unlink, write'ı escalate etmek için seçilmiş bir writable pointer'a (örn. saklı bir pointer / table) düşürür.

Detection

  • m->next->prev == m && m->prev->next == m consistency kontrollerini ekle (bariz safe-unlink hardening'i); fuzzing için assert'leri derlemeye dahil et.
  • Tamamen free edilmiş bir group'un free()'si ile ilişkili pointer table'larına yapılan write'ları tespit et; hardened-malloc karşılaştırma harness'leri.

Mitigation

  • dequeue() üzerinde safe-unlink consistency kontrolleri; list link'lerinin pointer-encoding'i (Safe-Linking tarzı).
  • ctx.secret'ı koru — tüm zincir area->check'i geçmeye bağlıdır; cookie hijyeni en yüksek kaldıraçlı kontroldür.
  • Meta'nın guard-page izolasyonu.

References