Öncelikle durumu daha iyi kavrayabilmek adına hafıza yönetimi konusunda biraz bilgiye sahip olmamız gerekmektedir. İlgili konu için tıklayınız.
Buffer overflov, bir bellek alanına sınırından fazla veri yazılması sonucu oluşan bir güvenlik zafiyetidir1. Bu zafiyet, saldırganların programın normal akışını bozarak kendi kodlarını çalıştırmasına olanak sağlar. Buffer overflov saldırılarının önlenmesi için, gelen verilerin uzunluğu ve içeriği kontrol edilmeli, zararlı karakterler temizlenmeli ve güvenli fonksiyonlar kullanılmalıdır.
Örnek olarak, aşağıdaki C++ kodunda bir buffer overflov zafiyeti bulunmaktadır:
#include
#include
using namespace std;
int main()
{
char buffer[10]; // 10 karakterlik bir buffer tanımlanıyor
cout << "Bir metin giriniz: ";
cin >> buffer; // Kullanıcıdan gelen metin buffer'a yazılıyor
cout << "Girdiğiniz metin: " << buffer << endl;
return 0;
}
Bu kodda, buffer’ın boyutu kontrol edilmediği için, kullanıcı 10 karakterden fazla bir metin girdiğinde, buffer taşacak ve diğer bellek alanlarını etkileyecektir. Bu durumda, saldırgan buffer’ın sonrasındaki bellek alanlarına kendi kodlarını yerleştirerek, programın çalışmasını değiştirebilir.
Bu zafiyeti önlemek için, buffer’ın boyutunu kontrol eden ve güvenli bir fonksiyon olan cin.getline() kullanılabilir:
#include
#include
using namespace std;
int main()
{
char buffer[10]; // 10 karakterlik bir buffer tanımlanıyor
cout << "Bir metin giriniz: ";
cin.getline(buffer, 10); // Kullanıcıdan gelen metin buffer'a güvenli bir şekilde yazılıyor
cout << "Girdiğiniz metin: " << buffer << endl;
return 0;
}
Bu kodda, kullanıcı 10 karakterden fazla bir metin girdiğinde, buffer sadece ilk 10 karakteri alacak ve taşma olmayacaktır.