Che cos'è la vulnerabilità di bash CVE-2014-6271 (Shellshock) e come risolverlo?

140

Recentemente, ci sono state notizie riguardanti "CVE-2014-6271" (Vedi USN-2362- 1 ), che è una vulnerabilità in Bash. Come faccio a sapere se sono interessato da questo, come posso ripararlo e perché dovrei preoccuparmi?

Questo è stato progettato come risposta canonica per questa vulnerabilità, a causa della sua portata e gravità.

    
posta hexafraction 24.09.2014 - 23:48

5 risposte

127

Che cos'è Bash?

Bash è la shell interattiva predefinita in Ubuntu. Quando si interfaccia il terminale (tramite l'emulatore di terminale, su un tty o ssh), si stanno generalmente digitando comandi che bash leggerà ed eseguirà. Anche se non usi affatto il terminale, hai ancora Bash.

Su Ubuntu, /bin/sh non è bash (è un trattino). Questa vulnerabilità riguarda solo bash.

Come mi influenza l'exploit?

Bash e il sistema operativo tengono traccia di un insieme di variabili di ambiente che descrivono l'utente corrente connesso, dove cercare i programmi sul disco rigido e altre funzioni simili. Creando una variabile di ambiente con una struttura specifica, un utente malintenzionato potrebbe essere in grado di eseguire il codice al successivo avvio di Bash.

L'utente malintenzionato può impostare la variabile di ambiente in più modi:

  • Connessione remota a un servizio come SSH con una configurazione specifica come git su ssh. Come avverte Mitre, l'uso dell'opzione sshd ForceCommand è un vettore di attacco. Gli account la cui shell non è bash non sono interessati.
  • Trucchi per l'impostazione della variabile di ambiente.
  • Causando un altro programma per impostare una variabile di ambiente in modo da avere quel valore creato. Ad esempio, potresti avere un server web e uno script che devono impostare una variabile di ambiente con contenuto utente specifico. Anche se quello script crea il suo, e non tocca altre variabili d'ambiente, è sufficiente. Una singola variabile di ambiente con qualsiasi nome e valore elaborato è sufficiente affinché l'exploit abbia successo .
  • Altri modi che non ho menzionato qui.

Una volta impostata questa variabile, la prossima volta che bash si apre per qualsiasi motivo, verrà eseguito il codice del tuo aggressore. Questo è particolarmente interessante con sudo -s , in quanto genera bash come superutente (una regola utente amministrativa con controllo completo sui dati e sui programmi del computer). Anche se avvii solo bash come utente standard, i file di quell'utente possono essere cancellati.

È importante notare che anche se non si usa bash da soli, molti programmi genereranno da soli bash come parte della loro operazione. Anche in questo caso, sei vulnerabile. Tuttavia, /bin/sh di Ubuntu non è bash, quindi sono interessati solo i programmi che invocano esplicitamente bash e non la shell di scripting predefinita.

Secondo Mitre:

  

vettori che coinvolgono la funzione ForceCommand in sshd OpenSSH, i moduli mod_cgi e mod_cgid nel server HTTP Apache, gli script eseguiti da client DHCP non specificati e altre situazioni in cui l'impostazione dell'ambiente avviene attraverso un limite di privilegi dell'esecuzione di Bash.

Sono vulnerabile?

Usa dpkg per verificare la versione del pacchetto installato:

dpkg -s bash | grep Version

Questo cercherà informazioni sul tuo pacchetto bash e filtrerà l'output per mostrarti solo la versione. Le versioni fisse sono 4.3-7ubuntu1.4 , 4.2-2ubuntu2.5 e 4.1-2ubuntu3.4 .

Ad esempio, vedo:

wlan1-loopback% dpkg -s bash | grep Version
Version: 4.3-7ubuntu1.4

e posso determinare che non sono vulnerabile.

Come aggiorno?

Il gestore aggiornamenti standard ti offrirà questo aggiornamento. Questo è un primo esempio di come gli aggiornamenti di sicurezza siano importanti, indipendentemente dal sistema operativo utilizzato o da quanto è ben gestito.

Il USN Bulletin afferma che sono state rilasciate nuove versioni per Ubuntu 14.04 Trusty Tahr, 12.04 Precise Pangolin e 10.04 Lucid Lynx. Se non sei in una di queste versioni LTS, ma sei in una versione abbastanza recente, molto probabilmente sarai in grado di trovare un pacchetto con patch.

Innanzitutto, controlla se

Se sei vulnerabile, devi prima prendere i nuovi elenchi di pacchetti:

sudo apt-get update && sudo apt-get install bash

Il primo comando si accerta di avere il nuovissimo elenco di pacchetti che include la versione fissa e il secondo comando installa la versione più recente (fissa) di bash.

Anche se il bug sembra entrare in gioco quando viene generato spawn, è comunque una buona idea riavviare immediatamente se possibile.

    
risposta data hexafraction 24.09.2014 - 23:48
27

Ha rubato questo cft su Hacker News . Se hai problemi con i tuoi repository come me (Odroid-XU), allora questo dovrebbe funzionare bene se vuoi patch / build dal sorgente.

TMPDIR=/tmp/bash-src
mkdir $TMPDIR
cd $TMPDIR
#download bash
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 1 999); do 
  wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i
  if [[ $? -ne "0" ]]; then
    MAX=$(expr $i - 1)
    break;
  fi
