Arabellek taşması ve bellek güvenliği: C programları neden savunmasız
Kısaca: Arabellek taşması, bir program bir bellek alanına alanın alabileceğinden fazla veri yazdığında olur; komşu veriler veya dönüş adresleri ezilebilir. Modern korumalar ve bellek güvenli diller bunu yavaşlatır.
Biraz daha ayrıntılı: C/C++ gibi dillerde dizi sınırlarını kimse kendiliğinden denetlemez. Kod sonun ötesine yazarsa komşu verileri ezer: birçok ciddi zafiyetin kökü budur (Morris solucanı 1988, fazla okuma olarak Heartbleed 2014). Makale ilke ve korumayı saldırı talimatı vermeden anlatır.
Ayrıntılı
İlke
Bir program yığında (stack) bir ad için örneğin 8 bayt ayırır (char name[8]). Daha fazla karakteri denetlemeden kopyalarsa (strcpy, gets), veri komşu belleğe taşar: diğer değişkenlere, kayıtlı dönüş adresine veya işlev işaretçilerine. Saldırgan böylece program akışını yönlendirebilir. İlgili: heap taşması, use-after-free (serbest bırakıldıktan sonra yeniden kullanılan bellek), double free, off-by-one, format-string hataları, tamsayı taşması (çok küçük arabellek doğurur), sınır dışı okuma (Heartbleed).
Koruma mekanizmaları
- Stack canary: dönüş adresinden önce koruyucu değer, dönmeden önce denetlenir.
- ASLR (rastgele bellek adresleri), PIE.
- NX/DEP (veri alanları çalıştırılamaz), W^X.
- RELRO, CFI/shadow stack (kontrol akışı bütünlüğü), Intel CET, ARM PAC/MTE.
- Derleyici uyarıları ve koruması (
-Wall -Wextra,-fstack-protector-strong,-D_FORTIFY_SOURCE=2). - Sanitizer’lar (AddressSanitizer, UBSan) ve Valgrind testte hataları bulur, fuzzing (AFL++, libFuzzer) onları tetikler. Hiçbir koruma kusursuz değildir; saldırganlar teknikleri birleştirir (ROP). En iyi strateji: hataları önlemek.
Daha güvenli programlama
- Güvenli işlevler:
getsyerinefgets,sprintf/strcpyyerinesnprintf/strlcpy, uzunlukları her zaman denetleyin. - C++:
new/deleteyerinestd::string,std::vector,std::span,.at(), akıllı işaretçiler (RAII). - Girdileri doğrulayın, boyutları denetleyin, tamsayı taşmalarına dikkat edin.
- Bellek güvenli diller: Rust (sahiplik, borrow checker), Go, Java, C#, Python, Swift: dizi sınırları denetlenir, bellek yönetilir (ama
unsafebloklar/yerel eklentiler risk olarak kalır). - Politika: kurumlar (BSI, CISA) yeni yazılımlar için bellek güvenli dilleri önerir; Linux çekirdeği, Windows, Android Rust’ı devreye alıyor.
- Kod incelemeleri, statik analiz (clang-tidy, Coverity, CodeQL).
Sınıflandırma ve öğrenme
- Büyük C/C++ kod tabanlarındaki (Microsoft, Chromium) ciddi zafiyetlerin kabaca %60–70’i bellek hatalarıydı.
- Güncellemeleri kurun: birçok saldırı eski programlardaki bilinen açıkları kullanır.
- Öğrenme (yasal): kendi küçük C programlarınızı ASan/Valgrind ile inceleyin, alıştırma platformlarındaki CTF görevleri (pwn), ders materyali (stack/heap, assembler).
- Vaka çalışması olarak Heartbleed: eksik uzunluk denetimi → sunucu belleği okunabilir.
- Sınav: yığın düzenini, nedenleri, karşı önlemleri sayın.
- İlgili: segmentation fault, bellek sızıntısı, stack ve heap, Valgrind.
Ayrıca bakınız: Segmentation fault, Stack ve heap, Valgrind ve sanitizer’lar, Rust: sahiplik ve ödünç alma