Fuzzing 101 Temelleri
(github.com/antonio-morales)- Fuzzing-101, fuzzing’i ilk kez öğrenen kişilerin gerçek yazılım hedeflerinde güvenlik açıkları bulma sürecini pratik etmesi için hazırlanmış bir kurstur
- Kurs 10 gerçek hedef ve 10 alıştırmadan oluşur; Xpdf, libexif, TCPdump, LibTIFF, Libxml2, GIMP, VLC media player, Adobe Reader, 7-Zip ve Google Chrome/V8’i kapsar
- Her alıştırma bir CVE’yi yeniden üretmeyi veya keşfetmeyi hedefler; CVE-2019-13288, CVE-2016-2334, CVE-2019-5847 gibi güvenlik açıklarıyla birlikte AFL++, ASan, LCOV, WinAFL, Fuzzilli vb. kullanılır
- Katılım şartı internete bağlı bir Linux sistemidir; temel Linux kullanım becerisi önerilir ve tüm alıştırmalar Ubuntu 20.04.2 LTS üzerinde test edilmiştir
- Fuzzing, bir programa rastgele veya değiştirilmiş girdiler verip istisnaları ya da çökmeleri izleyen otomatik bir test tekniğidir; bu kurs, kapsam güdümlü evrimsel fuzzer’ların temel çalışma mantığını öğrenme konusu yapar
Kursun amacı ve hedef kitlesi
- Fuzzing-101, fuzzing’i uzman gibi öğrenmek isteyen ama nereden başlayacağını bilmeyen kişiler için hazırlanmış bir kurstur
- Kurs 10 gerçek hedef ve 10 alıştırmadan oluşur
- Hedef okuyucu kitlesi şunlardır
- Fuzzing temellerini öğrenmek isteyenler
- Gerçek yazılım projelerinde güvenlik açığı bulma yöntemini öğrenmek isteyenler
Alıştırma yapısı
- Her alıştırma belirli bir yazılımı, bulunacak CVE’yi, tahmini süreyi ve ana konuları birlikte sunar
| Alıştırma | Hedef | Bulunacak CVE | Tahmini süre | Ana konular |
|---|---|---|---|---|
| Exercise 1 | Xpdf | CVE-2019-13288 | 120 dakika | Afl-clang-fast, Afl-fuzz, GDB |
| Exercise 2 | libexif | CVE-2009-3895, CVE-2012-2836 | 6 saat | Afl-clang-lto, kütüphane fuzzing’i, Eclipse IDE |
| Exercise 3 | TCPdump | CVE-2017-13028 | 4 saat | ASan, Sanitizers |
| Exercise 4 | LibTIFF | CVE-2016-9297 | 3 saat | Kod kapsamı, LCOV |
| Exercise 5 | Libxml2 | CVE-2017-9048 | 3 saat | Sözlükler, temel paralelleştirme, komut satırı argümanı fuzzing’i |
| Exercise 6 | GIMP | CVE-2016-4994, bonus hata | 7 saat | Sürekli fuzzing, etkileşimli uygulama fuzzing’i |
| Exercise 7 | VLC media player | CVE-2019-14776 | 6 saat | Kısmi enstrümantasyon, fuzzing harness’i |
| Exercise 8 | Adobe Reader | Yok | 8 saat | Kapalı kaynak uygulama fuzzing’i, QEMU enstrümantasyonu |
| Exercise 9 | 7-Zip | CVE-2016-2334 | 8 saat | WinAFL, Windows uygulaması fuzzing’i |
| Exercise 10 | Google Chrome / V8 | CVE-2019-5847 | 8 saat | Fuzzilli, JavaScript motoru fuzzing’i |
Çalıştırma ortamı ve araçlar
- Gereken tek şey internet bağlantısı olan bir Linux sistemidir
- Alıştırmalarda kullanılabilecek bir VMware imajı sağlanır
- Temel Linux kullanım becerisi kuvvetle önerilir
- Tüm alıştırmalar Ubuntu 20.04.2 LTS üzerinde test edilmiştir
- Kursta AFL++ kullanılır
- AFL++, Michał “lcamtuf” Zalewski’nin AFL’inden ayrılmış daha yeni ve daha iyi bir fork olarak tanıtılır
Fuzzing’in temel kavramı
- Fuzz testi (fuzz testing) veya fuzzing, bir programa rastgele ya da değiştirilmiş girdiler verip istisnaları veya çökmeleri izleyen otomatik bir yazılım test tekniğidir
- Gerçek uygulamalardaki başarılı fuzzer örnekleri olarak AFL, libFuzzer, HonggFuzz gösterilir
- Bu üç aracın tamamı kapsam güdümlü evrimsel fuzzer örnekleridir
Kapsam güdümlü evrimsel fuzzer
- Evrimsel (evolutionary) yaklaşım, evrimsel algoritmalardan ilham alan meta-sezgisel bir yöntemdir
- Seed (seeds) adı verilen başlangıç girdi kümesini zaman içinde evrimleştirir ve değiştirir
- Seçim ölçütüne örnek olarak kapsam kullanılır
- Kapsam güdümlü (coverage-guided) fuzzer, yeni çökme bulma olasılığını artırmak için her girdi için kod kapsamı verilerini toplar ve karşılaştırır
- Kapsam toplama genellikle enstrümantasyon (instrumentation) yoluyla yapılır
- Yeni yürütme yollarına götüren girdileri seçer
Değişiklik geçmişi
- 2022-02-14: Exercise 5’teki bazı
wgetyazım hataları düzeltildi - 2021-11-25: Exercise 3 bazı düzeltmelerle güncellendi
1 yorum
Hacker News görüşleri
Fuzzing’le ilgili bir anekdot: https://threadreaderapp.com/thread/1799457232607985698
11 dakikanızı boşa harcamak istiyorsanız harika bir okuma
Başka şirketlerin ürünlerinde hata bulmak için yarışıp sonra da gidip Microsoft Publisher’da bir tane bulunca böbürlenerek Microsoft’u aşağılayan kültürü pek anlayamıyorum
Kendi ürünümüzü test etmek için bütün hafta boyunca sabahlayan bir şirketimiz varsa, belki de hepimiz şanslıyızdır
Yazara bakınca IRC’den tanıdığım biri olabilir gibi geliyor; “Mantis” ve “infosec” tam oturuyor
İlginç olan, bunun Go’nun yaklaşımından belirgin biçimde farklı olması
Go’da fuzzing’i test çalıştırır gibi kolayca çalıştırabiliyorsunuz; bu yüzden bir uygulamanın ya da kütüphanenin belirli bölümlerini hedeflemek çok kolay
Bu yüzden bu tür tekniklerin önemli bir kısmı gereksiz hale geliyor
Fuzzing’i daha iyi yönlendiren teknikleri merak ediyorum ama şu an için en iyi yöntem seed corpus verip iyi sonuç çıkmasını ummak gibi görünüyor
Heartbleed’in listede olmamasına şaşırdım. Yeniden üretmesi çok kolay