MultiServis.Net //PHP El Kitabı

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>

Buffer Overflow bilgisayar yazilimi zayifligi nedir? Yazar: Serkan Tarih: 01/03/02

Buffer Overflow Nedir?

18 Temmuz 2000 tarihinde, BugTraq eposta listesine gonderilen bir mesajda, Microsoft Outlook ve Outlook Express programlari ile ilgili cok onemli bir guvenlik acigi,tum dunyanin gozleri onune serildi.
NOT:
BugTraq, bilgisayar ve bilgisayar guvenligi konusunda tartismalarin yapildigi bir eposta listesidir…

Bu aciklama, yazilim endustrisinde cok bilinen adiyla "buffer overflow" guvenlik acigi ile ilgiliydi.
NOT:
Buffer Overflow nedir?

"Buffer Overflow", en basit sekli ile yazilimin bir veri yerlestirilmek icin ayrilmis hafiza alanina, veri yerlestirilmesi sirasinda, eger ayrilan alan o veri icin cok kucuk ise ortaya cikan durumlarin tamamina verilen isimdir…

Asagidaki kod parcasi size cok basit bir "buffer overflow" ornegini gostermek amaciyla C dilinde yazilmistir :

> 1. char Array[10];
> 2. strcpy( Array, "Bu mesaj bir buffer overflow olusmasina yol acar" );

Yaratilan dizinin genisligi 10 ve strcpy komutu ile bu dizi alanina yerlestirilmek(kopyalanmak) istenen karekter sayisi 48 dir.Iste bu durumda 10 karekterden sonraki kisim "yasak" bolgeye tasmis olmaktadir.Bazi durumlarda programlar sadece bu nedenle cokebilir veya calismayi durdurabilir.

Bazi programlar, boyle bir durumda belirli bir sure hic bir sorun yokmuscasina calisabilirler.

Onemli olan nokta : Bu tasan alandaki veri iyi yapilandirilirsa iste o zaman hafizanin o alanindaki kod parcasi "virus" davranislari sergileyebilir.

Bu iki mail programinda ortaya cikan guvelik acigi iste bunlardan kaynaklaniyordu.Iyi yapilandirilmis bir mesaj, programin mesaja ilistirilen virusu calistirmasina sebep oluyordu.

"ILOVEYOU" (1999) veya "Melissa" (1998) gibi , kullanicilarin aktif hale gelmesine yardim ettikleri (ornegin gelen mesaji acarak) vakalar tamamen bu konu ile ilgilidir…

Her iki virus olayinda da kullanicilar bir sekilde mesaji acmaya veya programi calistirmaya yonlendiriliyordu.

Outlook icindeki bu "Buffer Overflow" yazilim hatasinin ortaya cikmasi icin son kullanicinin elinde olan bir sey degildir.Kullanici hic bir sey yapmasa da, sadece gelen eposta ile bu aciktan yararlanan viruslerin bilgisyarina sizmasina yardim etmis oluyordu.

"Buffer Overflow" yazilim hatalari sadece Microsoft Outlook programina ozgu degildir.Bu olay son 10 yildir gundemdedir ve dunyanin en tehlikeli bilgisayar guvenlik acigidir.

Ag guvenligi gozluklerini cikarirsak, aslinda bu tip yazilim hatalarina "bug" denilmektedir.

NOT:

Bug nedir?

Bug ingilizcede bocek anlamina gelir.Ikinci anlami ise icerdeki "muhbir" dir.Burada kullanilan anlami ise "argo" olarak yazilimin icindeki goremedigimiz hatalar anlamindadir.Belirli sartlarda ortaya cikan hatalar veya bu sekilde ornegin ayirilan hafiza alanina dizayn edilenden fazla verinin yuklenmesi gibi calisma zamani hatalari ornek verilebilir.

Her yazilim uzmani kendi kariyerinde en az bir kere bu tip bir "buffer overflow" ghatasi yapmistir.

Ne zaman sabit hacimli bir degisken kullanmaya kalksaniz (ornegin diziler) bu riski de goze aliyorsunuz demektir.

Merhaba Dunya ile gozumuzden kacan gercekler nedir?

Cogu zaman programlamaya ilk adim bir "Merhaba Dunya" programi yazmaktir.Bu programlar iki uc satir kod parcasindan olusan ve standart cikti cihazina istedigimiz mesaji (ornegin "Merhaba Dunya" gibi…) yazdiran "ilk adim" programciklaridir.

"Buffer Overflow" olusmasina sebep olan mantigi anlamak cok basittir.Veriyi koymak icin olusturdugumuz hafiza alanina (buffer) , o alanin alabilecegi sabit veri miktarindan daha fazla veri koyarsak ortaya "buffer overflow" hatalari ortaya cikar.Bunlar bazen programin hicbirsey olmadan calismaya devam etmesine,bazen cokmesine bazende "guvenlik aciklarina" sebep olurlar.

Simdi konuyu daha iyi anlamak ve tum bunlara nasil sebep oldugunu gormek icin kucuk bir ornek yapalim :

Yuksek seviyeli programlama dilleri ile calisirken derleyici, sizin program kodlarinizi assembly kodlarina cevirir.Bu kodlar genelde birincil derecedeki komutlar ve verinin kendisini icerir.

> 1.main () {
> 2. printf( "Hello World" );
> 3.}

Cok bilinen bu "Hello World" programi 300294 byte olarak calistirilabilir program haline getirilmistir.Isletim sistemi windows NT ve derleyici program 'C' Compiler (GCC) dir…

Bu binary calisabilir dosya asagidaki gibi bir gorunume sahiptir :

> 0x401000 55 89 e5 83 ec 10 83 3d 00 20 40 00 00 74 01 cc
> 0x401010 d9 7d fe 66 8b 45 fe 25 c0 f0 ff ff 66 89 45 fe
> …
> 0x401040 48 65 6c 6f 20 57 6f 72 6c 64 00 55 89 55 89
> 0x401050 e5 e8 94 01 00 00 68 40 10 40 00 e8 92 01 00 00
> 0x401060 83 c4 …

Bilgisayarlar iste bu sayilari kullanarak daha biraz once yazdiginiz "Hello World" programini calistirirlar.Bu sayilari aciklamak istersek :

Ilk sutunda yer alan sayilar ile programin o bolumunun hangi hafiza bolgesinde yer alacagi tanimlanmaktadir.Bu hafiza adreslerinin yaninda ise o hafiza alaninin tutacagi deger yazilidir.Her sutundaki veri, hafiza adres degerini bir arttirmaktadir.Ornegin 0x401000 adresinde 55 yer almaktadir.0x401001 de ise 89 degeri saklanmaktadir.Bu siradaki tum adresler ayni buradaki gibi birer birer artirilarak saklanirlar…

Bu sayilardan bazilari komuttur.Bilgisayara belirli bir gorevi yapmasini emrederler.Geriye kalanlar ise saf veridir.

Burada 55 bir komuttur ve bilgisyar bu komutu alarak belirli bir gorevi yerine getirir.Ardindan da ikinci sutundaki 89 sayisina gecer.Bilgisayar 89 komutunun bir parametre gerektirdigini bilmektedir.89 komutu icin gerekli parametre bir sonraki sutundaki e5 ile o komuta saglanmaktadir.Bu durumda bilgisayar aslinda 89 e5 komutunu isletir.Bilgisyar bu komutlari her defasinda bir tane olacak sekilde isletir.Eger hexadecimal kodlari okuyabiliyor olsaydiniz ve bunlarinin ASCII degerlerini karsilarina yazssaydiniz "Hello World" verisinin 0x401040 adresinde oldugunu gorurdunuz :

> 0x401040 48(H) 65(e) 6c(l) 6c(l) 6f(o) 20( ) 57(W) 6f(o) 72(r) 6c(l) 64(d) 00

Bu sayilar ve harfler gordugunuz gibi tamamen digerleri ile benzerdir.Bu ve bunun gibi verileri ,komutlardan ayiran nedir?Bilgisayar hafizada yer alan bu sayi ve harfleri programin akisina gore islemeye baslar.Iste "buffer owerflow" hassasligi da bu yapidan kaynaklanmaktadir.Eger bir hata yaparsaniz veri degerleri komutmus gibi islem gorebilir.Onlarin gercekte "Hello World" gibi "gercek veriler" oldugunun program farkina varamaz.

Bu noktada program aslinda "Hello World" a karsilik gelen alanda sirayla her bir harfin karsiligi olan hexadecimal degeri komutmus gibi islemek isteyecektir.Cok buyuk ihtimalle program cokecek cunku onlar birer veri ve onlar icin herhangi bir bilgisyar komutu tanimli olmadigi icin isletim sistemi o programi "Gecersiz Islem Yuruttu" bahanesi ile kapatacaktir…

Bir bilgisayar korsani bu fikirden haraketle iste bu noktadaki program verilerini, gercek bilgisayar komutlari ile degistirebilir.Bu sekilde kandirilan bilgisayar korsanin kendisine butun kapilarini acacaktir…

Sizin bilgisayariniza, sizin yazilimlarinizi kullanarak girmeye calisan "korsanin" iki seye ihtiyaci vardir :

