Zafiyet Araştırmalarında Fuzzing - II
Veysel Hataş, Fatih Sevimli, TÜBİTAK BİLGEM   
07.10.2014

Yazının bir önceki bölümünde "Fuzzing Nedir" konusuna değinilmişti. Bu bölümünde ise Fuzzing metotlarından bahsedilecektir. 

FUZZING METOTLARI                                                                                                                 

Fuzzing işlemi için testi yapılacak uygulamaya veya protokole özgü tasarlanmış farklı yöntemler bulunmaktadır. Her ne kadar fuzzing yöntemlerinin sınıflandırması zor olsa da bu yöntemleri, Üretme tabanlı (Generation-based) ve Mutasyon tabanlı (Mutation-based) olarak iki başlık altında toplayabiliriz. 

Generation-based fuzzing yöntemi, formata ya da protokole uygun data modeline göre test case’lerin üretildiği bir yöntemdir. Rasgele tabanlı (Random-based) ismi de kullanılmaktadır. Uygulanması zor bir yöntemdir. Çünkü ilgili format ve protokol bilgisi gerekmektedir. 

Üretme tabanlı fuzzing yöntemlerine örnek olarak Jeremy Brown tarafından yazılmış pdf okuyucu uygulamamızı test edebileceğimiz PDFuzzer aracını inceleyelim [1]. Bu fuzzer, pdf uzantılı başlık (header) objesini fuzz etmektedir. Perl kodunda işaretli bölümde gördüğümüz gibi dosya formatına uygun tanımlamalar yapılmış ve bu alanlar yine kodda verilen test taslaklarıyla (@overflow, @fmtstring, @miscbugs) fuzz edilmektedir. Bu fuzzer pdf format bilgisi kullanılarak yazılmıştır.

pdfuzzer.png 

 Şekil 1 - PDFuzzer

Generation-based yöntemine verebileceğimi bir diğer örnek David Zimmer tarafından yazılmış COMRaider fuzzer’ı, Internet Explorer üzerinden güncellemelerini alabilen uygulamaların ActiveX üzerinden formata uygun com objelerini fuzz edilmesini sağlayabilmektedir [2]. Ayrıca test edilen uygulamada tespit edilen zafiyetler de aşağıdaki gibi rapor üzerinden analiz edilebilmektedir.

comraider.png

Şekil 2 - ComRaider 

 

Mutation-based, var olan veri örnekleri mutasyona uğratılarak yeni test durumları üretilmesine dayalı yapılan fuzzing yöntemidir. Test edilecek uygulamanın şekliyle (dosya formatı vs.) doğrudan bir bağlantısı olmadığı ve test case’lerin oluşturulmasında bir mantık aranmadığı için Akılsız fuzzing (Dumb fuzzing) de denilmektedir. Bu yöntem uygulanması yönünden diğerine göre daha kolaydır. Yalnız bu fuzzing yöntemini kullanan fuzzer’lar çok fazla crash dosyası ürettiklerinden fazlaca yanlış alarmlara (false-positive) neden olmaktadır.

Bu yöntem, formatına uygun yapılanmış program giriş verilerinin farklı yollarla bozularak test durumlarının oluşturulmasına dayanır. Öne çıkan Mutasyon tabanlı fuzzing yöntemlerinden birisi Rasgele Byte Değiştirme (Change Random Byte) yöntemi, diğeri ise Byte Kaydırma (Byte Flipping) yöntemidir.

  •  Change Random Byte yöntemi, belirlenen verinin rasgele miktardaki rasgele byte’ın, belirlediğimiz byte’larla değiştirilerek yeni test durumları üzerinden fuzzing yapılmasına dayanır. Örnek veri ve bu veri üzerinden üretilen test durumlarının byte uzunlukları birbirine eşittir. Boyut değiştirilmediği için test case’ler uygulama tarafından reddedilmezler. Daha iyi anlayabilmek için bu yöntemin üstadı Charlie Miller’ın geliştirdiği oldukça kullanışlı kod parçacığına bakalım. 


numwrites = random.randrange (math.ceil ( ( float ( len (buf)) / FuzzFactor)))+1
for j in range (numwrites ) :
                   rbyte = random.randrange (256)
                   rn = random.randrange (len (buf) )
                              buf [rn] = "%c" %(rbyte);

