Arabellek taşmalarını istismar etmek, yıllardır bilinen bir saldırı türü olarak karşımıza çıkıyor. Son yıllarda nispeten azalsa da hâlâ daha oldukça popüler olan bu saldırı türü, bugünkü yazımızın ana konusunu oluşturacak. Bununla birlikte heap’i ve heap overflow saldırısını anlatmaya çalışacağız. Şimdiden keyifli okumalar.
Kolay Erişim
ARABELLEK NEDİR?
Kısaca aktarmak gerekirse arabellek, işletim sistemlerinin yazılım programları için atadığı bellek bloğudur. Yazılım programları, işletim sistemlerinde düzgün bir şekilde çalışabilmesi için gerekli bellek miktarını talep eder. Böylelikle veri kümeleri tutulabilir ve taşınabilir.
Bazı programlama dillerinde bellek yönetimi otomatik olarak yapılırken örneğin C ve C++ gibi dillerde belleğin atanması ve belleğin boşaltılması programcılara kalmıştır. Böylelikle arabellek uzunluklarını kontrol etmek ve bellek sınırlarının aşılmadığından emin olmak gerekir.
ARABELLEK TAŞMASI NEDİR?
Arabelleği az önce tanımlamıştık. Kısaca arabellek taşmasına neden olan süreçleri ele alalım. Arabellek taşmaları genellikle hatalı biçimlendirilmiş girişler tarafından tetiklenir. Kod kitaplıklarını yahut kodları yazan programcıların yaptığı hatalar neticesinde, keşfedilebilir ve istismar edilebilir güvenlik zafiyetleri oluşur. Bu zafiyetlerin oluşumu, örneğin bir programda, veri bulundurmak için gereken maksimum bellek boyutunu tam olarak belirlenmediği ve boyutun aşıldığı durumlarda program, atanan belleğin ötesine geçerek, başka bir kullanım için ayrılan veya başka süreçler için gerekli olan bitişiğindeki bellek bloğuna veri yazar. Bu süreç de arabellek taşmasıyla sonuçlanır.
Arabellek taşmasının sonuçları arasında bellek erişim hataları, yanlış sonuçlar ve çökmeler de dahil olmak üzere düzensiz program davranışı bulunur.
ARABELLEK TAŞMASININ İKİ ANA TÜRÜ
Küme (heap) kaynaklı ve yığın (stack) kaynaklı olmak üzere, arabellek taşmasının iki ana türü vardır. Bu iki ifade genellikle küme ve yığın arasındaki farkı anlatmak için kullanılır.
Heap, genel olarak programların dinamik bellek ihtiyacını karşılayan, dinamik değişkenleri depolamak için kullanılan belleğin/hafıza alanının bir bölgesidir. Heap’de uygulama hafıza alanına ihtiyacı olduğunda ‘dinamik’ olarak tahsis (allocate) ve free edebilir. Benzetmelerde hata payı hep olsa da şöyle anlatabiliriz, heap mutfak dolapları gibidir. Siz mutfak dolaplarında aradığınız nesneyi arayıp buluyorsunuz, işiniz bittiğinde de geri koyuyorsunuz. Nesneyi alma işleminin karşılığı ‘allocation’ olurken, pek tabii (malloc, heapolloc vb. fonksiyonları da unutmamak gerek) bu karşılıkla hafıza ayırıyoruz. Kullandıktan sonra geri koymaya da ‘free’ işlemi diyoruz. Özetle, kendimize hafıza alıyoruz, işimiz bitince geri bırakıyoruz.
Kısaca bitirmek gerekirse, heap’teki bellek kullanımı derleyici (compiler) tarafından değil, geliştiriciler tarafından kontrol edilir. Karmaşık programlar oluştururken genellikle büyük bir bellek alanına ihtiyaç duyulur. Bu durumdaysa Heap Memory kullanılır. Heap üzerinde allocate ettiğimiz bellek operasyonunaysa “dynamic memory allocation” adı verilir.
Geleneksel parola ele geçirme tekniği: Brute force nedir, nasıl gerçekleştirilir?
Heap, malloc() ve calloc() işlevleri kullanılarak tahsis edilir ve C’nin yerleşik işlevleri olan realloc() işlevi kullanılarak yeniden boyutlandırılır. Bu değişkenlere global olarak erişilebilir ve bir kez öbek üzerinde bellek ayırdığımızda bu bellek alanını boşaltmak bizim sorumluluğumuzdur.
“malloc” ve “free” fonksiyonlarının sistem üzerindeki akışlarını incelersek, “malloc” fonksiyonunun gerekli olan memory miktarını CPU’dan istediğini ve başlangıç adresine bir pointer döndürdüğünü görürüz. “free” ise CPU’dan istediğimiz belleğin artık gerekli olmadığını ve diğer görevler için kullanılabileceğini ifade eder.
HEAP OVERFLOW NEDİR?
İşlemciyse geliştiricilerin isteklerini yanıtlar. Sonuç olarak yukarıdaki iki fonksiyonla bu belleği yönetmek insana bağlıdır ve bu da kötü yönetildiğinde kocaman bir probleme yol açar. Heap’in taşmasına neden olabilecek iki durum vardır:
- Sürekli olarak bellek ayırırsak ve kullanımdan sonra bu bellek alanını boşaltmazsak
- Dinamik olarak çok sayıda değişken tahsis edersek.
Heap overflow, birçok durumda oluşabilmesine karşın genel özette yukarıdaki iki durumda oluşur. Siber tehdit aktörleri, heap overflow’dan yararlanarak kendi kodlarını programda çalıştırabilir.
ARABELLEK TAŞMALARI NASIL İSTİSMAR EDİLİR?
Arabellek taşmaları tüm yazılım türlerini etkileyebilir. Bunlar tipik olarak hatalı biçimlendirilmiş girdilerden veya arabellek için yeterli alan tahsis edilememesinden kaynaklanır. İşlem yürütülebilir kodun üzerine yazarsa, programın öngörülemeyen şekilde davranmasına ve yanlış sonuçlar, bellek erişim hataları veya çökmelere neden olabilir.
Yani belleği taşırıp, arta kalan kısımları kontrol edilebilir hâle geldiğinde siber tehdit aktörleri, kendi kodlarını girerek söz konusu programı manipüle edebilir ve programlar, sunucular, yazılımlar üzerinde kendi kodlarını çalıştırabilir. Çoğu zaman siber tehdit aktörleri, heap overflow’la birlikte uzaktan kod yürütebilir hâle gelir.
HANGİ DİLLER ARABELLEK TAŞMALARINDA DAHA HASSASTIR?
C ve C++, belleklerindeki verilerin üzerine yazmaya veya verilere erişmeye karşı yerleşik korumaları olmadığı için arabellek taşması saldırılarına karşı oldukça hassas olan iki dildir.
Mac OSX, Windows ve Linux’un tümü C ve C++ ile yazılmış kodları kullanır.
PERL, Java, JavaScript ve C# gibi diller, arabellek taşması olasılığını en aza indiren yerleşik güvenlik mekanizmalarını kullanır.
TARİHTEKİ BAZI KRİTİK ARABELLEK TAŞMALARI
Morris Solucanı, 1988 yılında arabellek taşması veya arabellek aşımı olarak bilinen bir güvenlik zafiyetini istismar ederek bir solucanın ne kadar hızlı yayılabileceğini gösterdi ve internetin öncüsü olan ARPANET’e bağlı 60 bin bilgisayardan neredeyse 6 binini etkiledi.
Bu saldırıyla birlikte ilk CERT kuruldu ancak bellek taşmasından faydalanılan son saldırı bu olmadı.
2001 yılında Code Red solucanı, Microsoft’un IIS yazılımı kullanan 359.000’den fazla bilgisayarı etkiledi. Code Red, web sayfalarını tahrif etti ve Beyaz Saray’daki bir web sunucusu dahil olmak üzere hizmeti engelleme saldırıları düzenlemeye çalıştı.
Code Red’den 2 yıl sonra, 2003 yılında SQL Slammer solucanı, Microsoft’un SQL Server yazılımını kullanan 250.000’den fazla sisteme saldırdı. SQL Slammer, yönlendiricileri etkileyerek internetteki ağ trafiğinin fazlasıyla yavaşlamasına, hatta durma noktasına gelmesine sebep oldu. Code Red ve SQL Slammer solucanları, arabellek taşması güvenlik zafiyetleri yoluyla yayıldı.
ARABELLEK TAŞMALARINA NASIL ÖNLEM ALINIR?
Geliştiriciler, kodlarındaki güvenlik önlemleri aracılığıyla veya yerleşik koruma sunan dilleri kullanarak arabellek taşması güvenlik açıklarına karşı koruma sağlayabilir.
Aşağıdaki önlemlerden bazıları da arabellek taşmalarına engel olur:
- Adres karıştırma(Address Obfuscation) yapılması,
- Fonksiyonlar random şekilde yapılandırılması,
- Data Execution Prevention (Veri Yürütme Engellemesi) aktif hâle getirilmesi,
- ASLR (Address space layout randomization) programda yer alan veri alanlarının rastgele şekilde düzenlenmesini sağlayarak bellek taşırma saldırılarına karşı korunmayı sağlaması,
- Fonksiyonların kullanımı öncesinde mutlaka değer kontrolü yapılması,
- Kontrol sonrasında, zararlı karakterler temizlenerek (trim), uzunluk kontrolü yapıldıktan sonra, kullanıcıdan gelen “temiz veri” sistem içerisinde kullanılabilir hâle getirilmesi.