Function pointer overwrite¶
Saklanan bir code pointer'ı (callback, vtable slot) overwrite ederek bir indirect call'un saldırganın seçtiği koda atlamasını sağlama.
Mechanism¶
Bir function pointer — tek başına ya da bir struct/object/vtable içindeki bir callback
alanı — programın sonradan indirect olarak invoke ettiği ((*fp)(...)) bir code
adresidir. Bir corruption primitive (overflow, UAF, type confusion) saldırganın o slot'u
yazmasına izin verirse, indirect call kontrolü saldırganın seçtiği bir adrese aktarır ve
control flow'u hijack eder.
Note
Nedensellik zinciri şu sırayı izler: önce bir write primitive — CWE-123 (Write-What-Where) ya da bir out-of-bounds write (CWE-787/CWE-788) — pointer slot'unu corrupt eder; sonra o bozuk pointer indirect call'da dereference edilir. CWE-822 (Untrusted Pointer Dereference) bu dereference aşamasını kapsar (root cause değil, consequence): "Eğer untrusted pointer bir function call'da kullanılırsa, uygulamanın akışı üzerinde kontrol elde etmek ve arbitrary kod çalıştırmak mümkündür." Yani CWE-822, function-pointer-overwrite'ın birincil sınıflandırması değildir; asıl primitive yazma yeteneğidir (CWE-123 / CWE-787). CWE-843 (Type Confusion) bir tipte allocate edilmiş bir kaynağa uyumsuz bir tip üzerinden erişmeyi kapsar; bu C/C++'ta yaygın olarak bozuk bir pointer üretir ve corruption yolunu sağlar.
Walkthrough¶
CWE-843'ün açıklayıcı örneği bir union kullanır, böylece bir integer write bir pointer'la alias olur:
buf.nameID'ye yazmak buf.name ile paylaşılan depolamayı overwrite eder; nameID'yi
kontrol eden bir saldırgan buf.name'i arbitrary memory'ye işaret ettirir. O slot
sonradan bir function pointer olarak ele alınıp çağrıldığında, control flow saldırganın
adresine düşer. Aynı yapı, ilk qword'ü bir vtable/ops pointer olan bir heap object ile de
görülür: bir heap overflow veya UAF reclaim pointer'ı takas eder ve bir sonraki virtual
call hijack edilir (bkz. vtable-hijacking, fake-vtable).
Warning
Saldırganın yalnızca write'ın pointer slot'una ulaşmasına ihtiyacı vardır.
Corruption bir heap-buffer-overflow, use-after-free ya da
arbitrary-write-primitive olsun, son adım — ezilen pointer üzerinden bir indirect
call — aynıdır.
Detection¶
AddressSanitizer pointer'ı corrupt eden out-of-bounds veya use-after-free write'ını işaretler. CERT C kuralı EXP39-C union/type-confusion pattern'ını yakalar; SAST data/control flow modellemesi CWE-822'ye karşı etkili olarak derecelendirilmiştir.
Mitigation¶
Control-Flow Integrity (CFI) indirect-call hedeflerini geçerli signature'larla kısıtlar; hardware indirect-branch tracking (CET/IBT) landing pad'ler gerektirir. Untrusted input'tan gelen pointer'ları validate et, pointer-aliasing union'lardan kaçın ve hedef maliyetini yükseltmek için ASLR/PIE'ye güven.