Negli ultimi anni l'industria della sicurezza sta cambiando approccio rispetto alla percezione e alla risoluzione dei problemi di sicurezza nelle infrastrutture informatiche. Sino a qualche anno fa, le risorse dei dipartimenti preposti alla messa in sicurezza degli impianti venivano utilizzate per quello che viene spesso definito con il termine network security; oggi la situazione è molto diversa e quello che viene richiesto è spesso di garantire sicurezza a livello applicativo. Questa richiesta del mercato ha generato un interesse crescente verso aziende, centri di ricerca e comunità della rete che si occupano di software security; in maniera proporzionale sono apparse nuove tecnologie, nuove metodologie di test e nuovi strumenti software per fronteggiare questa necessità.
Il problema della ricerca di vulnerabilità nelle web application è un problema complesso ed eterogeneo, che comporta lo studio e l'analisi di diversi aspetti architetturali delle applicazioni.
Per la scelta degli strumenti automatici da adoperare è necessario, in primo luogo, identificare le tecnologie utilizzate e scegliere i tool più adatti al contesto applicativo; spesso però ci sono anche aspetti che si allontanano dalle considerazioni puramente tecniche come la disponibilità o meno del codice sorgente, l'assoluta necessità di testare il software sull'ambiente finale di deploy, di effettuare la revisione in diverse fasi del processo produttivo dell'applicativo stesso e così via. Le considerazioni appena fatte sono uno dei principali motivi per cui spesso non risulta possibile utilizzare un singolo prodotto per evidenziare tutte le tipologie di problematiche presenti in un software online.
Parlando di strumenti per l'analisi e la scansione di web application è inevitabile dover introdurre le diverse metodologie di analisi usate dagli strumenti software.
Analisi del codice sorgente
Si parla di analizzatori di codice sorgente quando lo strumento utilizza all'interno del processo di analisi il codice sorgente dell'applicazione.
Gli strumenti appartenenti a questa categoria (revisione statica) si basano principalmente sulla ricerca di pattern all'interno del codice sorgente al fine di identificare modelli di programmazione errati, che possono quindi introdurre problematiche di sicurezza. Nei casi più semplici questi software ricercano sistematicamente ogni occorrenza di funzioni potenzialmente pericolose al fine di segnalare al tester tutti quei casi di potenziale pericolo; è intuibile come questi software sono spesso inutilizzabili durante il testing di grosse applicazioni poiché la generazione di falsi positivi è troppo elevata.
Molti degli strumenti avanzati cercano di ridurre significativamente il numero dei falsi positivi attraverso l'analisi del flusso di dati all'interno del codice (dataflow analysis).
A differenza dei precedenti, gli analizzatori che effettuano revisione dinamica attuano un'analisi in profondità nel codice sorgente cercando di ricostruire lo stack delle chiamate a runtime, determinando se la specifica invocazione viene effettivamente raggiunta dai dati ricevuti in ingresso; alcuni strumenti evoluti si integrano perfettamente con i debugger e permettono di tracciare e segnalare gli errori nel momento in cui effettivamente si verificano. Il principale problema di questa classe di strumenti è legato alla lentezza della scansione e alla necessità di fornire un set significativo di dati in ingresso.
In generale gli analizzatori di codice sorgente, sia statici sia dinamici, risultano degli strumenti estremamente interessanti in quanto possono essere utilizzati sin dai primi momenti dello sviluppo del software, riducendo notevolmente i costi del processo produttivo legati alla correzione delle vulnerabilità.
Black-Box scanner
Con il termine black-box scanner identifichiamo invece quegli scanner per applicazioni web che simulano la normale interazione tra web browser e server remoto cercando componenti con vulnerabilità note oppure effettuando l'invio di payload ritenuti potenzialmente pericolosi.
L'efficacia di questi strumenti è ovviamente legata alla base di conoscenza: più questa risulta aggiornata e personalizzata, migliori saranno i risultati. Generalmente questi software sono molto semplici da utilizzare poiché non richiedono nessuna interazione da parte dell'utente. L'attendibilità dei report finali dipende notevolmente dal genere di applicazione che si sta testando: mentre i siti web statici sono facilmente analizzabili dagli spider usati all'interno di questi tool, non si può dire lo stesso per le applicazioni che fanno largo uso di JavaScript, Ajax, Flash, form di autenticazione e percorsi di navigazione che richiedono una costante interazione con l'utente. Purtroppo, per la natura stessa dell'analisi, è impossibile identificare precisamente dove effettivamente risiedono gli errori segnalati, lasciando agli sviluppatori l'ingrato compito di scovare tali bug all'interno del codice.
Altri strumenti
Oltre alle categorie segnalate esistono certamente altre tipologie di strumenti: gli strumenti di analisi su (dati) binari cercano di scovare falle di sicurezza all'interno di applicativi binari prevalentemente in C e C++; i database scanner replicano l'interazione tra client e server SQL in maniera da poter inviare delle query per testare la configurazione dei DBMS (procedure, utenti, ruoli, privilegi) oltre ad effettuare l'invio di classiche stringhe riconducibili a potenziali attacchi di SQL Injection; i configuration scanner operano dei test sulle configurazioni di web application e web server per segnalare configurazioni erronee o impostazioni di default pericolose.
Una prova sul campo
Dopo aver introdotto le diverse categorie di strumenti per il testing di applicativi web vediamo, attraverso una prova sul campo, due software che utilizzano paradigmi diversi.
Un analizzatore di codice sorgente in prova: OWASP Lapse
LAPSE è l'acronimo di Lightweight Analysis for Program Security in Eclipse.
È uno strumento software gratuito e con licenza GPL portato avanti dalla comunità di OWASP. Questo strumento per il testing è stato sviluppato con l'obiettivo di creare un software di supporto agli sviluppatori, poiché perfettamente integrato all'interno del noto ambiente di sviluppo Eclipse.
Lo sviluppo e la verifica costante dei requisiti di sicurezza all'interno di applicazioni J2EE può essere facilmente svolta attraverso pochi click; certamente il tester deve avere una buona conoscenza dell'argomento ma il suo lavoro di ricerca delle vulnerabilità è reso più efficiente grazie all'utilizzo congiunto di questo tool e della propria esperienza. LAPSE si focalizza sulla ricerca dei punti in ingresso delle variabili (source), dei metodi potenzialmente pericolosi (sink), cercando di determinare se esistono dei percorsi validi tra source e sink.
Una volta scaricato il software, per l'installazione è solamente necessario copiare la directory contenuta nel file zip all'interno della cartella plugins dell'ambiente di sviluppo Eclipse, che deve quindi essere opportunamente installato. Questo plugin di Eclipse è compatibile con la versione 3.2 e richiede la presenza di Java 1.5.
Per verificare la corretta installazione possiamo avviare l'ambiente di sviluppo e verificare all'interno del menù Window / Show View / Other la presenza della voce "LAPSE:Static Analysis for Security" come mostrato in figura 1.
Il plugin è formato da tre differenti viste chiamate rispettivamente:
- Provenance Tracker
- Vulnerability Sinks
- Vulnerability Sources
Per iniziare ad utilizzare il plugin è necessario selezionare entrambe le viste.
All'interno di Eclipse è quindi necessario aprire tutti i progetti Java che vogliamo analizzare alla ricerca di vulnerabilità; questi progetti all'interno del workspace devono essere correttamente configurati e compilabili. Per il nostro esempio utilizzeremo tuttavia un progetto di prova sviluppato in seno all'OWASP. Il suo nome è WebGoat e lo vedremo in dettaglio nella prossima parte dell'articolo.
Nella prima parte di questo articolo abbiamo introdotto le tecniche di test di un'applicazione Web e abbiamo anche configurato LAPSE, uno strumento per testare applicazioni Web distributo come plugin del noto ambiente di sviluppo Eclipse. Nelle pagine che seguono metteremo alla prova pratica questo programma.
Per il nostro test utilizzeremo un software campione sviluppato sempre da OWASP. WebGoat, questo il suo nome, è un'applicazione J2EE nata con l'obiettivo di illustrare le più comuni vulnerabilità presenti in ambito web; per fare un esempio di una tipica lezione possiamo citare quella relativa alle tecniche di SQL Injection, in cui è presente un form web utilizzato per la verifica dei numeri delle carte di credito; l'utente, nei panni dell'aggressore, deve riuscire a forgiare opportune richieste per rubare tali dati.
Le vulnerabilità presenti in questo software sono state inserite volontariamente dagli sviluppatori: per questa ragione possiamo pensare di utilizzarlo come security benchmark in maniera da valutare, su di un esempio comune, gli strumenti di auditing.
Avviamo Eclipse e creiamo quindi un nuovo progetto di tipo J2EE attraverso il menu File / New / Project / Java Project. Importiamo poi i file del progetto attraverso il menu File / Import / File System. Una volta che il progetto sotto analisi è presente all'interno del workspace dell'ambiente di sviluppo l'unica operazione che dobbiamo effettuare è quella di premere il piccolo pulsante rosso presente nella visuale Vulnerability Sources. Questa semplice azione avvia la ricerca di vulnerabilità nel codice sorgente ed evidenzia i punti di ingresso insicuri presenti all'interno del software sotto esame. Nella schermata (presentata nella figura 2) è possibile infatti vedere tutti quei parametri in ingresso che non sono stati opportunamente validati dallo sviluppatore.
Allo stesso modo, cliccando sul pulsante rosso, presente nella scheda Vulnerability Sinks, è possibile visualizzare tutti i metodi pericolosi che potrebbero essere invocati usando parametri insicuri a causa della scarsa validazione dei punti visti precedentemente.
Infine partendo proprio da ogni singolo metodo pericoloso, cliccando con il tasto destro e selezionando l'opzione Perform backward propagation from this sink, è possibile visualizzare l'elenco delle chiamate Java a partire dal metodo pericoloso sino al parametro in ingresso (path sink-source). Quest'ultima informazione è decisamente utile agli sviluppatori poiché possono rendersi conto in maniera molto intuitiva di come vengono inizializzati e modificati i parametri utilizzati per l'invocazione del metodo pericoloso.
Come è stato brevemente mostrato LAPSE rappresenta uno strumento software molto semplice da usare grazie all'integrazione completa con l'ambiente di sviluppo Eclipse e all'estrema compattezza dell'interfaccia utente. D'altra parte è da segnalare come l'analisi effettuata da questo, ed in generale da strumenti automatici, non può sostituire il lavoro di revisione manuale che risulta indubbiamente più accurato e con un tasso minore di falsi positivi e falsi negativi.
Un black-box scanner: Acunetix Web Vulnerability Scanner
Acunetix Web Vulnerability Scanner è un classico esempio di black-box scanner poiché effettua la ricerca di vulnerabilità attraverso l'invio di payload ritenuti pericolosi, valutando le risposte dell'applicazione, al fine di determinare o meno la presenza di vulnerabilità. La capacità di riconoscimento delle vulnerabilità è piuttosto ampia: dai classici problemi di SQL Injection, code execution, path traversal, CRLF injection sino alle classiche problematiche di mal configurazione.
L'installazione di questo strumento software, disponibile unicamente per i sistemi Windows, è assolutamente semplice trattandosi di una normale procedura guidata di installazione.
Una volta terminata questa fase iniziale possiamo avviare l'applicazione. Già dai primi momenti ci si accorge della facilità di utilizzo di questo strumento: attraverso un comodo Scan wizard presente nel menu File / New / Scan è possibile impostare tutte le opzioni per la scansione black-box. Nella versione di prova possiamo effettuare la scansione solamente verso alcuni server della stessa Acunetix; sebbene in questo modo risulti difficile individuare i problemi e le limitazioni intrinseche dello strumento, è sicuramente un buon modo per provare tutte le funzionalità.
Come mostrato in figura 5, selezioniamo quindi il server di test relativo ad un'applicazione PHP. In questa fase è possibile eliminare alcune tipologie di test nel caso queste siano superflue per la specifica web application che stiamo provando; selezioneremo quindi solamente i test relativi alle tecnologie realmente utilizzate.
A questo punto possiamo decidere le modalità di scansione ed il grado di completezza che desideriamo: si consiglia di utilizzare il profilo denominato default poiché determina una scansione completa mantenendo comunque un rapporto velocità del test/qualità dei risultati accettabile.
Poiché spesso le applicazioni web prevedono dei flussi di navigazione prefissati, oltre a sezioni che richiedono l'autenticazione attiva dell'utente, Acunetix Web Vulnerability Scanner cerca di superare questa tipica difficoltà degli strumenti di scansione automatici in maniera decisamente efficace. Nella finestra mostrata in figura 7 è possibile impostare l'account nel caso di autenticazione HTTP (Basic o NTLM) ma anche nel caso di login applicativi (i classici form web con username e password); per quest'ultimo meccanismo di autenticazione lo strumento permette di "registrare" una navigazione manuale dell'utente, che verrà ripetuta automaticamente durante i successivi test. In questo modo, lo strumento possiede tutte le informazioni per accedere in maniera automatizzata attraverso tutte le sezioni dell'applicazione web.
Avendo terminato la fase di setup è unicamente necessario cliccare sul pulsante Finish per avviare la scansione. Dopo un po' di tempo (112 minuti, per la precisione) e dopo oltre 9400 richieste HTTP è possibile visionare i risultati del test: 316 vulnerabilità scoperte.
I risultati sono riportati in maniera molto chiara ed è facile, anche per l'utente inesperto, capire lo stato "di salute" della propria applicazione online.
Un comodo indicatore colorato fornisce un riassunto generale dell'analisi, presentando il numero di vulnerabilità divise in base alla gravità. Un albero della struttura del sito e delle vulnerabilità evidenziate permette poi di visionare singolarmente ogni test effettuato.
Le vulnerabilità riscontrate in questo caso di test spaziano dal Cross Site Scripting (XSS), Sql Injection sino alla segnalazione di vecchie versioni del web server Apache e dell'interprete PHP.
Da segnalare sicuramente la comoda funzionalità per l'aggiornamento della base di conoscenza dello strumento stesso, in maniera da rimanere al passo con le ultime vulnerabilità scoperte e le più recenti tecniche di attacco.
Tutte le firme delle vulnerabilità sono completamente consultabili; l'utente curioso può quindi facilmente capire che tipo di richieste vengono effettuate e quali risposte si attendono nel caso di pagine vulnerabili.
Sebbene lo strumento risulti facilmente utilizzabile e sia dotato di buone funzionalità di reportistica è giusto ricordare che spesso la semplicità di utilizzo comporta risultati non sempre soddisfacenti. Nel panorama degli strumenti software per l'analisi di sicurezza rappresenta comunque un buon candidato da prendere in considerazione e da affiancare a sessioni di auditing manuale svolto da personale competente.