Buffer Overflow


Buffer Overflow Örneği ve Analizi
Buffer overflow, bir programın bellek tamponuna (buffer) kapasitesinden fazla veri yazılması sonucu oluşan kritik bir güvenlik açığıdır. Bu zafiyet, bilgisayar güvenliği tarihinde en eski ve en yaygın güvenlik açıklarından biridir. Programlama dillerinde bellek yönetiminin manuel olarak yapıldığı durumlarda, özellikle C ve Assembly gibi düşük seviyeli dillerde sıkça karşılaşılan bir sorundur.
Buffer overflow saldırıları, programın bellek alanını aşarak çeşitli güvenlik ihlallerine yol açabilir. Saldırganlar, bu açığı kullanarak programın akışını değiştirebilir, sisteme zararlı kod enjekte edebilir veya programın çökmesine neden olabilirler. Özellikle yığın (stack) tabanlı buffer overflow'lar, dönüş adreslerini (return address) manipüle ederek saldırganların keyfi kod çalıştırmasına olanak tanır.
Bu tür saldırıların tarihi, 1988'deki Morris Solucanı'na kadar uzanır. Bu zararlı yazılım, buffer overflow zafiyetini kullanarak internet üzerinden yayılan ilk solucanlardan biriydi. O zamandan beri, buffer overflow zafiyetleri sayısız siber saldırıda kullanılmış ve milyonlarca sistemin ele geçirilmesine neden olmuştur.
Assembly dilinde buffer overflow zafiyetlerini anlamak özellikle önemlidir, çünkü assembly programlama düşük seviyeli bellek erişimi sağlar ve programcıya tam kontrol verir. Bu kontrol, beraberinde büyük sorumluluk getirir. Programcının bellek sınırlarını dikkatle takip etmesi ve güvenlik önlemlerini uygulaması gerekir.
Aşağıdaki örnekte, basit bir buffer overflow zafiyetini assembly dilinde inceleyeceğiz ve nasıl istismar edilebileceğini adım adım göstereceğiz. Bu örnek, güvenlik açığının nasıl oluştuğunu ve potansiyel etkilerini anlamanıza yardımcı olacaktır. Ayrıca, bu tür güvenlik açıklarına karşı nasıl önlemler alınabileceğini de tartışacağız.
Örnek Assembly Kodu
Aşağıdaki assembly kodu, basit bir buffer overflow zafiyetine sahip bir program örneğidir:
section .data
msg db "Lütfen isminizi girin: ", 0
buffer_size equ 8
section .bss
buffer resb buffer_size
section .text
global _start
_start:
; Mesajı yazdır
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, 24
syscall
; Kullanıcıdan girdi al
mov rax, 0
mov rdi, 0
mov rsi, buffer
mov rdx, 20 ; Buffer boyutundan büyük bir değer!
syscall
; Programı sonlandır
mov rax, 60
mov rdi, 0
syscall
Kodun Derlenmesi
Öncelikle kodumuzu derleyelim:
nasm -felf64 buffer_overflow.asm -o buffer_overflow.o
ld buffer_overflow.o -o buffer_overflow
Güvenlik Açığının Açıklaması
Bu kodda güvenlik açığı şu şekilde oluşmaktadır:
- Buffer boyutu 8 byte olarak tanımlanmıştır (buffer_size equ 8)
- Ancak program kullanıcıdan 20 byte veri okumaya çalışmaktadır (mov rdx, 20)
- Bu uyumsuzluk, kullanıcının buffer'ın kapasitesinden fazla veri girmesine izin verir
- Fazla girilen veriler, belleğin buffer sonrasındaki bölümlerine yazılır
Güvenlik Açığının Etkisi
Bu tür bir buffer overflow'un potansiyel sonuçları:
- Program çökmesi
- Bellek bozulması
- Yürütme akışının değiştirilmesi
- Kod yürütme imkanı
Güvenlik Önlemleri
Bu tür güvenlik açıklarını önlemek için:
- Buffer boyutunu kontrol etmek
- Giriş verilerini doğrulamak
- Stack canary kullanmak
- DEP (Data Execution Prevention) ve ASLR (Address Space Layout Randomization) gibi güvenlik önlemlerini aktif etmek
Düzeltilmiş Kod
İşte güvenlik açığı giderilmiş versiyonu:
section .data
msg db "Lütfen isminizi girin: ", 0
buffer_size equ 8
section .bss
buffer resb buffer_size
section .text
global _start
_start:
; Mesajı yazdır
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, 24
syscall
; Kullanıcıdan güvenli şekilde girdi al
mov rax, 0
mov rdi, 0
mov rsi, buffer
mov rdx, buffer_size ; Buffer boyutu kadar veri oku
syscall
; Programı sonlandır
mov rax, 60
mov rdi, 0
syscall
Bu düzeltilmiş versiyonda, giriş verisi buffer boyutuyla sınırlandırılmıştır (mov rdx, buffer_size). Bu sayede buffer overflow riski ortadan kaldırılmıştır.
Discussion (0)
No comments