- Kendi kodlarini hafizanin icine yerlestirmek,
- Bilgisayarinizi kandirarak o kodu islemesini saglamak.

  "buffer oveflow" isimlendirilen bug bilgisayar korsanina bu iki ozelligide sunmaktadir.Cunku program hafizaya yazarken "buffer"(hafiza alani)'in boyutunu kontrol etmemektedir. Korsan hafizadaki veriyi kendi keyfi degerleri ile degistirebilir.Bu olay yanlizca macin ilk 45 dakikasidir ve o kodun bilgisayar tarafindan isletilmesi gereklidir.Iste burada bilgisayari bir sekilde kandirip o kodu isletecek bir hile bulunmalidir : Macin geri kalan 45 dakikasi sadece bunun icin harcanir…

  Yazimiz icerisinde "buffer overflow" yazilim hatalarini ve getirdiklerini anlatmak istedik.Bu nedenle konumuzun getirdigi guvenlik bolumune ara veriyoruz.Zira kimseye buradan, insanlarin bilgisayarlarina girmek icin ipuclari vermek istemiyoruz.

  Buffer Overflow neden olusur?

- Programlama dilleri bunu engellemek icin cok fazla yardimci olmuyor :C ve C++ hic bir sinir kontrol mekanizmasi ile donatilmamistir.Bu programlama dilleri bilgisyarin butun gucunu programciya sunarlar.Iste burada bahsedilen "yan etkiler" en bastan goze alinmis olaylardir…

- Programcilar guvenilmez insanlardir : Programcilar da insandir ve insanlar hata yaparlar.Dunyanin en tembel insanlari programcilardir ve sinirlari kontrol etmek en son yaptiklari istir…

- Dil yapisi olayi zora sokuyor : Sinirlari kontrol etmek ve bu yapilari kurmak zordur.sprintf () fonksiyonunun bu konuda cok kullanisli oldugu akildan cikarilmamalidir.Ornegin "Hello World" icin size gore 11 karekterlik alan yeterli gelebilir.Ama unutulmamalidir ki "d" harfinden sonra gelecek bir "null" karekter vardir ve bunun icinde bir yer ayrilmalidir.Sonucta "Hello World" icin ayrilmasi gereken alan 11 degil 12 dir.

  strcpy gibi fonksiyonlar buffer overflow'a davetiye cikarirlar.Bu tip fonksiyonlardan kacinilmalidir veya iyi kontrol edilmelidirler…

  Nelere yol actilar, kac paraya mal oldular ?

- Dil yapisini ve araclarini iyi anlamamak :

- AT&T 1990 devredisi kalmasi, Buffer Overflow
- Aciklama : Programcilar dilin yapisini iyi anlayamadiklari icin "break" yapisini yanlis kullandilar.

- Kodun anlasilmadan tekrar kullanilmasi :

- Ariane 5 Davasi
- Aciklama : Programcilar yazilim modulunu bir baska projeden alip kullanidlar.Bu modulun gereksinimlerini iyi planlamadilar.

- Yazilim degisiklikleri ve guncellemeler :

- AT&T 1990 devredisi , AT&T 1998 devredisi
- Aciklama : Sistemi daha verimli hale getirmek icin yapilan degisiklikler sistemi daha kararsiz hale getirdi.Zarar milyarlarca dolar…

- Beklenmeyen cikti degerlerini goz ardi etmek :

- Mars Gezgini, Therac-25 ile Kanser Tedavisi
- Sonuc : Facia… Insan olumu,milyarlarca dolar zarar

Kaynak : ISBN 1-57610-917-8
The Science of Debugging
Yazarlar : Matt Telles, Yuan Hsieh

Serkan Hadi Ceylani
www.turk-php.com
serkan@turk-php.com

Burak DAYIOGLU (07/23/01)

Merhaba,

Alan taşırma (buffer overflow) zayıflığının tanımı konusunda örnekler içeren güzel ve hafif
bir yazı olmuş; elinize sağlık. Ancak

"ILOVEYOU" (1999) veya "Melissa" (1998) gibi , kullanicilarin aktif hale gelmesine yardim
ettikleri (ornegin gelen mesaji acarak) vakalar tamamen bu konu ile ilgilidir…

satırlarında küçük bir hata var. Anılan her iki zayıflığın da alan taşırma ile ilgisi yoktur; her iki zayıflık da MS-Outlook'un visual basic motorunun "mesaj görüntülenir görüntülenmez"
mesaj eklerini çalıştırması ile ilintilidir. Düzeltir ve örnekleri değiştirirseniz daha uygun olacağını düşünüyorum.

Tekrar elinize sağlık.

selamlar,
-bd

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>