O que é a vulnerabilidade do CVE-2014-6271 bash (Shellshock) e como faço para corrigir isso?

140

Recentemente, houve notícias sobre "CVE-2014-6271" (ver USN-2362- 1 ), que é uma vulnerabilidade no Bash. Como sei se sou afetado por isso, como posso corrigi-lo e por que devo me importar?

Isso é projetado como uma resposta canônica para essa vulnerabilidade, devido ao seu escopo e gravidade.

    
por hexafraction 24.09.2014 / 23:48

5 respostas

127

O que é o Bash?

Bash é o shell interativo padrão no Ubuntu. Quando você está interagindo com o terminal (através do emulador de terminal, através de um tty, ou ssh), você geralmente está digitando comandos que bash lerão e executarão. Mesmo que você não use o terminal, você ainda tem Bash.

No Ubuntu, /bin/sh não é bash (é traço). Somente o bash é afetado por esta vulnerabilidade.

Como a exploração me afeta?

Bash e o sistema operacional acompanham um conjunto de variáveis ​​de ambiente que descrevem o usuário atualmente conectado, onde procurar por programas no disco rígido e outras funções semelhantes. Ao criar uma variável de ambiente com uma estrutura específica, um invasor pode executar código na próxima vez que o Bash for iniciado.

O invasor pode definir essa variável de ambiente de várias maneiras:

  • Conecte-se remotamente a um serviço como o SSH com uma configuração específica, como git over ssh. Como Mitre avisa, o uso da opção sshd ForceCommand é um vetor de ataque. Contas cujo shell não é bash não são afetadas.
  • Enganar você para definir a variável de ambiente.
  • Faz com que outro programa configure uma variável de ambiente para ter esse valor criado. Por exemplo, você pode ter um servidor da web e um script que precisa definir uma variável de ambiente com conteúdo de usuário específico. Mesmo que esse script crie o seu próprio e não toque em outras variáveis ​​de ambiente, é suficiente. Uma única variável de ambiente com qualquer nome e um valor criado é suficiente para o exploit ter sucesso .
  • Outras formas que não mencionei aqui.

Depois de definir essa variável, da próxima vez que bash abrir para qualquer motivo , o código do invasor será executado. Isso é especialmente espantoso com sudo -s , pois gera o super-usuário (uma regra de usuário administrativo que tem controle total sobre os dados e programas do seu computador). Mesmo se você apenas iniciar o bash como um usuário padrão, os arquivos desse usuário poderão ser excluídos.

É importante notar que, mesmo que você não use o bash, muitos programas aparecerão sozinhos como parte de sua operação. Mesmo neste caso, você está vulnerável. No entanto, o /bin/sh do Ubuntu não é bash, portanto apenas os programas que invocam explicitamente o bash e não o shell de script padrão são afetados.

De acordo com Mitre:

  

vetores envolvendo o recurso ForceCommand no OpenSSH sshd, os módulos mod_cgi e mod_cgid no Apache HTTP Server, scripts executados por clientes DHCP não especificados e outras situações nas quais a configuração do ambiente ocorre através de um limite de privilégio da execução do Bash.

Estou vulnerável?

Use o dpkg para verificar sua versão do pacote instalado:

dpkg -s bash | grep Version

Isso procurará informações no seu pacote bash e filtrará a saída para mostrar apenas a versão. As versões fixas são 4.3-7ubuntu1.4 , 4.2-2ubuntu2.5 e 4.1-2ubuntu3.4 .

Por exemplo, vejo:

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

e pode determinar que não estou vulnerável.

Como faço para atualizar?

O gerenciador de atualização padrão oferece esta atualização. Este é um excelente exemplo de como as atualizações de segurança são importantes, independentemente do sistema operacional que você usa ou de como ele é bem mantido.

O Boletim USN afirma que novas versões foram lançadas para o Ubuntu 14.04 Trusty Tahr, 12.04 Precise Pangolim e 10.04 Lucid Lynx. Se você não estiver em uma dessas versões do LTS, mas estiver em uma versão razoavelmente recente, provavelmente será possível encontrar um pacote corrigido.

