Debate

Güvensiz malloc/free Kullanım Senaryoları

Iniciado por QuantumRuh · 03 dic 2025 10:15 · 75 Visitas · 0 Respuestas
Autor del tema #0

Askıda Kalan İşaretçi (Dangling Pointer)


Programlama dünyasında, özellikle C gibi dillerde bellek yönetimi kritik bir konudur. Bir bellek bloğu `free()` fonksiyonu ile serbest bırakıldıktan sonra, o bellek alanını işaret eden bir işaretçi hala varlığını sürdürebilir. Bu işaretçiye "askıda kalan işaretçi" adı verilir. Eğer programcı, bu işaretçiyi temizlemez veya `NULL` yapmazsa, program daha sonra bu işaretçiyi kullanarak serbest bırakılmış bellek alanına erişmeye çalışabilir. Sonuç olarak, bu durum programın kararsız çalışmasına, beklenmedik verilere ulaşılmasına veya hatta programın çökmesine yol açar. Örneğin, sistem bu bellek alanını başka bir amaç için tahsis etmişse, eski işaretçi üzerinden yapılan erişimler ciddi güvenlik açıklarına neden olur.

Çift Serbest Bırakma (Double Free)


Aynı bellek bloğunun iki kez `free()` edilmesi, "çift serbest bırakma" hatası olarak bilinir ve oldukça tehlikeli bir durumdur. Bu hatanın temelinde, programcının bir bellek alanını serbest bıraktıktan sonra, aynı işaretçiyi tekrar kullanarak ya da farklı bir işaretçi ile aynı bellek bölgesini bir kez daha serbest bırakmaya çalışması yatar. Sonuç olarak, işletim sisteminin bellek yönetim mekanizmalarında tutarsızlıklar meydana gelir. Bu durum genellikle bellek bozulmasına, programın çökmesine veya en kötü senaryoda, kötü niyetli kişilerin sistem üzerinde rastgele kod çalıştırmasına imkan tanıyan güvenlik açıklarına neden olur.

Serbest Bırakma Sonrası Kullanım (Use-After-Free)


Serbest bırakma sonrası kullanım, bir bellek alanı `free()` fonksiyonuyla serbest bırakıldıktan sonra, programın bu alana tekrar erişmeye çalışmasıyla ortaya çıkar. Bu senaryo, askıda kalan işaretçilerle yakından ilişkilidir, ancak odak noktası işaretçiden ziyade serbest bırakılan belleğe yapılan erişimdir. Başka bir deyişle, bir işaretçi temizlenmemişse ve program bu işaretçi üzerinden belleğe yazma veya okuma işlemi yaparsa, bu bir "use-after-free" hatasıdır. Örneğin, serbest bırakılan bellek başka bir nesne için yeniden tahsis edilmişse, eski işaretçi üzerinden yapılan işlemler yeni nesnenin verilerini bozabilir, gizli bilgilere erişebilir veya keyfi kod yürütülmesine olanak tanıyabilir.

Tampon Taşması ve Altına Yazma (Buffer Overflow/Underflow)


`malloc()` ile dinamik olarak ayrılan bellek alanları belirli bir boyuta sahiptir. Programcı bu sınırları aşarak tahsis edilen bellek alanının dışına veri yazdığında "tampon taşması" (buffer overflow) meydana gelir. Aksine, belleğin başlangıcından önceki bir adrese yazma işlemi "tampon altına yazma" (buffer underflow) olarak adlandırılır. Bu hatalar genellikle kullanıcı girişlerini kontrol etmeden doğrudan belleğe kopyalama işlemleri sırasında ortaya çıkar. Sonuç olarak, programın kontrol akışı değiştirilebilir, kritik veriler üzerine yazılabilir veya sistem üzerinde yetkisiz kod çalıştırılabilir. Bu nedenle, `malloc()` ile ayrılan bellek boyutlarına her zaman dikkat etmek hayati önem taşır.

Bellek Sızıntısı (Memory Leak)


Bellek sızıntısı, `malloc()` fonksiyonuyla tahsis edilen bir bellek alanının, programın yaşam döngüsü boyunca `free()` edilmemesi durumunda ortaya çıkar. Program bu belleği kullanmayı bitirdiğinde, işaretçiyi kaybederse veya bellek yönetimini unutursa, tahsis edilen alan işletim sistemine geri dönmez. Sonuç olarak, program çalıştığı sürece sürekli olarak daha fazla bellek kullanır. Özellikle uzun süre çalışan uygulamalarda, bu durum sistem kaynaklarının tükenmesine, diğer uygulamaların performansının düşmesine ve hatta sistemin tamamen kilitlenmesine neden olabilir. Bu nedenle, her `malloc()` çağrısının karşılığında uygun bir `free()` çağrısı bulunduğundan emin olmak gereklidir.

Tahsis İşleminde Tam Sayı Taşması (Integer Overflow in Allocation)


`malloc()` fonksiyonuna geçilen boyut argümanı bir tamsayıdır. Eğer bu tamsayı, belleğin tahsis edilebileceği maksimum boyutu aşarsa veya bir hesaplama sonucunda tamsayı taşması meydana gelirse, `malloc()` beklenenden çok daha küçük bir bellek bloğu tahsis edebilir. Başka bir deyişle, program büyük bir bellek alanı talep ettiğini düşünürken, aslında çok küçük bir alan alır. Bu durum genellikle daha sonra bu küçük alana büyük miktarda veri yazılmaya çalışıldığında "tampon taşması" hatasına yol açar. Sonuç olarak, bellek bozulur, program çöker veya kötü niyetli kişiler tarafından istismar edilebilecek güvenlik açıkları ortaya çıkar.

Başlatılmamış Belleğe Erişim (Uninitialized Memory Access)


`malloc()` fonksiyonu, tahsis ettiği bellek bloğunun içeriğini garanti etmez; yani, bu bellek alanı rastgele, eski veriler içerebilir. Programcı bu alana herhangi bir değer yazmadan önce, belleğin içeriğini okumaya çalışırsa "başlatılmamış belleğe erişim" hatası meydana gelir. Bu durum, programın öngörülemeyen davranışlar sergilemesine neden olur, çünkü okunan değer tamamen rastgeledir ve kontrol dışıdır. Örneğin, bu rastgele değerler bir güvenlik kontrolünde kullanılabilir ve beklenmeyen sonuçlar doğurabilir. Bu nedenle, `malloc()` ile tahsis edilen her bellek alanının kullanılmadan önce mutlaka başlatılması veya üzerine veri yazılması kritik öneme sahiptir.

Debes haber iniciado sesión para responder.

0 citas seleccionadas