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 birT*, 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):
- Çıkarılmış ham pointer.
.get()ya da implicit conversion ile elde edilen birT*artık track edilmez; free'den sonra onu dereference etmek normal bir UAF'tır. - Non-PartitionAlloc memory. Stack,
mmap, V8/Oilpan heap'leri ve TLS, BRP'nin dışındadır; oradaki UAF'lar korumasızdır. - 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
AllowPtrArithmeticgibi trait'ler vardır. - 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. - Korumasız konfigürasyonlar. BRP'nin varsayılan olarak etkin olmadığı platform/build'ler
ya da açıkça
DisableDanglingPtrDetection/kMayDangle/DanglingUntriagedolarak 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'ı (
DanglingUntriagedtriyajı), ASan ve0xEF-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).