Primeiro, verifique se você

Se você estiver vulnerável, primeiro deverá pegar as listas de pacotes mais recentes:

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

O primeiro comando garante que você tenha a lista de pacotes mais nova que inclui a versão fixa, e o segundo comando instala a versão mais recente (fixa) do bash.

Embora o bug só apareça quando o bash é gerado, ainda é uma boa idéia reiniciar imediatamente se possível.

    
por hexafraction 24.09.2014 / 23:48
27

Roubei isso de cft na Hacker News . Se você tiver problemas com seus repositórios como eu (Odroid-XU), isso deve funcionar bem se você quiser fazer o patch / build a partir do código-fonte.

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

Em seguida, execute:

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

E se você receber:

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

Então você está tudo bem!

AVISO: make install irá instalar o bash em /usr/local/bin , então /bin/bash não é modificado e pode ser invocado a partir do curl !!

    
por Bobby Saget 25.09.2014 / 04:30
9

Observação: o patch de segurança para CVE-2014-7169 foi lançado como uma atualização de segurança padrão. Não há necessidade de adicionar outros ppa's para receber este patch. Apenas o seguinte é necessário.

sudo apt-get update

sudo apt-get upgrade

Para garantir que você tenha corrigido corretamente o bash, execute o seguinte comando

dpkg -s bash | grep Version

Se você estiver no 14.04 LTS, deverá ver uma saída de:

Version: 4.3-7ubuntu1.4

Se você estiver no 12.04 LTS, sua saída deve ser:

 Version: 4.2-2ubuntu2.5
    
por branch.lizard 25.09.2014 / 20:30
1

Se você está no 11.04: use os passos abaixo (funcionou para mim)

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 não for necessário fazer o download do patche, instale o pacote 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

Para ver se o patch foi aplicado:

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

Estou usando o Natty 11.04, que é o EOL (e atualizei o /etc/apt/sources.list para usar o old-releases.ubuntu.com), então tenho que criar a partir do código-fonte. Eu queria construir um .deb, então pelo menos o gerenciador de pacotes está "ciente" que a versão bash não é a padrão. Eu não tenho 100% de sucesso - no entanto, o pacote é registrado como "mais novo" e o binário bash acaba fixo, então aqui está o que eu fiz:

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/

Agora, no (sub) diretório bash-4.2/ , existe: um arquivo bash-4.2.tar.xz , que precisa ser descompactado para obter a bash source; e um subdiretório chamado debian .

Eu fiz as seguintes alterações para evitar dependências em 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 em 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
        ...

Para alterar a versão, neste diretório bash-4.2/ , faça:

bash-4.2$ dch --local patchCVE

... e preencha as notas no changelog quando solicitado. Isso garantirá que o .deb (e os metadados relacionados) seja chamado (no meu caso) bash_4.2-0ubuntu3patchCVE1_i386.deb .

Você pode tentar criar com o comando dpkg-buildpackage -us -uc ou debuild . Nota - qualquer um destes irá descompactar a fonte do zip - assim, sobrescrevendo quaisquer patches que você possa ter! Ainda assim, execute uma delas uma vez para que a origem seja descompactada e criada (note que debuild ainda pode falhar no final devido ao texlive, mas deve descompactar e construir a origem).

Em seguida, aplique os patches; note que você deve usar -p1 aqui, porque atualmente você está no diretório bash-4.2/ :

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

Em seguida, reconstrua a versão corrigida executando:

bash-4.2$ fakeroot debian/rules build 

Isso reconstruiria o executável; para testá-lo:

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

Para construir os arquivos .deb, execute:

bash-4.2$ fakeroot debian/rules binary

Isto salvará os arquivos .deb no diretório pai; para listar seu conteúdo:

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

Para instalar o .deb:

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

No entanto, por algum motivo, esse .deb contém um binário não corrigido (?!), então eu tive que fazer adicionalmente:

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

... e depois disso, o teste começou a passar corretamente para mim:

$ 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
    
por sdaau 28.09.2014 / 12:16