Ancora una volta torniamo a parlare di mod_security, un argomento che abbiamo affrontato in vari post apparsi su questo blog. Mod_security è un modulo per Apache che consente di aggiungere uno strato protettivo a livello applicazione. Mod_security è un application firewall che può però essere utilizzato con successo anche per mitigare gli attacchi di tipo slow HTTP, che recentemente sono balzati agli onori della cronaca dopo la vicenda Wikileaks con i molteplici attacchi DoS che hanno messo in ginocchio i siti web di Paypal e Visa. A differenza degli attacchi DoS di rete, caratterizzati da un modus operandi che ha come obiettivo quello di esaurire le risorse di banda di un server o di un intero data center, gli attacchi DoS HTTP sono diretti a mettere in ginocchio esclusivamente il web server. I prodotti più vulnerabili sono Apache e IIS.
Le modalità di attacco
Le tipologie di attacchi DoS HTTP più efficaci sono attualmente 2. L’attacco di tipo slow headers, che trova incarnazione nel tool slowloris e l’attacco di tipo slow request bodies. Entrambi sfruttano due vulnerabilità di Apache, non direttamente causate da errori di implementazione del codice ma dal modo in cui il demone si comporta di fronte a determinati tipi di richieste HTTP.
Slow headers
L’attacco slow headers consiste essenzialmente nell’invio di un numero molto elevato di richieste di connessione, a cui da parte del client non segue nessun invio di dati. Apache rimane in attesa di poter servire una richiesta, che però non arriverà mai. In questo modo è possibile portare il demone al collasso con l’invio di migliaia di richieste HTTP senza scambio di dati. Per chiarire il concetto possiamo fare un paragone reale. Paragonando Apache ad un centralino telefonico, un gruppo di individui può portare alla paralisi il PBX effettuando un determinato numero di telefonate. Alla risposta degli operatori, chi è dall’altro capo della cornetta può rimanere in silenzio, impegnando inutilmente l’operatore. Moltiplicando questa tecnica per 100, 1000, 10000 richieste, Apache può essere portato al collasso senza colpo ferire.
Slow request bodies
L’attacco di tipo slow request bodies consiste invece nell’invio di un determinato numero di richieste HTTP verso Apache. La procedura di scambio dati verrà inizialmente portata a termine con successo ma a questo punto il client potrà portare al collasso Apache inviando un certo numero di request body in modo estremamente lento, nell’ordine di 1 byte ogni 100 secondi. Considerando che la quantità massima di dati che Apache può gestire per il request body è di 2GB, è facile capire come può diventare facile saturare completamente il demone con poche richieste HTTP, condotte con estrema lentezza.
Installiamo mod_security su Debian
Dopo aver visto nel dettaglio quali sono le attuale minacce di tipo DoS che possono mettere in pericolo un’installazione di Apache, veniamo all’implementazione di mod_security su Debian Lenny. Le righe che seguono mostrano come sia possibile installare il modulo.Infine vedremo brevemente come tenere alla larga gli attacchi di tipo slow HTTP con mod_security e Apache.
Per il corretto funzionamento di mod_security è necessario abilitare il modulo unique_id su Apache. Oltre a questo avremo bisogno di installare alcuni componenti e librerie aggiuntive :
# a2enmod unique_id
# apt-get install -y apache2-prefork-dev make libaprutil1 libapr1-dev libpcre3-dev libxml2-dev liblua5.1-0-dev libcurl4-openssl-dev
Preleviamo mod_security, giunto alla versione 2.5.13 :
# cd /usr/src
# wget http://www.modsecurity.org/download/modsecurity-apache_2.5.13.tar.gz
# tar zxf modsecurity-apache_2.5.13.tar.gz
Dopo aver estratto l’archivio spostiamoci nella relativa directory :
# cd modsecurity-apache_2.5.13/apache2/
Compiliamo ed installiamo mod_security :
# ./configure --with-apxs=/usr/bin/apxs2
# make
# make test
# make install
Completiamo la configurazione :
# echo "LoadFile /usr/lib/libxml2.so" > /etc/apache2/mods-available/mod_security2.load
# echo "LoadFile /usr/lib/liblua5.1.so" >> /etc/apache2/mods-available/mod_security2.load
# echo "LoadModule security2_module /usr/lib/apache2/modules/mod_security2.so" >> \ /etc/apache2/mods-available/mod_security2.load
# cat modsecurity.conf-minimal > /etc/apache2/mods-available/mod_security2.conf
# vim /etc/apache2/mods-available/mod_security2.conf SecDebugLog /var/log/apache2/modsec_debug.log SecAuditLog /var/log/apache2/modsec_audit.log
# mv modsecurity_crs_10_config.conf.example modsecurity_crs_10_config.conf
# cp -r rules/base_rules/ rules/modsecurity_crs_10_config.conf /etc/apache2/mods-available/
Abilitiamo infine mod_security :
# a2enmod mod_security2
e riavviamo Apache :
# /etc/init.d/apache2 restart
La difesa
Per difenderci dagli attacchi che abbiamo descritto, mod_security mette a disposizione alcune opzioni.
La direttiva SecReadStateLimit consente di arginare gli attacchi di tipo slow headers limitando il numero di connessioni di tipo busy state che Apache può servire. In parole povere è possibile limitare il numero di richieste in attesa di essere servite che ogni client può aprire.
A partire dal branch 2.2 Apache mette a disposizione un modulo sperimentale, mod_reqtimeout, che permette di specificare la direttiva RequestReadTimeout. Con questa opzione è possibile controllare il valore di timeout da impostare per la lettura delle richieste HTTP. Affiancando a questa nuova funzionalità di Apache una o più regole in mod_security è possibile bloccare i client che impieghino troppo tempo per inviare i request body, proteggendo così il web server dagli attacchi di tipo slow request body.
Gli attacchi slow HTTP DoS sono stati descritti da Wong Onn Chee e da Tom Brennan, dello staff di OWASP. I metodi di difesa basati su mod_security sono frutto del lavoro del team SpiderLabs.
Articolo a cura dello staff di servermanaged.it
