Table of Contents

9. Utilitare de analiză de cod

Pentru a preveni existența bug-urilor și a vulnerabilităților, un dezvoltator va urmări cu atenție codul scris de sine sau de alții (auditare de cod). Pentru a facilita acest proces, există utilitare specifice care să automatizeze analiza codului și să raporteze posibile probleme. Pot fi utilitare de analiză statică (pe cod) sau de analiză dinamică (ce presupun rularea unui proces). Este important integrarea acestor utilitare în procesul de dezvoltare și testare software (Software Development Lifecycle).

Subiecte abordate

Resurse

Alte resurse

Exerciții

Arhiva de suport pentru exerciții se găsește aici. Descărcați arhiva și apoi decomprimați-o folosind comenzile:

wget http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/09-utilitare-de-analiza-cod-skel.zip
unzip 09-utilitare-de-analiza-cod-skel.zip
cd 09-utilitare-de-analiza-cod-skel/

Pentru a instala aplicațiile necesare pentru investigarea programelor folosiți comanda

sudo apt install clang cppcheck splint valgrind

Auditare cod

Accesăm directorul hidden-bugs/ din arhiva de suport.

Fișierul cod sursă hidden-bugs.c conține 8 erori de programare. Identificați-le parcurgând manual codul (code audit). Lucrați în echipe de 2-3 persoane.

După aceasta folosiți utilitarele cppcheck, splint și scan-build pentru a verifica static prezența erorilor.

Moduri uzuale de rulare:

cppcheck --enable=all hidden-bugs.c
splint hidden-bugs.c
scan-build make

Ignorați erori legate de fișiere incluse în rezultatul rulării comenzii cppcheck.

Foarte probabil veți vedea că utilitarele nu depistează multe erori. Multe erori nu pot fi depistate cu utilitare de analiză, ci mai degrabă de un observator uman.

Verificare cod anterior

Folosiți utilitarele cppcheck, scan-build și splint pentru a verifica fișierele ce conțin buffer overflow-uri din sesiunea 06.

Verificare cod proiect

Accesăm directorul picpic/ din arhiva de suport.

Verificați codul sursă din cadrul directorului folosind utilitarele cppcheck, splint și scan-build.

Valgrind

Accesăm directorul valgrind/ din arhiva de suport.

Urmăriți codul din fișierul cod sursă vuln.c și rulați executabilul vuln. Executabilul primește ca argument un număr care se asociează cu o anumită funcție din program ce va fi executată. Rulați programul sub Valgrind în forma:

valgrind ./vuln 1

Vedeți rezultatul afișat de Valgrind și validați depistarea erorilor de folosire a memoriei.

Fuzzing

Clonați repository-ul de aici folosind comanda

git clone https://github.com/ThalesIgnite/afl-training

Apoi urmăriți indicațiile de aici pentru a face fuzzing pe executabilul vulnerable.

Compilarea fuzzer-ului AFL va dura.

Symbolic Execution

Urmăriți indicațiile de aici pentru instalarea Angr.

Pe versiunea de Ubuntu din sistemele din sala PR708 nu funcționează comanda mkvirtualenv. Folosiți următoarele două comenzi pentru a crea un mediu virtual în care să instalați și rulați angr:

virtualenv angr
cd angr
source ./bin/activate

Acum puteți install angr folosind comanda pip așa cum e indicat în documentație.

Dacă doriți să părăsiți mediul virtualenv folosiți comanda

deactivate

Clonați repository-ul de exemple Angr de aici folosind coamnda

git clone https://github.com/angr/angr-doc

În urma comenzii de mai sus se creează directorul angr-doc/.

Testați exemplul din angr-doc/examples/strcpy_find din exemplu descris și aici prin rularea comenzii:

python solve.py

Scriptul Python va “exploata” executabilul strcpy_find folosind execuție simbolică și va obține parola cerută. Parcurgeți scriptul solve.py pentru o primă perspectivă asupra Angr. Nu e nevoie să înțelegeți, doar să știți că există.