DistFuzz

From EIK wiki

Programm

Nimi on küll beta, sest mul on plaanis seda edasi arendada, kuid reaalselt on kõik sellele tasemele vajalik programmis olemas.

DistFuzz-Beta

Kirjeldus

Programmi näol on tegemist distributed fuzzeriga, ehk siis programmiga, mis on võimeline tegema valmistarkvara sisendite (antud juhul ainult failide) "rumalat" fuzzimist korraga mitme masina peal, olles samal ajal juhitav kesksest kohast. Programm koosneb kahest osast. Üheks on kliendi rakendused, mis töötavad mitmete masinate pealt ja saavad käsklusi kesksest kohast. Teiseks on serveri rakendus, mis juhib kliendi rakenduste tööd.

Eesmärk

Kuna fuzzimise abil turvavigade leidmisel on väga oluliseks testitavate sisendite hulk, siis on mõistlik teostada fuzzimist võimalikult paljude masinate peal üheaegselt. See muudab aga fuzzimise juhtimise, kontrollimise ja monitoorimise väga ebamugavaks. Antud programm peaks seda tegevust oluliselt lihtsustama, andes võimaluse fuzzimist juhtida ning tulemusi näha kesksest kohast. Programm peab võimaldama serveri kaudu testimise mahte automaatselt laiali jaotada ning leitud tulemid kokku korjata. Samuti peab programm võimaldama seadistada testimise parameetreid, korduste hulki ja muid omadusi.


Analüüs

Kuna tarkvara koosneb kahest osast, siis analüüsin rakenduse kliendi ja serveri poolt eraldi, sest kuigi nad on tükid samast tarkvarast, siis neil ühised osad praktiliselt puuduvad (v.a. andmevahetuse osa loomulikult).

Klient

Klient tarkvara on lihtne konsooli rakendus, mis käivitades vajab sisendina infot keskserveri kohta (IP aadress ja port). Selle alusel võtab klient peale käivitamist ühendust serveriga ja asub ootama käsklusi. Käsklused, mis temani jõuavad, koosnevad mitmest osast:

1) Info testitava programmi kohta (tema asukoht süsteemis, maksimaalne käivitusaeg, viis kuidas programmi kokku jooksmist tuvastatakse jne)

2) Info testimise moodulite kohta (esialgu on arvatavasti kõigest 1 moodul), mis sisaldab infot tehtavate muudatuste arvu ja kuju osas

3) Fail, mida asutakse muutma


Peale eelnevalt kirjeldatud info saamist, hakkab kliendirakendus valitud mooduli abil panema toime muudatusi serverilt saadud failis ning kasutama tulemuseks saadud faili testitava programmi vastu. Kui programm kokku jookseb, siis saadab kliendirakendus selle põhjustanud faili serverisse. Samuti teavitab rakendus pidevalt serverit sellest, kui kaugel ta testimisega on. Kui rakendus töö serverilt saadud andmetega lõptab, siis küsib ta serverilt uusi testandmeid.

Server

Serveri puhul on tegemist graafilise kasutajaliidesega varustatud rakendusega, mis saab kasutajalt järgnevad sisendid:

1) Info testitava programmi kohta (tema asukoht süsteemis, maksimaalne käivitusaeg, viis kuidas programmi kokku jooksmist tuvastatakse jne)

2) Info testimise moodulite kohta (esialgu on arvatavasti kõigest 1 moodul), mis sisaldab infot tehtavate muudatuste arvu ja kuju osas

3) Failide nimekiri mida kasutatakse testimiseks


Need saanud, asub server ootama kliente kes temaga ühenduksid. Peale ühenduse tekkimist saadab server kliendile punktides 1 ja 2 kirjeldatud andmed ning ühe failidest punktist 3 (igale kliendile eraldi faili). Peale seda hoiab server iga kliendiga ühendust üleval ning saab selle kaudu pidevat tagasisidet olukorrast. Kui mõni klient avastab faili mis põhjustab testitava programmi kokku jooksmist, siis võtab server vastu info selle kohta ja salvestab kokku jooksmise tekitanud faili enda süsteemi. Kui klient on töö ühe sisendfailiga lõpetanud, siis annab server talle uue faili kolmanda punkti nimekirjast (ühtegi faili ei anta mitu korda välja). Kui kõik sisendfailid on klientide poolt läbi käidud, siis kuvab server kasutajale raporti, kus toob välja tehtud testide hulga, aja ja avastatud kokku jooksmiste koguarvu ning seda põhjustanud failid. Samuti saab kasutaja kogu seda infot jälgida jooksvalt testimise ajal.


Funktsionaalsus mis peab olema

Kliendi osa

Kliendi rakendus peab olema võimeline jooksutama suvalisi rakendusi ning detekteerima nende crashe

Kliendi rakendus peab olema võimeline säilitama rakenduse crashi loonud olukorra ning selle taasloomiseks vajaliku info

Kliendi rakendus peab olema võimeline saama kõik enda tööks vajaliku info ja andmed serverist

Kliendi rakendus peab olema võimeline saatma testimise tulemid serverisse

Serveri osa

Server peab võimaldama kliendi rakenduste jälgimist

Server peab võimaldama kliendi rakendustele testimiseks vajaliku info edastamise

Server peab võimaldama kliendi rakenduste testide tulemuste säilitamist


Funktsionaalsus mis võiks olla

Kliendi osa

Erinevad crashide detekteerimise võimalused

Erinevad andmete fuzzimise meetodid

Serveri osa

Kliendite eraldi ja koos seadistamised

Klientide jaotamine ja grupeerimine

Testiplaani etteandmine failina


Võimalikud probleemid

Kõige suuremaid probleeme võib tekitada kliendi ja serveri vaheline suhtlus, mis peab edasi andma väga erinevat infot, alates suurtest failides ja lõpetades seadistus konfiguratsiooni ning monitooringuks vajaliku infoga.


Töö protsess

Kuna tegemist oli üksinda tehtud projektiga, siis väga palju rääkida ei ole töö jaotumise jms osas.

Probleeme üldiselt peale ajapuuduse ei olnud, kuid siiski võttis andmevahetuse sünkrooni saamine tiba aega ning siiani tekib mõningatel juhtudel probleeme, kus üks pooltest arvab, et objekt on edukalt teisele poole üle serialiseeritud, kuid teine pool pole seda sellisel kujul kätte saanud. See lõppeb socketi timeoutiga ning kuna selline olukord võib ka muudel juhtudel tekkida ning see ei mõjuta programmi toimimist (ühendus luuakse tagasi üles ja tööd jätkatakse õigelt kohalt), siis ei ole see praegusel juhul väga suur prioriteet.