Skip to content

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:

struct MessageBuffer {
    int msgType;
    union {
        char *name;
        int nameID;
    };
};

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.

References