Skip to content

BackupRefPtr (MiraclePtr) bypass

Chromium'un raw_ptr<T>/BackupRefPtr UAF mitigation'ını, BRP'nin korumadığı bir pointer üzerinden free'lenmiş object'e ulaşarak yen — ham bir T*, non-PartitionAlloc memory, bir OOB/arithmetic kaçış ya da quarantine exhaustion.

Mechanism

Note

raw_ptr<T> (MiraclePtr / BackupRefPtr, "BRP") her PartitionAlloc slot'unun metadata'sına bir reference count ekler. raw_ptr<T>'nin constructor/destructor/assignment'ı bu count'u korur ve free'de slot quarantine'e alınır (örn. bir 0xEF pattern'i ile poison'lanır) ve hâlâ dangling bir raw_ptr<T> ona referans verdiği sürece reuse'dan uzak tutulur. Bu, UAF penceresini raw_ptr<T> içinde tutulan pointer'lar için nötralize eder. Bypass yüzeyi, BRP'nin kapsamadığı her şeydir: koruma raw_ptr<T> wrapper'ına ve PartitionAlloc'un yönettiği memory'ye bağlıdır; bu yüzden free'lenmiş object'e canlı bir raw_ptr<T> üzerinden geçmeden dokunan herhangi bir yol etkilenmez.

Walkthrough

Bypass açıları (Chromium raw_ptr.md design doc'undan):

  1. Çıkarılmış ham pointer. .get() ya da implicit conversion ile elde edilen bir T* artık track edilmez; free'den sonra onu dereference etmek normal bir UAF'tır.
  2. Non-PartitionAlloc memory. Stack, mmap, V8/Oilpan heap'leri ve TLS, BRP'nin dışındadır; oradaki UAF'lar korumasızdır.
  3. OOB / pointer arithmetic. Slot'unun dışına ilerletilmiş dangling bir pointer'ı dereference etmek undefined'dır ve kapsam dışıdır; tam da böyle pointer'lar için AllowPtrArithmetic gibi trait'ler vardır.
  4. Quarantine exhaustion. Quarantine'in sonlu kapasitesi vardır; free'leri spray'lemek victim slot'u evict edebilir; böylece dangling bir raw_ptr<T>'ye rağmen reallocate edilip reuse edilir.
  5. Korumasız konfigürasyonlar. BRP'nin varsayılan olarak etkin olmadığı platform/build'ler ya da açıkça DisableDanglingPtrDetection / kMayDangle / DanglingUntriaged olarak işaretlenmiş pointer'lar.
// conceptual: raw_ptr keeps the slot quarantined...
raw_ptr<Obj> p = pool.Allocate();
Obj* raw = p.get();      // (1) raw escapes BRP tracking
pool.Free(p);            // slot quarantined w.r.t. p, but 'raw' is unguarded
raw->vtable_call();      // UAF still reachable through 'raw'

Warning

BRP, UAF exploitation'ın maliyetini ve güvenilirliğini artırır ama açıkça eksiksiz bir UAF savunması değildir — doc bu boşlukları sıralar. Raw-pointer UAF dışındaki bug sınıfları (type confusion, OOB write, JS/Oilpan lifetime bug'ları) tasarımı gereği kapsam dışıdır.

Detection

  • Chromium dangling-pointer detector'ı (DanglingUntriaged triyajı), ASan ve 0xEF-poison check'leri, instrumented build'lerde quarantine'e alınmış slot kullanımını işaretler.

Mitigation

  • Daha fazla pointer'ı raw_ptr<T>'ye taşımak, .get() kaçışlarını küçültmek, daha büyük quarantine ve tamamlayıcı savunmalar (*Scan, PartitionAlloc guard region'ları, type-safe allocator'lar).

References