Skip to content

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:

  1. 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).
  2. Free edilmiş slot'un ilk word'ünü — encoded next pointer'ı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
3. Poison edilmiş zinciri yürümek için yeterince aynı-boyutlu allocation sür; bir allocation hassas bir nesne ile overlap ederek döndürülür, type confusion / arbitrary R/W verir.

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-overflow raporları.
  • 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_CHECK consistency 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.

References