Hafıza Taşırma (Buffer Overflow) Saldırıları

Hafıza Taşırma (Buffer Overflow) Saldırıları

1.1.1. Hafıza (buffer) nedir?

Buffer yani tampon alan donanım aygıtları veya farklı hızlarda farklı öncelikleri olan program işlemleri tarafından paylaşılan bir veri alanıdır. Buffer her aygıtın ya da process’in çalışmasını durdurmadan devam ettirmesini sağlar.

Bufferlar Input/Output işlemi sırasında kullanıcının beklemesini engellemek için kullanılırlar. Bellekten okumak ve belleğe yazmak maliyetli bir işlemdir. Sistemi yorar ve hız olarak yavaştır. Input/Output aygıtlarından gelen veriler bu sebeple önce bir havuzda toplanır. Böylece bu havuz belirli miktarlarda dolduktan sonra toplu olarak belleğe yazılır. Bu sisteme performans kazandıran bir harekettir. Örnek verecek olursak, kamyon kasası boşaltım işlemi yaparken bir yandan da hala doldurmaya devam eden bir kepçe gibidir.

Yazılımlarda Remote Code Executing (RCE) / Uzaktan Kod Çalıştırma yöntemlerin başlarında gelmektedir. Bir buffer kontrol edilmiyorsa, maksimum sayıdan daha fazla yük yüklenebilmektedir. Taşan kısımda, dışardan enjekte edilen kodlar çalıştırılabilmektedir.

1.1.2. Bellek taşması nedir?

Bellek taşması, sınırlandırılmış boyuttaki bellek alanına, planlananın üzerinde veri kopyalanınca taşma yaşanmaktadır. Bir örnek vermek gerekirse,

Char AyrilmisAlan[10];

Strcpy(AyrilmisAlan, ‘Bu alana on karakterden fazla veri girisi yapmak’):

“AyrilmisAlan” isimli bölüme 10 karakteri yaşıyacak kadar yer açıldı. StrCpy fonksiyonu ile bu alana, 51 karakterlik bir metin kopyalandı. Eğer kullanıcı tarafından gelen bir metinse, 10 karakrerle sınırlandırmadan gelen veri kontrolsüz bir şekilde içeri alınırsa, hafızada ilk 10 karakter bulunur, kalan 41 karakter ise başka alana taşar.

 

Eğer belleği taşırıp, arta kalan kısım saldırganlar tarafından kontrol edilebilir hale gelirse, 10 karakter sonrasında gelecek alana, saldırgan kendi kodlarını girerek programı manüple ederek bizim sunucumuz üzerinde kendi kodlarını çalıştırabilir.

 

1.1.3. Bellek taşması sebepleri

Bellek taşması saldırılarının en büyük sebebi, gelen değerlerin kontrol edilmeden uygulama içerisine alınmasından kaynaklanmaktadır. Kullanıcı tarafından veri girişi yapılabilecek alanlar, uygulama tarafından kod içerisinde değerlendirilmeden önce, zararlı karakterlerden temizlenmeli ve uzunluğu kontrol edilmelidir.

10 karakterlik olarak açtığımız bi karakter alanına gelen değeri, yerine yazdırmadan önce LEN/LENGTH komutları ile sayısal değer olarak alarak, 10’a eşit veya küçük olması koşulunda yazdırma işlemi yapılmalıdır.

  • Strcat(),
  • strcpy(),
  • sprintf(),
  • vsprintf(),
  • bcopy(),
  • gets(),
  • scanf()

fonksiyonları hafıza (buffer) boyutunu kontrol etmedikleri için exploit edilebilmektedir. Bu fonksiyonlar kendi içlerinde kontrol yapmadan, gelen değeri işlemekle görevlidir. Fonksiyonların kullanımı öncesinde mutlaka değer kontrolü yapılmalıdır.

 

Kontrol sonrasında, zararlı karakterler temizlenerek (trim), uzunluk kontrolü yapıldıktan sonra, kullanıcıdan gelen “temiz veri” sistem içerisinde kullanılabilir hale gelmiştir.

1.1.4. Stack (yığıt)

Stack (Yığıt) , veri ekleme ve çıkarma işlemlerinin en üstten yapıldığı bir veri yapısıdır. Yani veri eklendiği zaman stack yapısının en üstüne ekleniyor. Her veri bir öncekinin üstüne ekleniyor. Veriyi çıkarma işleminde ise en üstteki veriyi alınıyor. Bu vesileyle de bir altındaki en üste çıkmış oluyor. Bir tabancanon şarjörüne mermi doldurulduğunda en son konulan mermi silahtan ilk çıkacak olandır. Yani yığıt yapısında da dendiği gibi “Son giren ilk çıkar”.

Şekil 2‑30 Yığıt Şekli

Yığıt yapısı için iki adet fonksiyondan baksedilebir. Push ve Pop.

Push yığıt yapısının en üstüne veri eklemeyi ifade ediyor. Pop ise üstteki veriyi çekmeyi ifade etmektedir.

1.1.5. Queues (kuyruklar)

Kuyruklar günlük hayatta sıkça rastlanan sıra bekleme olarak açıklanabilir. Bir devlet kurumuna bir işlem için gidildiğinde gidip bir sıra almak gerekir. Bir kuyruğa girilir. Sonra gelen kişi öne değil sıranın arkasına geçmek zorundadır. İlk sıradaki her zaman daha önce işi bitirir. Kuyruk yapısında veri ekleneceği zaman kuyruğun sonuna eklenir. Veri çıkarılacağı zamanda başında çıkarılır. Kısaca betimlenecek olursa Stack yapısının aksine Kuyruk yapısında “İlk giren ilk çıkar” sloganı geçerlidir.

Şekil 2‑31 Kuyruk Şekli

Enqueue sondan veri eklenmesi işlemidir. Dequeue ise ilk sıradan veri çıkarılması işlemidir.

https://www.owasp.org/index.php/Buffer_Overflow

1.1.6. Buffer overflow’a karşı alınabilecek önlemler

  • Yığıt (Stack) çalıştırılmayacak şekilde ya da random location şeklinde yapılandırılır.
  • Adres karıştırma(Address Obfuscation) yapılmalıdır.
  • Fonksiyonlar random şekilde yapılandırılmalıdır.
  • Data Execution Prevention(Veri Yürütme Engellemesi) aktif hale getirilmelidir.
  • 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ğlar.
  • Statik Source Kod Analizleri: Kod çalıştırılmadan önce gerçekleştirlir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir