ENESENES

Buffer Overflow

@root

ben kimim

3150 minute

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:

  1. Buffer boyutu 8 byte olarak tanımlanmıştır (buffer_size equ 8)
  2. Ancak program kullanıcıdan 20 byte veri okumaya çalışmaktadır (mov rdx, 20)
  3. Bu uyumsuzluk, kullanıcının buffer'ın kapasitesinden fazla veri girmesine izin verir
  4. 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:

  1. Buffer boyutunu kontrol etmek
  2. Giriş verilerini doğrulamak
  3. Stack canary kullanmak
  4. 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