Dumb Fuzzing
August 21, 2017Test verisi oluşturmak çoğu yazılımcı için kazananı olmayan bir savaş. Ne kadar test case oluşturursanız oluşturun yeterli gelmiyor. Hele bir de iş uygulaması yazıyorsanız işler içinden çıkılmaz bir hale geliyor. Düşünelim ki bir araç kiralama firması için uygun araçları listeleyen bir modül yazıyorsunuz ve firmanın iş kuralları yeterince karışık. Örnek vermek gerekirse 2 yaşından büyük araçlara 3 günden fazla süren kiralamalar için müsaitlik verme gibi bir kıstasınız var. Bu sınırlamalarınızın sayısı çok fazla ise her durum için ayrı ayrı testini yazmak durumundasınız. Her durum için göre poco, pojo, dto ları uygun değişkenler ile doldurmak anlamına geliyor. Hali hazırda çalıştığım uygulamadan bir screenshot paylaşayım.
Görevi sadece test verisi ve işbirlikçilerini(collaborator) oluşturmak olan init fonksiyonu sadece 307 satırcık. Kabaca 300 satır diyebiliriz. Bu noktada yardımınıza fuzzing koşuyor.
Fuzzing yanlış, bozulmuş, eksik veya özel karakterler içeren streamler ile sistemi penetre etmeye yarayan bir teknik. Amacı ise uygulamayı hata vermeye zorlamak. Genel olarak güvenlik amacı ile kullanılsa testcase oluşturmak için de kullanılıyor.Hatanın yakalandığı yerde buffer overflow gibi bir hata alınması durumunda code/ command injection a kadar giden bir süreç. Yukarıda bahsettiğim araç kiralama uygulaması uygunluk modulünü aşağıdaki gibi implement edelim.
|
|
Gerçek işi yapan kısmı çıkarınca yukarıdaki gibi bir kod parçası elde ediyoruz. Ortaya çıkabilecek runtime exceptionları simule etmek için tuhaf exceptionlar atıyor çok takılmayın. Gelelim fuzzer implementasyonumuza. Yapılan işlem ilgili veri tipleri için tamamen random veri atamak. Başlıkta dikkat ettiğiniz gibi tamamen aptal (Dumb) bir kutu.
|
|
Peki testimiz nasıl işliyor. Test altındaki servisimizin (SUT) exception atmasını beklemiyoruz. İnput olarak verilen bir query ye cevap olarak exception atması modulümüzde bir şeylerin doğru gitmediğini gösteriyor.
|
|
Testi 1000 defa çalıştırdığım durumda aldığım hatalar aşağıdaki gibi.
Begin = 28.08.2017 14:14:03, End = 13.01.2018 14:14:03, PowerType = NONE, Transmisson =NONE, Segment = NONE> Segment is mandatory in case of very complex scenario happened
Begin = 18.08.2017 14:14:03, End = 20.03.2018 14:14:03, PowerType = GASOLINE, Transmisson = AUTOMATIC, Segment = B > Special corner case or null pointer exception
Bunun içine genetik ve arama algoritmaları girmesi ile smart fuzzing adını alıyor. Sisteme random veri vermek yerine potansiyel hata durumlarına daha yakın veri üretip tüm processi sizin için daha kolay hale getiriyor.
Artıları
- Test etmeyi düşünmediğiniz durumları bulabilir.
- Bir kere çalışır duruma getirdiğinizde sizden bağımsız olarak çok fazla sayıda test çalıştırabilir.
Eksileri
- Kimi buglar gözden kaçabilir.
- Çok fazla bandwidth tüketir. Dolayısı ile ayrı dedike makinalarla, farklı subnetler üzerinde test etmek gerekebilir.
- Akıllı bir fuzzer implement etmek zor.
Dahası için
hidden
John von Neumann – The Man from the Future
Before I read The Man from the Future by Ananyo Bhattacharya, I only knew about John von Neumann in two contexts: that computers use the von Neumann architecture, and that he appeared in a story about a mathematical problem I … Continue reading →
via Henrik Warne's blogThe Review Is the Action Item
2024/05/30The Review Is the Action ItemI like to consider running an incident review to be its own action item. Other follow-ups emerging from it are a plus, but the point is to learn from incidents, and the review gives room for that to happen.This is no…
via Ferd.caHOWTO: Change your behavior
In theory, behavior change should be easy. At first glance, it seems like you control your behavior. So, if you desire different behavior, why doesn’t your behavior change as instantly as your desire to change it? In short, lasting change of habitual behavio…
via Matt Might's blog