Fuzz Testi
- İngilizcesi
- Fuzz Testing
- Okunuşu
- faz testing
Kısaca
Fuzz testi, çökmeleri, takılmaları ve güvenlik açıklarını bulmak için bir programa çok sayıda beklenmedik ya da bozuk girdi veren otomatik bir tekniktir.
Fuzz testi nedir?
Fuzz testi ya da fuzzing, bir programa çok sayıda rastgele, beklenmedik ya da bozuk girdi yağdırır ve çökmeleri, takılmaları, bellek hatalarını ve diğer yanlış davranışları gözler. Fikir, Wisconsin Üniversitesi'nden Barton Miller'ın 1988'deki, rastgele girdinin birçok standart Unix aracını çökerttiği bir deneyine dayanır. Fuzzing, kimsenin test yazmayı düşünmediği hataları bulmakta özellikle iyidir.
Bir fuzzer tekrar tekrar bir girdi üretir, bunu genellikle bir dosya ayrıştırıcısı gibi tek bir fonksiyon olan fuzz hedefine verir ve sonucu kontrol eder. Modern coverage-guided (kapsam güdümlü) fuzzer'lar tohum derlemi (seed corpus) adı verilen birkaç örnek girdiyle başlar, bitleri çevirerek, bayt ekleyerek ya da dosyaları birleştirerek bunları mutasyona uğratır ve yeni kod yollarına ulaşan mutasyonları tutar; böylece zamanla daha derine iner. Çoğunlukla sanitizer'larla, yani arabellek taşması gibi bellek hatalarını oluştukları anda tespit eden araçlarla birleştirilirler ve çöken her girdi, geliştiriciler yeniden üretip regresyon testi olarak ekleyebilsin diye kaydedilir.
Fuzzing, rastgele sırayla her düğmeye basan bir yürümeye yeni başlayan çocuğa uzaktan kumanda vermek gibidir: er ya da geç tasarımcıların hiç düşünmediği bir kombinasyonu bulur. Dosya biçimi ve görüntü ayrıştırıcıları, ağ protokolü işleyicileri, derleyiciler, tarayıcılar ve işletim sistemi çekirdekleri gibi güvenliğe duyarlı kodlarda yaygın olarak kullanılır. Pek çok büyük açık kaynak proje fuzzer'ları sürekli çalıştırır ve fuzzing binlerce CVE ortaya çıkarmıştır.
Fuzz testi sıklıkla özellik tabanlı testle karıştırılır. İkisi de girdileri otomatik üretir, ancak fuzzing genellikle ham baytlar üzerinde saatlerce ya da günlerce çalışır ve esas olarak programın çöküp çökmediğini ya da yanlış davranıp davranmadığını sorar; özellik tabanlı test ise normal test takımında hızlı çalışır, yapılandırılmış değerler üretir ve belirli doğruluk kurallarını kontrol eder. Fuzzing ayrıca, bir sisteme sızmaya yönelik daha geniş ve insan güdümlü bir girişim olan sızma testinden (penetration testing) daha dardır.
Önemli noktalar
- Fuzzing, bir programa çok miktarda beklenmedik ya da bozuk girdi verir.
- Çökmeleri, takılmaları, bellek hatalarını ve güvenlik açıklarını arar.
- Coverage-guided fuzzer'lar yeni kod yollarına ulaşan girdileri evrimleştirir.
- Çöken her girdi bir regresyon testine dönüştürülmelidir.
- Dosyalar ve ağ mesajları gibi güvenilmeyen veriyi ayrıştıran kodu hedefler.
Örnek
package parser
import "testing"
// Run with: go test -fuzz=FuzzParseConfig
func FuzzParseConfig(f *testing.F) {
f.Add([]byte("name=app\nport=8080")) // seed input the fuzzer mutates
f.Fuzz(func(t *testing.T, data []byte) {
// Any input may be rejected with an error, but it must never crash
cfg, err := ParseConfig(data)
if err == nil && cfg == nil {
t.Errorf("no error and no config for input %q", data)
}
})
}Sık sorulan sorular
Fuzzing ile özellik tabanlı test arasındaki fark nedir?
Fuzzing genellikle ham ya da bozuk veri üzerinde uzun süre çalışır ve esas olarak çökmeleri ve güvenlik hatalarını arar. Özellik tabanlı test, yapılandırılmış girdilerle normal test takımının bir parçası olarak çalışır ve çıktıyla ilgili belirli kuralların geçerli olduğunu kontrol eder.
Coverage-guided fuzzing nedir?
Her girdinin hangi koda ulaştığını ölçen, yeni yollara ulaşan girdileri tutan ve bunları daha da mutasyona uğratan bir fuzzing stratejisidir. Bu, fuzzer'ın körü körüne tahmin yürütmek yerine karmaşık kodun derinliklerine ilerlemesini sağlar.
Fuzzing yalnızca güvenlik testi için midir?
Hayır. En çok güvenlik açıklarını bulmasıyla bilinir, ancak boş girdide çökme, sonsuz döngüler ve aynı davranması gereken iki uygulama arasındaki farklar gibi sıradan hataları da bulur.
İlgili sayfalar
- Özellik Tabanlı TestTest ve Kalite, s. 18Özellik tabanlı test, elle yazılmış birkaç örnek yerine otomatik üretilen çok sayıda girdi için bir kuralın geçerli olduğunu kontrol eder.
- Sızma TestiGüvenlik, s. 36Sızma testi, bir kuruluşun güvenlik açıklarını gerçek saldırganlardan önce bulup kapatması için bir sisteme yapılan izinli, simüle edilmiş saldırıdır.
- Girdi DoğrulamaGüvenlik, s. 11Girdi doğrulama, programa giren verinin kullanılmadan önce beklenen türde, biçimde ve aralıkta olup olmadığını kontrol etme ve gerisini reddetme pratiğidir.
- CVEGüvenlik, s. 6CVE, bilinen tek bir güvenlik zafiyetine verilen, CVE-2021-44228 gibi benzersiz ve herkese açık bir tanımlayıcıdır; herkes aynı açığa aynı adla başvurur.
- Mutasyon TestiTest ve Kalite, s. 17Mutasyon testi, koda küçük kasıtlı hatalar ekleyip testlerin her birini yakalayarak başarısız olup olmadığına bakarak bir test takımının kalitesini ölçer.
- Statik AnalizTest ve Kalite, s. 26Statik analiz, hataları, güvenlik açıklarını ve kalite sorunlarını erken bulmak için kaynak kodun çalıştırılmadan otomatik olarak incelenmesidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin