Ano ang Fuzzing?

Ano ang malabo

Intro: Ano ang Fuzzing?

Noong 2014, ang mga hacker ng Tsino na-hack sa Community Health Systems, isang for-profit na US hospital chain, at nagnakaw ng 4.5 milyong data ng mga pasyente. Sinamantala ng mga hacker ang isang bug na tinatawag na Heartbleed na natuklasan sa OpenSSL cryptography library ilang buwan bago ang hack.

Ang Heartbleed ay isang halimbawa ng isang klase ng mga vector ng pag-atake na nagbibigay-daan sa mga umaatake na ma-access ang isang target sa pamamagitan ng pagpapadala ng mga maling pormang kahilingan na may sapat na bisa upang makapasa sa mga paunang pagsusuri. Habang ginagawa ng mga propesyonal na nagtatrabaho sa iba't ibang bahagi ng isang app ang lahat ng kanilang makakaya upang matiyak ang seguridad nito, imposibleng isipin ang lahat ng sulok na kaso na maaaring masira ang isang app o maging vulnerable sa panahon ng pag-develop.

Dito pumapasok ang 'fuzzing'.

Ano ang Fuzzing Attack?

Ang fuzzing, fuzz testing, o fuzzing attack, ay isang automated na software testing technique na ginagamit upang magpakain ng random, hindi inaasahang, o di-wastong data (tinatawag na fuzz) sa isang program. Ang program ay sinusubaybayan para sa hindi pangkaraniwang o hindi inaasahang pag-uugali tulad ng buffer overflows, pag-crash, memory leakage, thread hang, at read/write access na mga paglabag. Ang fuzzing tool o fuzzer ay pagkatapos ay ginagamit upang alisan ng takip ang sanhi ng hindi pangkaraniwang pag-uugali.

Nakabatay ang fuzzing sa pagpapalagay na ang lahat ng system ay naglalaman ng mga bug na naghihintay na matuklasan, at maaaring bigyan ng sapat na oras at mapagkukunan upang gawin ito. Karamihan sa mga system ay may napakahusay na mga parser o pagpigil sa pagpapatunay ng input cybercriminals mula sa pagsasamantala sa anumang hypothetical na mga bug sa isang programa. Gayunpaman, tulad ng nabanggit namin sa itaas, ang pagsakop sa lahat ng mga kaso ng sulok sa panahon ng pag-unlad ay mahirap.

Ginagamit ang mga fuzzer sa mga program na kumukuha ng structured input o may ilang uri ng hangganan ng tiwala. Halimbawa, ang isang program na tumatanggap ng mga PDF file ay magkakaroon ng ilang pagpapatunay upang matiyak na ang file ay may extension na .pdf at parser upang maproseso ang PDF file.

Ang isang epektibong fuzzer ay maaaring makabuo ng mga input na may sapat na bisa upang makalampas sa mga hangganang ito ngunit sapat na hindi wasto upang magdulot ng hindi inaasahang pag-uugali sa ibaba ng programa. Mahalaga ito dahil ang paglampas lang sa mga pagpapatunay ay hindi gaanong nangangahulugang kung wala nang karagdagang pinsalang idudulot.

Natuklasan ng mga fuzzer ang mga vector ng pag-atake na halos kapareho sa at kabilang ang mga tulad ng SQL injection, cross-site scripting, buffer overflow, at denial-of-service attacks. Ang lahat ng pag-atakeng ito ay resulta ng pagpapakain ng hindi inaasahang, di-wasto, o random na data sa isang system. 

 

Mga Uri ng Fuzzer

Ang mga fuzzer ay maaaring uriin batay sa ilang mga katangian:

  1. Mga target ng pag-atake
  2. Paraan ng paggawa ng fuzz
  3. Kamalayan ng istraktura ng input
  4. Kamalayan sa istraktura ng programa

1. Atake Target

Ang pag-uuri na ito ay batay sa uri ng platform na ginagamit ng fuzzer upang subukan. Ang mga fuzzer ay karaniwang ginagamit sa mga network protocol at software application. Ang bawat platform ay may partikular na uri ng input na natatanggap nito, at sa gayon ay nangangailangan ng iba't ibang uri ng mga fuzzer.

Halimbawa, kapag nakikitungo sa mga application, ang lahat ng malabong pagtatangka ay nangyayari sa iba't ibang channel ng input ng application, tulad ng user interface, command-line terminal, mga form/text input, at mga pag-upload ng file. Kaya lahat ng input na nabuo ng fuzzer ay kailangang tumugma sa mga channel na ito.

Ang mga fuzzer na nakikitungo sa mga protocol ng komunikasyon ay kailangang harapin ang mga packet. Ang mga fuzzer na nagta-target sa platform na ito ay maaaring makabuo ng mga pekeng packet, o maging mga proxy para baguhin ang mga na-intercept na packet at i-replay ang mga ito.

2. Paraan ng Paglikha ng Fuzz

Ang mga fuzzer ay maaari ding uriin batay sa kung paano sila gumagawa ng data upang malabo. Sa kasaysayan, ang mga fuzzer ay lumikha ng fuzz sa pamamagitan ng pagbuo ng random na data mula sa simula. Ganito ang ginawa ni Propesor Barton Miller, ang nagpasimula ng pamamaraang ito, sa simula. Ang ganitong uri ng fuzzer ay tinatawag na a fuzzer na nakabatay sa henerasyon.

Gayunpaman, habang ang isa ay maaaring makabuo ng data sa teorya na lalampas sa hangganan ng tiwala, kakailanganin ng malaking oras at mapagkukunan upang magawa ito. Samakatuwid, ang pamamaraang ito ay karaniwang ginagamit para sa mga sistema na may mga simpleng istruktura ng pag-input.

Ang isang solusyon sa problemang ito ay ang pag-mutate ng data na kilala na wasto upang makabuo ng data na may sapat na bisa upang makapasa sa hangganan ng tiwala, ngunit sapat na hindi wasto upang magdulot ng mga problema. Ang isang magandang halimbawa nito ay a DNS fuzzer na kumukuha ng domain name at pagkatapos ay bubuo ng malaking listahan ng mga domain name para makita ang mga potensyal na nakakahamak na domain na nagta-target sa may-ari ng tinukoy na domain.

Ang diskarte na ito ay mas matalino kaysa sa nauna at makabuluhang pinaliit ang mga posibleng permutasyon. Ang mga fuzzer na gumagamit ng paraang ito ay tinatawag mutation-based na mga fuzzer

May pangatlong mas kamakailang paraan na gumagamit ng mga genetic algorithm upang mag-converge sa pinakamainam na data ng fuzz na kailangan upang maalis ang mga kahinaan. Gumagana ito sa pamamagitan ng patuloy na pagpino sa fuzz data nito, na isinasaalang-alang ang pagganap ng bawat data ng pagsubok kapag ipinasok sa isang programa. 

Ang pinakamasamang gumaganap na hanay ng data ay aalisin sa data pool, habang ang pinakamahusay ay na-mutate at/o pinagsama-sama. Ang bagong henerasyon ng data ay pagkatapos ay gagamitin sa fuzz test muli. Ang mga fuzzer na ito ay tinutukoy bilang evolutionary mutation-based fuzzers.

3. Kamalayan Ng Input Structure

Ang pag-uuri na ito ay batay sa kung alam ng isang fuzzer at aktibong ginagamit ang istraktura ng input ng isang programa sa pagbuo ng data ng fuzz. A piping fuzzer (isang fuzzer na walang kamalayan sa istraktura ng pag-input ng isang programa) ay bumubuo ng fuzz sa isang random na paraan. Maaaring kabilang dito ang mga fuzzer na nakabatay sa generation at mutation. 


Kung ang fuzzer ay bibigyan ng input model ng isang program, ang fuzzer ay maaaring subukang bumuo o mag-mutate ng data upang tumugma ito sa ibinigay na input model. Ang diskarte na ito ay higit na binabawasan ang dami ng mga mapagkukunang ginugol sa pagbuo ng di-wastong data. Ang nasabing fuzzer ay tinatawag na a matalinong fuzzer.

4. Awareness Of Program Structure

Ang mga fuzzer ay maaari ding uriin batay sa kung alam nila ang mga panloob na paggana ng program na kanilang nililito, at ginagamit ang kamalayan na iyon upang tumulong sa pagbuo ng fuzz data. Kapag ginamit ang mga fuzzer upang subukan ang isang programa nang hindi nauunawaan ang panloob na istraktura nito, tinatawag itong black-box testing. 

Ang fuzz data na nabuo sa panahon ng black-box testing ay karaniwang random maliban kung ang fuzzer ay isang evolutionary mutation-based fuzzer, kung saan ito 'natututo' sa pamamagitan ng pagsubaybay sa epekto ng fuzzing nito at paggamit nito impormasyon upang pinuhin ang fuzz data set nito.

Ang white-box testing sa kabilang banda ay gumagamit ng isang modelo ng panloob na istraktura ng programa upang makabuo ng fuzz data. Ang diskarte na ito ay nagbibigay-daan sa isang fuzzer na makarating sa mga kritikal na lokasyon sa isang programa at subukan ito. 

Mga sikat na Fuzzing Tool

Mayroong maraming fuzzing mga kasangkapan sa labas na ginagamit ng mga pen tester. Ang ilan sa mga pinakasikat ay:

Mga Limitasyon ng Fuzzing

Bagama't ang Fuzzing ay isang talagang kapaki-pakinabang na pan-testing technique, ito ay walang mga pagkakamali. Ilan sa mga ito ay:

  • Medyo matagal tumakbo.
  • Ang mga pag-crash at iba pang hindi inaasahang pag-uugali na makikita sa black-box testing ng isang program ay maaaring maging mahirap, kung hindi imposibleng suriin o i-debug.
  • Ang paggawa ng mga template ng mutation para sa mga smart mutation-based na fuzzer ay maaaring magtagal. Minsan, maaaring hindi ito maging posible dahil sa pagmamay-ari o hindi alam ng modelo ng pag-input.

 

Gayunpaman, ito ay isang medyo kapaki-pakinabang at kinakailangang tool para sa sinumang gustong tumuklas ng mga bug bago ang masasamang tao.

Konklusyon

Ang fuzzing ay isang makapangyarihang pan-testing technique na maaaring magamit upang matuklasan ang mga kahinaan sa software. Mayroong maraming iba't ibang uri ng mga fuzzer, at ang mga bagong fuzzer ay ginagawa sa lahat ng oras. Habang ang fuzzing ay isang hindi kapani-paniwalang kapaki-pakinabang na tool, mayroon itong mga limitasyon. Halimbawa, ang mga fuzzer ay makakahanap lamang ng napakaraming kahinaan at maaari silang maging masinsinang mapagkukunan. Gayunpaman, kung gusto mong subukan ang kamangha-manghang pamamaraan na ito para sa iyong sarili, mayroon kaming a libreng DNS Fuzzer API na magagamit mo sa aming platform. 

Kaya ano pa ang hinihintay mo? 

Simulan ang fuzzing ngayon!