Skip to content

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:

  1. 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.
  2. 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
3. Groom et, böylece spray edilen nesneler target bölgesini çevreler ya da onun yerine geçer (heap-grooming-feng-shui.md, heap-spray.md). 4. Bug'ı tetikle; tüketilen word artık (yüksek olasılıkla) 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.

References