done
tar zxf bash-4.3.tar.gz 
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 1 $MAX);do
  echo apply patch bash43-$i
  patch -p0 < ../bash43-$i
done
#build and install
./configure && make
sudo make install
cd ../..
rm -r $TMPDIR

Quindi esegui:

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

E se ottieni:

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for 'x'
this is a test

Allora stai bene!

ATTENZIONE: make install installerà bash in /usr/local/bin , quindi /bin/bash non viene modificato e può essere richiamato da curl !!

    
risposta data Bobby Saget 25.09.2014 - 04:30
9

Nota: la patch di sicurezza per CVE-2014-7169 è stata rilasciata come aggiornamento di sicurezza standard. Non è necessario aggiungere ulteriori ppa per ricevere questa patch. È necessario solo quanto segue.

sudo apt-get update

sudo apt-get upgrade

Per assicurarti di aver corretto la patch di bash, esegui il seguente comando

dpkg -s bash | grep Version

Se sei su 14.04 LTS, dovresti vedere un output di:

Version: 4.3-7ubuntu1.4

Se sei su 12.04 LTS, il tuo output dovrebbe essere:

 Version: 4.2-2ubuntu2.5
    
risposta data branch.lizard 25.09.2014 - 20:30
1

Se sei su 11.04: usa i passaggi seguenti (ha funzionato per me)

cd ~/
mkdir bash
wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done

se non è stato scaricato patche richiesto, quindi installare il pacchetto ftp

apt-get install ftp
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
./configure && make && make install
apt-get install build-essential
./configure && make && make install

Per vedere se la patch è stata applicata:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
    
risposta data ldrrp 25.09.2014 - 19:13
0

Sto usando Natty 11.04, che è EOL (e ho aggiornato /etc/apt/sources.list per usare old-releases.ubuntu.com), quindi devo compilare dal sorgente. Volevo creare un .deb, quindi almeno la gestione dei pacchetti è "consapevole" che la versione di bash non è quella di default. Non ho successo al 100% - tuttavia, il pacchetto è registrato come "più recente" e il bash binario viene risolto, quindi ecco cosa ho fatto:

apt-get source bash
wget https://gist.githubusercontent.com/drj11/e85ca2d7503f28ebfde8/raw/31bd53ed2e47b220d3c728f5440758e0f76769de/gistfile1.c -O bash_CVE-2014-6271.patch
wget https://gist.githubusercontent.com/drj11/239e04c686f0886253fa/raw/046e697da6d4491c3b733b0207811c55ceb9d927/gistfile1.c -O bash_CVE-2014-6271_plus.patch
cd bash-4.2/