Kodda öncelikle binary dosya, byte dizisi (byte array) olarak bir buffer’a açılmaktadır.  İçerisinden seçilen rasgele miktardaki rasgele numaralı byte’lar yine rasgele üretilen byte’larla “numwrites” şeklinde tanımlanan bir sayı kadar döngü içerisinde değiştirilmektedir. Yeni test case boyutu değiştirilmeden tekrar binary dosya haline getirilip uygulama üzerinde test yapılmaktadır. Bu yöntem basit olduğu kadar birçok zafiyet barındıran bug bu yöntemle bulunmaktadır.

Aşağıdaki resimde de Charlie Miller kodunun bir pdf fuzzer içerisinde kullanılması örneğini görüyoruz. Örnek pdf uzantılı dosyalar üzerinden, belirlenen pdf okuyucularında mutasyon tabanlı fuzzing işlemi yapılıp uygulama çakılma kayıtları tutulabilmektedir.

dumb_fuzzer.png 

Şekil 3 - Dumb Fuzzer 

  • Byte Flipping yönteminde ise her seferinde kaydırılmak şartıyla, belirlenen boyutta (BYTE, WORD, DWORD) byte dizi ile binary dosyanın byte’larının değiştirilmesine dayanır. FiveBelow aracı, bu yöntemi kullanan bir dummy dosya fuzzer’ıdır. Aşağıdaki şekilde komut satırından çalıştırılabilen FiveBelow fuzzer’ın parametrelerini ayarlayabileceğimiz xml tabanlı yapılandırma dosyasını görüyoruz.

fivebelow_fuzzer_yaplandrma_dosyas.png

 Şekil 4 - FiveBelow Fuzzer Yapılandırma Dosyası

 C:\fuzz> .\fivebelow.exe -m fuzz -e "C:\Program Files\Test_Yazılımım.exe" -o "c:\New\mov"

Aşağıda FiveBelow tarafından üretilen test case’lerdeki 4 Byte’lık “FF FF FF FF” DWORD’ün her seferinde bir sonraki 4 byte üzerine kaydırıldığını görüyoruz. 

 

shift_edilmi_.mov_test_case__rnekleri.png

 

Şekil 5 - Shift Edilmiş .mov Test Case Örnekleri 

Bahsedilen fuzzing metodları dışında Proxy tabanlı (Proxy-based), Spesifikasyon tabanlı (Specification-based) ve Evrimsel tabanlı (Evolutionary-based) fuzzing metotları da literatüre giren yöntemlerdendir.

Proxy tabanlı fuzzer’lar istemci ve sunucu arasına oturmaktadırlar. Yakaladığı paketleri mutasyona uğratarak hedef tarafa iletme prensibine dayanırlar. Hem sunucu hem de istemci tarafı fuzz edilebilir. Spesifikasyon tabanlı fuzzer’lar uygulamanın ayrıntılarının belirtilmesine dayalı girdi verileri üretirler. Bu yöntemle uygulama çok derin bir şekilde test edebilir. Evrimsel tabanlı fuzzer en iyi test verisinin keşfedilmesine dayalı evrimsel algoritmalar (GAs) kullanan akıllı fuzzer’lardır.

Sonuç olarak fuzzing, yazılımcıların güvenli kod geliştirme aşamasında ve ürün sonrasında mutlaka kullanması gereken yöntemleri kapsamaktadır. Akademik ve ticari amaçlı geliştirilmiş birçok fuzzer bulunmaktadır. Bu fuzzer’lar test aşamasında yapılandırılıp kullanılabilirken kendi uygulamanıza özgü çalışabilecek fuzzing yöntemlerini kullanan farklı programlama dilleriyle fuzzer’lar yazılarak da kullanılabilir.

REFERANSLAR

[1] http://www.securiteam.com/tools/6R0052KN5I.html

[2] labs.idefense.com/software/fuzzing.php  

[3] M. Sutton, A. Greene, and P. Amini, Fuzzing: Brute Force Vulnerability Discovery, Addison–Wesley Professional, United States, 2007.  


Favori olarak ekle (0) | Görüntüleme sayısı: 7248

Bu yazıya ilk yorumu yazın

Sadece kayıtlı kullanıcılar yorum yazabilir.
Lütfen sisteme giriş yapın veya kayıt olun.