musl mallocng Meta Unlink Attack¶
Bir write primitive elde etmek için attacker-controlled
prev/next'e sahip forge edilmiş birstruct metaüzerindedequeue()'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:
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).- Sahte meta'yı tamamen free görünecek şekilde ayarla, böylece free path
dequeue()çağırsın. prev/next'itargetvevalue'yu encode edecek şekilde set et.- 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 == mconsistency 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 zincirarea->check'i geçmeye bağlıdır; cookie hijyeni en yüksek kaldıraçlı kontroldür.- Meta'nın guard-page izolasyonu.