Analisi statica del codice sorgente
L'analisi statica di sicurezza è una metodologia utilizzata per esaminare il codice sorgente di un software senza eseguirlo, con l'obiettivo di identificare vulnerabilità e debolezze di sicurezza. Questa analisi viene tipicamente effettuata utilizzando strumenti automatici che scansionano il codice per rilevare pattern di codice pericolosi, errori di programmazione, e violazioni di best practice di sicurezza.
Le principali tecniche per eseguire l'analisi statica includono l'analisi sintattica per pattern noti che potrebbero portare a vulnerabilità (ad esempio di tipo buffer overflow oppure SQL injection), analisi del flusso di esecuzione o analisi delle librerie e delle dipendenze. Questi strumenti si possono estendere anche all'analisi di file di configurazione di Docker, script per Infrastructure as Code, e file di specifica per oggetti nel cloud, identificando i comuni errori di configurazione.
Una lista di strumenti utili all'analisi statica del codice sorgente può essere trovata su sito di owasp oppure sul sito del NIST.
Esempio di analisi statica
Prendiamo come esempio il seguente codice scritto in C++.
#include <iostream>
#include <cstring>
int f(int x) {
int buf[10];
memset(buf, 0, 10 * sizeof(int));
return buf[x];
}
int main() {
std::cout << f(42) << std::endl;
}
Questo codice prova a stampare l'elemento 42 di un array di soli 10 elementi. Proviamo ad analizzarlo con un tool di analisi statica per c++, ovvero cppcheck.
$ cppcheck --enable=all main.cpp
Checking main.cpp ...
main.cpp:7:12: error: Array 'buf[10]' accessed at index 42, which is out of bounds. [arrayIndexOutOfBounds]
return buf[x];
^
main.cpp:11:17: note: Calling function 'f', 1st argument '42' value is 42
std::cout << f(42) << std::endl;
^
main.cpp:7:12: note: Array index out of bounds
return buf[x];
Cppcheck ha identificato correttamente che stiamo accedendo all'array fuori dai bounds semplicemente analizzando il codice staticamente.
Pur essendo molto potenti, gli strumenti di analisi statica spesso utilizzano delle euristiche per identificare potenziali vulnerabilità nel codice, il che può portare alla generazione di alcuni falsi positivi e falsi negativi. Inoltre alcune vulnerabilità non possono essere identificate semplicemente analizzando staticamente il codice. Pertanto, sebbene possano essere utili per migliorare la sicurezza e la qualità del codice, non dovrebbero essere l'unica misura adottata e dovrebbero essere integrati con le altre tecniche di analisi e il testing manuale.