Pointer spraying¶
Heap'i crafted bir pointer'ın (ya da pointer-şekilli bir değerin) birçok kopyasıyla doldurmak, böylece bir out-of-bounds read, UAF ya da dangling reference'ın attacker-kontrollü veriye düşmesi ezici biçimde olası olur.
Mechanism¶
Pointer spraying, heap spraying'in pointer-odaklı varyantıdır. Shellcode byte'larını spray etmek yerine, attacker payload'u tek bir crafted pointer değerinin tekrarlanan bir dizisi olan nesneleri toplu allocate eder. Hedef istatistikseldir: ayrı bir memory-corruption bug'ı programı bilinmeyen ya da kısmen-kontrollü bir konumdan bir pointer okumaya zorladığında, spray edilen bölge dereference edilen word'ün attacker'ın seçtiği adres olma şansını maksimize eder.
Note
Pointer spraying bir layout/olasılık tekniğidir, kendi başına bir güvenlik açığı değil. Tek başına hiçbir sınırı geçmez — başka bir primitive'i deterministik hale getirir. Aralık dışı okunan bir backstore pointer'ı, UAF'tan sonra yeniden okunan free edilmiş bir nesne ya da pointer olarak tüketilen uninitialized bir chunk; çevreleyen memory tek bir tekrarlanan değerle doyurulduğunda hepsi güvenilir hale gelir, çünkü bug'ın aldığı herhangi bir adres attacker'ın istediği değerdir. Her spray edilen kopya aynı olduğundan, attacker'ın bug'ın tam olarak hangi kopyaya dokunduğunu bilmesine gerek yoktur.
Walkthrough¶
Kamuya açık exploit'lerde görülen üst düzey pattern:
- Pointer-şekilli bir değeri tüketecek corruption primitive'ini tanımla: bir backstore pointer'ının OOB read'i, use-after-free.md ya da uninitialized bir controlled-size-allocation.md'ın read'i.
- Attacker'ın doğru size class'ında defalarca sürebileceği bir allocation API'si seç (typed array'ler, string'ler, DOM/script nesneleri) ve her birini crafted pointer ile doldur:
payload = repeat(crafted_ptr, slot_size / sizeof(ptr))
for i in range(N): alloc(payload) // saturate the size class
crafted_ptr'dır ve bir fake
object / vtable / read-write primitive verir.
Tekrar neden tek bir overwrite'ı yener
Belirli bir pointer slot'unu hijack etmek tam offset'i kaçırma riski taşır. Aynı değeri tüm bir bölgeye spray etmek offset bağımlılığını ortadan kaldırır: bug nereyi okursa okusun, aynı forge edilmiş pointer'ı okur.
Warning
Allocator hardening bunu daraltır. glibc safe-linking ve PartitionAlloc pointer encoding, spray edilen ham bir pointer'ın kullanımdan önce transform edilebileceği anlamına gelir, dolayısıyla spray edilen değer encoding'i hesaba katmalı — bkz. safe-linking-bypass.md.
Detection¶
- İçeriği tekrarlanan bir pointer-width pattern olan, aniden patlayan aynı-boyutlu allocation'lar; anormal heap büyümesi.
- Spray'in büyüttüğü altta yatan OOB-read ya da UAF'ı ortaya çıkaran ASan/heap fuzzing.
- Faulting adreslerin tek bir tekrarlanan spray edilmiş değere eşit olduğu crash kümelenmesi.
Mitigation¶
- ASLR/high-entropy randomizasyon sabit bir adrese spray'lemeyi bertaraf eder; pointer encoding (safe-linking, PartitionAlloc) ham spray edilmiş pointer'ları kırar.
- Type'a göre heap isolation / partitioning ve guard page'ler cross-object düşmeyi azaltır.
- Kök OOB-read/UAF'ı düzelt; spray onu yalnızca güvenilir hale getirir.