Kural
Önleme yaygın bölünmeyi hatası örneklerini
Null işaretçi deferansları, tampon taşmaları,
ve serbest bırakıldıktan sonra kullanım hataları neden çökmelere ve güvenlik güvenlik açıklarına yol açar.
Desteklenen diller: C/C++Giriş
Segmentasyon hataları, C/C++ uygulamalarında çökmelerin ve istismar edilebilir güvenlik açıklarının en yaygın kaynağı olmaya devam etmektedir. Bu bellek erişim ihlalleri, kodun kendisine ait olmayan belleği okumaya veya yazmaya çalıştığı durumlarda ortaya çıkar; bu durum genellikle null işaretçi dereferansları, tampon taşmaları, sarkan işaretçiler veya serbest bırakılmış belleğe erişim yoluyla gerçekleşir. Tek bir segmentasyon hatası, üretim sunucularını devre dışı bırakabilir; ancak daha da kötüsü, birçok segmentasyon hatası örüntüsü, keyfi kod yürütme amacıyla istismar edilebilir.
Neden önemli?
Güvenlik etkileri: Tampon taşmaları ve serbest bırakıldıktan sonra kullanım (use-after-free) güvenlik açıkları, çoğu bellek bozulması saldırısının temelini oluşturur. Saldırganlar, bunları kullanarak dönüş adreslerini üzerine yazabilir, shellcode enjekte edebilir veya programın kontrol akışını manipüle edebilir. 2014’teki Heartbleed güvenlik açığı, bir tampon aşırı okuma (buffer over-read) sorunu idi. Modern saldırılar hâlâ bu kalıpları hedef almaktadır, çünkü bunlar saldırganlara doğrudan bellek erişimi sağlar.
Sistem kararlılığı: Segmentasyon hataları, uygulamanızı kademeli bir bozulma süreci olmaksızın anında çökertir. Üretim sistemlerinde bu durum, isteklerin kaybolması, işlemlerin kesintiye uğraması ve durum bilgilerinin bozulması anlamına gelir. Yakalanabilen üst düzey dil istisnalarının aksine, segmentasyon hataları süreci sonlandırır ve yeniden başlatma ile kurtarma işlemlerini gerektirir.Saldırı yüzeyinin genişlemesi: Kontrol edilmeyen her işaretçi erişimi, strcpy, memcpy, ya da sınır denetimi yapılmayan dizi erişimi, istismara açık bir potansiyel giriş noktasıdır. Saldırganlar bu güvenlik açıklarını birbirine zincirleyerek, birini kullanarak belleği bozup başka bir güvenlik açığının istismar edilmesini mümkün kılar.
Kod örnekleri
❌ Uygun değil:
void process_user_data(const char* input) {
char buffer[64];
strcpy(buffer, input); // No bounds checking
char* token = strtok(buffer, ",");
while (token != NULL) {
process_token(token);
token = strtok(NULL, ",");
}
}
int* get_config_value(int key) {
int* value = (int*)malloc(sizeof(int));
*value = lookup_config(key);
return value; // Caller must free, but no documentation
}Neden güvenli değil: Şu strcpy() Giriş 63 baytı aşarsa bu çağrı tampon taşmasına neden olur ve saldırganların yığın belleğini üzerine yazmasına imkân tanır. Bu get_config_value() Bu işlev her çağrıldığında bellek sızıntısına neden olur ve çağıranlar, başka kodlar hala bu belleğe başvururken belleği serbest bırakırsa, asılı işaretçi riski ortaya çıkar.
✅ Uygunluk:
void process_user_data(const char* input) {
if (!input) return;
size_t input_len = strlen(input);
char* buffer = malloc(input_len + 1);
if (!buffer) return;
strncpy(buffer, input, input_len);
buffer[input_len] = '\0';
char* token = strtok(buffer, ",");
while (token != NULL) {
process_token(token);
token = strtok(NULL, ",");
}
free(buffer);
}
int get_config_value(int key, int* out_value) {
if (!out_value) return -1;
*out_value = lookup_config(key);
return 0; // Caller owns out_value memory
}Neden güvenlidir: Null işaretçi denetimleri, dereferans kaynaklı çökmeleri önler. Dinamik bellek ayırma, sabit tampon boyutu sınırlamalarını ortadan kaldırır. Sınır denetimli kopyalama ile strncpy() taşmayı önler. Şu dosyadaki net sahiplik kuralları: get_config_value() Arayan tarafın bellek sağlaması durumunda, bellek tahsisi ile ilgili karışıklıkları ve sızıntıları önler.
Sonuç
C ve C++ dillerinde bellek güvenliği, her işaretçi işlemi ve bellek ayırma işleminde savunmacı programlama gerektirir. Segmentasyon hataları kaçınılmaz değildir; tutarlı null kontrolleri, sınır doğrulamaları ve net bellek sahipliği modelleri sayesinde önlenebilir. Bu modellerin üretim aşamasına geçmeden tespit edilmesi, hem sistem çökmelerini hem de istismar edilebilir güvenlik açıklarını önler.

