PartitionAlloc ThreadCache freelist corruption¶
Chrome'un PartitionAlloc'undaki per-thread bir freelist slot'unun encoded next-pointer'ını bozmak, böylece sonraki bir allocation attacker-etkili bir adreste döndürülür.
Mechanism¶
PartitionAlloc, allocator bookkeeping'inin çoğunu guard page'lerle korunan out-of-line bir
metadata bölgesinde tutar, böylece lineer overflow'lar ona ulaşamaz. Tek istisna freelist
pointer'ıdır: bir slot span'deki free slot'lar, next pointer'ı her free slot'un başında,
user data ile inline yaşayan singly-linked bir list olarak zincirlenir. Per-thread
ThreadCache, merkezi partition lock'unu almadan allocation'ları karşılamak için bu
slot'ları toplu işler. Bir bug, bir attacker'ın bir free slot'a yazmasına izin verirse, o
inline next pointer'ını düzenleyip zinciri yönlendirebilirler.
Note
Geçilen sınır allocator integrity'dir: bir slot'un içeriği canlıyken user-sahipli,
ama aynı byte'lar bir kez free edilince güvenilir freelist metadata'sı olur. Free edilmiş
bir slot'un ilk word'ünü değiştiren bir use-after-free ya da overflow bu yüzden bir
attacker'ın bir sonraki malloc-eşdeğerinin memory'yi nereye geri verdiğini dikte
etmesine izin verir. Çıtayı yükseltmek için, PartitionAlloc pointer'ı encode eder
(little-endian'da byte-reversed, böylece bir partial overwrite onu yönlendirmek yerine
yok eder) ve yanına bağımsız encode edilmiş bir shadow kopyası saklar; ikisi unlink'te
uyuşmalı yoksa process öldürülür. Corruption bu yüzden yalnızca attacker hem encoded değeri
hem de eşleşen shadow'unu hesaplayabildiğinde işe yarar — encoding-bertaraf path'i (Transform
fonksiyonu, shadow hesabı, IsWellFormed check'leri) için bkz.
partitionalloc-freelist-pointer-encoding-bypass.md;
ilgili UAF mitigation ve bug class için bkz. backuprefptr-bypass.md ve
use-after-free.md.
Walkthrough¶
Kamuya açık bir write-up'ın izlediği üst düzey adımlar:
- Seçilmiş bir size class'ının free edilmiş bir PartitionAlloc slot'una düşen bir UAF ya da OOB write bul (aynı bucket size'ındaki nesneler birlikte groom edilir — heap-grooming-feng-shui.md).
- Free edilmiş slot'un ilk word'ünü — encoded
nextpointer'ını — ve build zorluyorsa, consistency check geçsin diye komşu shadow'u üzerine yaz.
// conceptual: freed slot's inline next-pointer is now attacker data
free_slot->encoded_next = encode(target); // encoding/shadow must be satisfied
Inline pointer nerede yaşar
Her free slot kendi ardılını offset 0'da saklar; ThreadCache list head'i out-of-line metadata'da oturur. Yalnızca inline ardıl data corruption ile erişilebilir, ki bu da tam olarak partial-overwrite encoding'inin ve shadow'un neden var olduğudur.
Warning
Modern Chrome bunun üstüne BackupRefPtr (MiraclePtr) ve pointer encoding katmanlar,
dolayısıyla naif bir single-pointer overwrite tipik olarak yönlendirmek yerine fault eder.
Detection¶
- Encoded-pointer/shadow uyuşmazlığında PartitionAlloc içinde process crash'leri (allocator kasıtlı olarak abort eder).
- Byte-reversed-görünümlü adresleri dereference eden fault'ları gösteren renderer crash
telemetry'si, ya da fuzzing'de ASan
heap-use-after-free/heap-buffer-overflowraporları. - Control-flow anomalilerinin izlediği anormal aynı-boyutlu allocation patlamaları.
Mitigation¶
- Chromium'u güncel tut: freelist encoding, shadow pointer'lar, out-of-line guarded metadata ve BackupRefPtr in-tree savunmalardır.
- ASan ve PartitionAlloc'un kendi
CHECK/PA_CHECKconsistency check'leri etkin halde build/test et; araştırma build'leri için hardened fork'ları değerlendir. - Kök UAF/OOB'yi düzelt; freelist write'ı yalnızca alt katman bir sonuçtur.