Fuzz Testi (Fuzzing) Eğitimi
⚡ Akıllı Özet
Fuzz testi, geçersiz, beklenmedik veya rastgele verileri bir programa besler ve çökmeleri, donmaları ve bellek hatalarını izleyerek, betik tabanlı fonksiyonel testlerin kendi başlarına neredeyse hiç ulaşamadığı güvenlik açıklarını ortaya çıkarır.
Fuzz Testi Nedir?
Fuzz Testi veya Fuzzing Fuzz testi, yazılım sistemine geçersiz veya rastgele veriler (FUZZ olarak adlandırılır) yerleştirerek kodlama hatalarını ve güvenlik açıklarını keşfetmeyi amaçlayan bir yazılım test tekniğidir. Fuzz testinin amacı, otomatik veya yarı otomatik teknikler kullanarak veri eklemek ve sistemin çökmesi veya yerleşik kodun başarısız olması gibi çeşitli istisnalar açısından sistemi test etmektir.
Fuzz testi, aslen Wisconsin-Madison Üniversitesi'nden Barton Miller tarafından geliştirilmiştir. Miller, modem bağlantısındaki hat gürültüsünün kullandığı programları çökertmesi üzerine bu terimi ortaya atmıştır. Öğrencileri 1989'da ilk fuzz testlerini çalıştırmış ve hedefledikleri UNIX yardımcı programlarının yaklaşık üçte birinin çöktüğünü veya donduğunu tespit etmiştir. Fuzz testi, bir yazılım testi bir teknik ve bir türüdür. Güvenlik Testi.
Aşağıdaki diyagram, üretilen verilerin test edilen uygulamaya gönderildiği ve yanıtın gözlemlendiği temel fuzzing döngüsünü göstermektedir.
Neden Fuzz Testi yapılmalı?
Fuzzing, test planlarında yerini haklı çıkarıyor çünkü kimsenin test senaryosu yazmayı düşünmediği girdileri keşfediyor. Ekiplerin bu yöntemi benimsemesinin başlıca nedenleri aşağıda listelenmiştir.
- Fuzz testi genellikle en ciddi güvenlik açıklarını ve kusurlarını bulur, çünkü bir çökme, ele alınmayan bir giriş yolunun doğrudan kanıtıdır.
- Fuzz testi, birlikte kullanıldığında daha etkili bir sonuç verir. Siyah Box Test yapmak, Beta Testi ve diğer hata ayıklama yöntemleri.
- Fuzz testi, yazılımların güvenlik açıklarını kontrol etmek için kullanılır ve girdiler elle yazılmak yerine üretildiği için çok uygun maliyetli bir test tekniğidir.
- Fuzz testi, kara kutu test tekniklerinden biridir. Fuzz testi aynı zamanda bilgisayar korsanlarının bir sistemdeki güvenlik açığını bulmak için kullandığı en yaygın yöntemlerden biridir; bu nedenle öncelikle fuzz testini çalıştırmak, saldırganın sisteme girmesi için en kolay yolu ortadan kaldırır.
Fuzz Testi Türleri
Fuzzer'lar genellikle saldırdıkları program hakkında ne kadar bilgiye sahip olduklarına göre gruplandırılır. Fuzzer ne kadar çok şey biliyorsa, kodun içine o kadar derinlemesine nüfuz edebilir.
| Menşei | Fuzzer'ın bildikleri | Tipik kullanım |
| Kara kutu bulanıklaşıyor | İç işleyişiyle ilgili hiçbir şey bilmiyor; sadece giriş ve çıkışları görüyor. | Hızlı duman testleri, bir ikili dosyaya veya canlı bir uç noktaya karşı gerçekleştirilir. |
| Beyaz kutu bulanıklaştırma | Ulaşılması zor dallanmaları çözmek için genellikle sembolik yürütme ile birleştirilen tam kaynak kod. | Kaynak kodu mevcut olan bir bileşenin derinlemesine analizi. |
| Gri kutu bulanıklaşıyor | Kaynak kod incelemesi yok, ancak bir girdinin hangi kod dallarına ulaştığı gibi çalışma zamanı geri bildirimi sağlanıyor. | AFL++ ve libFuzzer gibi modern oyun motorları için varsayılan ayar. |
İkinci, daha eski bir ayrılık ayırıyor aptal bulanıklaştırma itibaren akıllı bulanıklaştırmaBasit bir fuzzer, giriş formatı hakkında hiçbir fikri olmadan bitleri değiştirir, bu nedenle verilerinin çoğu karşılaştığı ilk ayrıştırıcı tarafından reddedilir. Akıllı bir fuzzer ise sağlama toplamlarını, uzunluk alanlarını ve mesaj yapısını anlar, bu nedenle girdileri doğrulamayı geçer ve alttaki mantığa ulaşır. Kapsam yönlendirmeli bulanıklaştırma Bu, fuzzing'i ana akım haline getiren gri kutu iyileştirmesidir: motor ikili dosyayı araçlarla donatır, yeni bir dala ulaşan tüm girdileri saklar ve hayatta kalanları değiştirir, böylece veri kümesi rastgele gürültüden yeniden başlamak yerine sürekli olarak keşfedilmemiş koda doğru evrilir.
Fuzz Testi nasıl yapılır?
Fuzz testinin adımları, temel test adımlarını içerir:
Adım 1) Hedef sistemi tanımlayın — Saldırıya uğrayacak ikili dosyayı, kütüphaneyi, hizmeti veya protokol uç noktasını seçin ve test etmenize izin verildiğini onaylayın.
Adım 2) Girdileri tanımlayın — Hedefin okuma yaptığı her giriş noktasını listeleyin: dosyalar, komut satırı argümanları, ortam değişkenleri, ağ paketleri, form alanları ve API yükleri.
Adım 3) Bulanık Veriler Oluşturun — Geçerli örnekleri değiştirerek, bu formatın bir modelinden türeterek veya her ikisini birleştirerek hatalı girdiler üretmek.
Adım 4) Bulanık verileri kullanarak testi gerçekleştirin — Hedefi, oluşturulan girdilere karşı çalıştırın; ideal olarak, her hatadan sonra işlemi otomatik olarak yeniden başlatan bir döngü içinde.
Adım 5) Sistem davranışını izleyin — Yalnızca yazdırılan çıktıyı kontrol etmekle kalmayın, çökmeleri, donmaları, onaylama hatalarını, aşırı bellek kullanımını ve temizleme raporlarını da izleyin.
Adım 6) Kusurları günlüğe kaydedin — Her bir hataya neden olan tam girdiyi kaydedin, en küçük tekrarlanabilir duruma indirgeyin ve yığın izleme dosyasına ekleyin. tracEkli.
Fuzzer Örnekleri
Fuzzer'lar ayrıca girişlerini nasıl oluşturduklarına göre de sınıflandırılır ve aşağıda belirtilen üç yaklaşım en sık karşılaşacağınız yaklaşımlardır.
- Mutasyon Tabanlı Fuzzer'lar Yeni test verileri oluşturmak için mevcut veri örneklerini değiştirin. Bu çok basit ve anlaşılır bir yaklaşımdır: bir protokolün geçerli örnekleriyle başlar ve her baytı veya dosyayı değiştirmeye devam eder.
- Nesil Tabanlı Fuzzer'lar Modelin girdisine dayanarak yeni veriler tanımlarlar. Belirtilen özelliklere göre sıfırdan girdi üretmeye başlarlar.
- Protokol tabanlı bulanıklaştırıcılar Bu yöntem, test edilen protokol formatına ilişkin ayrıntılı bilgiye dayanır ve bu anlayış spesifikasyondan gelir. Spesifikasyonun bir dizisini araca yazmayı, ardından spesifikasyon üzerinden geçmek ve veri içeriğinde, dizilimde vb. düzensizlikler eklemek için model tabanlı bir test oluşturma tekniği kullanmayı içerir. Bu aynı zamanda sözdizimi testi, dilbilgisi testi veya sağlamlık testi olarak da bilinir. Bir fuzzer, mevcut bir test senaryosundan test senaryoları oluşturabilir veya geçerli veya geçersiz girdiler kullanabilir.
Protokol tabanlı bulanıklaştırmanın iki sınırlaması vardır:
- Spesifikasyon olgunlaşana kadar test devam edemez.
- Birçok yararlı protokol, yayınlanmış protokollerin bir uzantısıdır. Fuzz testi yayınlanmış spesifikasyonlara dayanıyorsa, Test kapsamı yeni protokoller için sınırlı olacaktır.
En basit fuzzing tekniği, yazılıma protokol paketleri veya olaylar şeklinde rastgele girdi göndermektir. Rastgele girdi gönderme tekniği, birçok uygulama ve hizmetteki hataları bulmak için çok güçlüdür. Başka teknikler de mevcuttur ve bunların uygulanması çok kolaydır. Bu teknikleri uygulamak için mevcut girdileri değiştirmemiz yeterlidir ve bir girdiyi değiştirmek için bitlerini değiştirmek yeterlidir.
Fuzz Testi tarafından tespit edilen hata türleri
Fuzzing, bir çalıştırmayı beklenen değere göre değil, programın nasıl davrandığına göre değerlendirdiği için, ortaya çıkardığı hatalar üç aileye ayrılır.
- Doğrulama hataları ve bellek sızıntıları: Bu metodoloji, bellek güvenliğini etkileyen ve ciddi bir güvenlik açığı olan hataların bulunduğu büyük ölçekli uygulamalarda yaygın olarak kullanılmaktadır. Buffer Taşmalar, serbest bırakıldıktan sonra kullanım ve sınır dışı okuma hataları burada ortaya çıkar.
- Geçersiz giriş: Fuzz testinde, fuzzer'lar hata işleme rutinlerini test etmek için kullanılan geçersiz girdiler üretmek için kullanılır ve bu, girdisini kontrol etmeyen yazılımlar için önemlidir. Basit fuzz testi, otomasyonun bir yolu olarak görülebilir. negatif test.
- Doğruluk hataları: Fuzzing, bozuk veritabanı veya kötü arama sonuçları gibi bazı "doğruluk" hatalarını tespit etmek için de kullanılabilir. Aynı girdiyi iki uygulamaya besleyip yanıtları karşılaştıran diferansiyel fuzzing, bunları yakalamanın yaygın yoludur.
Fuzz Test Araçları
Web güvenliğinde kullanılan araçlar, fuzz testlerinde de yaygın olarak kullanılabilir; örneğin, Burp Suite ve Peach Fuzzer. Aşağıdaki klasik isimlerin birçoğu artık arşivlenmiştir, bu nedenle mevcut durumları her bir girişin yanında belirtilmiştir.
- Şeftali FuzzerPeach Fuzzer, bir tarayıcıdan daha sağlam bir güvenlik kapsamı sunar. Diğer test araçları yalnızca bilinen tehditleri arayabilirken, Peach Fuzzer kullanıcıların bilinen ve bilinmeyen tehditleri bulmasını sağlar. Peach Tech, GitLab tarafından satın alındı ve Community Edition v3 artık desteklenmiyor; desteklenen halefi ise şudur: GitLab Protokol Fuzzer Topluluk Sürümü.
- Spike Proxy'siSPIKE Proxy, web uygulamalarındaki uygulama düzeyindeki güvenlik açıklarını arayan profesyonel düzeyde bir araçtır. SPIKE Proxy, aşağıdaki gibi temel özellikleri kapsar: SQL Tamamen açık bir ortamda enjeksiyon ve siteler arası komut dosyası çalıştırma saldırıları. Python altyapı mevcuttu ve kullanıma açıktı. Linux hem de WindowsUzun yıllardır bakımı yapılmamış olup, tarihi bağlam sağlamak amacıyla buraya dahil edilmiştir.
- WebScarabWebScarab şu dilde yazılmıştır: Java Bu nedenle birçok platforma taşınabilir. WebScarab çerçevesi HTTP ve HTTPS protokollerini kullanarak iletişim kurar ve bir araya giren proxy görevi görür: operatörün, sunucu tarafından alınmadan önce tarayıcı tarafından oluşturulan istekleri incelemesine ve değiştirmesine ve tarayıcı tarafından alınmadan önce sunucu tarafından oluşturulan yanıtları incelemesine ve güncellemesine olanak tanır. WebScarab'ın bulduğu herhangi bir güvenlik açığı, bildirilen sorunlar listesine eklenir. Depo Nisan 2024'te arşivlendi ve şu anda salt okunur durumdadır.
- OWASP WSFuzzerWSFuzzer, GPL lisanslı bir program olup şu dilde yazılmıştır: Python Web servislerini hedefleyen ve son sürümünde HTTP tabanlı olan SABUN hizmetleri Ana hedef buydu. WebScarab'ın bir parçası olarak piyasaya sürüldü ve onunla birlikte kullanımdan kaldırıldı; OWASP ZAP ve Fuzzer eklentisi Önerilen yedek parçalar bunlardır.
- Mevcut alternatifler: AFL++ hem de kitapFuzzer Yerel kod için standart kapsama odaklı motorlardır. ÖSS-Fuzz Açık kaynak projeleri için bunları sürekli ve ücretsiz olarak yürütüyor ve tüysüz Ağ protokolü bulanıklaştırmasını kapsar PythonDaha kapsamlı bir liste, rehberde yer almaktadır. güvenlik test araçları.
Fuzz Testi En İyi Uygulamaları
Hedefe yöneltilip kendi haline bırakılan bir fuzzer nadiren bir şey bulur. Aşağıdaki uygulamalar, dosyalanmış hatalar üreten bir kampanyayı yalnızca işlemci zamanını tüketen bir kampanyadan ayırır.
- İyi bir başlangıç veri kümesiyle başlayın. Uygulamanın zaten kabul ettiği gerçek ve geçerli girdileri toplayın. Gerçek bir dosyayı değiştirmek, rastgele baytları değiştirmekten çok daha hızlı bir şekilde ayrıştırma koduna ulaşmanızı sağlar.
- Küçük ve hızlı bir koşum takımı yazın. Giriş noktası her çalıştırmada yalnızca bir işlem yapmalı, ağ çağrılarından ve disk yazma işlemlerinden kaçınmalı ve hızlı bir şekilde geri dönmelidir, çünkü verimlilik saniyedeki yürütme sayısı olarak ölçülür.
- Dezenfektanları çalıştırın. Sessiz bellek bozulması genellikle çökmeye neden olmaz. AddressSanitizer ve UndefinedBehaviorSanitizer ise bunu anında teşhis edilebilir bir hataya dönüştürür.
- Uzun süre ve aralıksız çalıştırın. Bir veya iki saatlik bir çalıştırma yüzeysel hataları yakalar; derin yolların tespiti genellikle saatler sürer, bu nedenle fuzzing işlemi manuel bir oturum yerine gece çalışan bir CI işine dahil edilmelidir.
- Her çökme olayını en aza indirin ve yinelenen kayıtları kaldırın. Başarısız olan girdiyi en küçük haline küçültün ve çökmeleri yığın bazında gruplandırın. tracAksi takdirde, tek bir hata yüzlerce bilet olarak karşımıza çıkar.
- Regresyon veri kümesini saklayın. Her bir hata tekrar eden girdiyi, her derlemede çalışan kalıcı bir kümeye ekleyin; böylece düzeltilen bir hata sessizce geri dönemez.
- Hedefi yasal olarak belirleyin. Yazılı izin olmadan çalışan bir üçüncü taraf hizmetine fuzzing uygulamak, bir saldırıdan ayırt edilemez.
Fuzz Testinin Avantajları
Gerçekçi beklentilerle kullanıldığında, fuzzing diğer tekniklerin yakalamakta zorlandığı bir değer katmaktadır.
- Fuzz testi, yazılım güvenlik testlerini iyileştirir.
- Fuzzing sırasında bulunan hatalar bazen ciddi boyutlardadır ve genellikle saldırganlar tarafından kullanılan hatalarla aynıdır; bunlar arasında çökmeler, bellek sızıntıları ve ele alınmayan istisnalar yer alır.
- Zaman ve kaynak kısıtlamaları nedeniyle test uzmanları tarafından fark edilemeyen hatalar varsa, bu hatalar bulanık test (fuzz testing) yöntemiyle de bulunur.
- Girdiler bir makine tarafından oluşturulduğu için, ek manuel çaba gerektirmeden kapsama alanı gece boyunca sürekli olarak genişliyor.
Fuzz Testinin Dezavantajları
Fuzzing işlemini ucuz kılan özellikler aynı zamanda kanıtlayabileceği şeyleri de sınırlandırıyor.
- Fuzz testi tek başına genel bir güvenlik tehdidinin veya hata kümesinin tam resmini veremez.
- Fuzz testi, bazı virüsler, solucanlar ve Truva atları gibi program çökmelerine neden olmayan güvenlik tehditleriyle başa çıkmada daha az etkilidir.
- Fuzz testi yalnızca nispeten basit hataları veya tehditleri tespit edebilir ve iş mantığı hakkında çıkarım yapamaz.
- Etkin bir şekilde çalışması için önemli miktarda makine zamanı gerektirir.
- Rastgele girdilerle sınır değer koşulu belirlemek oldukça sorunludur, ancak test uzmanları günümüzde bu sorunların çoğunu kullanıcı girdileriyle yönlendirilen deterministik algoritmalarla çözmektedir.
Fuzz Testi ve Sızma Testi Karşılaştırması
Her iki faaliyet de güvenlik açıklarını arar, ancak farklı sorulara cevap verirler ve nadiren birbirlerinin yerine kullanılabilirler.
| Kriterler | Tüy Testi | Penetrasyon testi |
| Tarafından yönlendirilen | Hatalı girdi üreten otomatik bir motor | Sistem hakkında akıl yürüten yetenekli bir test uzmanı. |
| Arayanlar | Çökmeler, donmalar ve bellek güvenliği hataları | Mantık ve yapılandırma hataları da dahil olmak üzere istismar edilebilir zayıf noktalar. |
| derinlik | Çok geniş girdi kapsamı, sığ mantık yürütme | Dar kapsamlı, derinlemesine akıl yürütme |
| Çıktı | Girişleri ve yığını yeniden üretme traces | İstismar yolları ve risk derecelendirmelerini içeren bir bulgu raporu. |
| En iyi an | Derleme hattında sürekli olarak | Periyodik olarak, bir serbest bırakma adayına karşı |
Pratikte ikisi birbirini besler: Fuzzing, ucuz ve otomatikleştirilebilir hataları ortadan kaldırır, böylece test uzmanının sınırlı zamanı yalnızca bir insanın tespit edebileceği kusurlara odaklanır.