Ora, nella (sotto) directory bash-4.2/ , c'è: un file bash-4.2.tar.xz , che deve essere decompresso per arrivare alla sorgente bash ; e una sottodirectory chiamata debian .

Ho apportato le seguenti modifiche per evitare le dipendenze su texlive : in bash-4.2/debian/control :

Source: bash
...
Build-Depends: autoconf, autotools-dev, patch, bison, libncurses5-dev,
# texinfo, debhelper (>= 5), texi2html, locales, gettext, sharutils, time, xz-ut
ils
 debhelper (>= 5), locales, gettext, sharutils, time, xz-utils
# Build-Depends-Indep: texlive-latex-base, ghostscript
Build-Depends-Indep: ghostscript

... e in bash-4.2/debian/rules :

binary-doc: bash-install #bash-doc-build
        dh_testdir
        dh_testroot
        mkdir -p $(d_doc)/usr/share/doc/$(p)
        dh_installdocs -p$(p_doc) 
ifeq ($(with_gfdl),yes)
        #cp -p build-bash/doc/bashref.pdf $(d_doc)/usr/share/doc/$(p)/.
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bashref.pdf /usr/share/doc/$(p_doc)/bashref.pdf
else
        rm -f $(d_doc)/usr/share/doc-base/bashref
endif
        rm -f $(d_doc)/usr/share/info/dir*
        #cp -p build-bash/doc/bash.html build-bash/doc/bash.pdf \
        #    $(d_doc)/usr/share/doc/$(p)/
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bash.html /usr/share/doc/$(p_doc)/bash.html \
        #    /usr/share/doc/$(p)/bash.pdf /usr/share/doc/$(p_doc)/bash.pdf
        dh_installchangelogs -p$(p_doc) bash/CWRU/changelog
        ...

Per cambiare la versione, in questa directory bash-4.2/ , fai:

bash-4.2$ dch --local patchCVE

... e inserisci le note nel registro delle modifiche quando richiesto. Ciò assicurerà che il .deb (e i relativi metadati) siano chiamati (nel mio caso) bash_4.2-0ubuntu3patchCVE1_i386.deb .

Quindi puoi provare a costruire con dpkg-buildpackage -us -uc o debuild comando. Nota: uno di questi rimuoverà il codice sorgente dallo zip, ignorando così le eventuali patch che potresti avere! Ancora, esegui uno di questi una volta così la sorgente viene decompressa e compilata (nota debuild potrebbe ancora fallire alla fine a causa di texlive, ma dovrebbe decomprimere e compilare il sorgente).

Quindi applica le patch; nota che dovresti usare -p1 qui, perché attualmente sei nella directory bash-4.2/ :

bash-4.2$ patch -p1 < ../bash_CVE-2014-6271.patch 
bash-4.2$ patch -p1 < ../bash_CVE-2014-6271_plus.patch 

Quindi ricompila la versione con patch eseguendo:

bash-4.2$ fakeroot debian/rules build 

Questo ricostruirà l'eseguibile; per testarlo:

bash-4.2$ env VAR='() { :;}; echo Bash is vulnerable!' ./build-bash/bash -c "echo Bash Test"

Per creare i file .deb, esegui:

bash-4.2$ fakeroot debian/rules binary

Ciò salverà i file .deb nella directory superiore; per elencare i loro contenuti:

bash-4.2$ dpkg -c ../bash_4.2-0ubuntu3patchCVE1_i386.deb

Per installare il .deb:

bash-4.2$ sudo dpkg -i ../bash_4.2-0ubuntu3patchCVE1_i386.deb

Tuttavia, per qualche ragione, questo .deb contiene un binario non patchato (?!), quindi ho dovuto fare anche:

bash-4.2$ sudo cp bash-4.2/build-bash/bash /bin/

... e dopo questo, il test ha iniziato a passare correttamente per me:

$ env VAR='() { :;}; echo Bash is!' bash -c "echo Bash Test"
bash: warning: VAR: ignoring function definition attempt
bash: error importing function definition for 'VAR'
Bash Test
    
risposta data sdaau 28.09.2014 - 12:16

Leggi altre domande sui tag