O que é a vulnerabilidade de bash CVE-2014-6271 (Shellshock) e como corrigi-lo?


141

Recentemente, surgiram notícias sobre o "CVE-2014-6271" (consulte 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 foi desenvolvido como uma resposta canônica para essa vulnerabilidade, devido ao seu escopo e gravidade.


18
"como faço para corrigir isso?" -> basta executar seu gerenciador de atualizações! Realmente, o Ubuntu lança atualizações de segurança, há uma equipe de segurança dedicada. Por favor, não poste respostas sobre a criação do Bash a partir da fonte! ; é desnecessariamente complicado e mais difícil manter seu sistema no futuro.
gertvdijk

5
Além disso, também o CVE adicional para a correção incompleta. CVE-2014-7169
gertvdijk

18
Por favor, fazer pós respostas sobre a construção da fonte. Quer devam ou não, algumas pessoas têm servidores Ubuntu antigos, e construir a partir da fonte pode ser sua única opção.
GaryO 25/09

3
Opa, desculpe, acabei de perceber que coloquei bash em vez de dash no teste. Não importa, está tudo bem.
Matt H

Respostas:


126

O que é o Bash?

Bash é o shell interativo padrão no Ubuntu. Quando você está em interface com o terminal (através do emulador de terminal, sobre um tty ou ssh), geralmente digita comandos que bashirão ler e executar. Mesmo se você não usar o terminal, ainda terá o Bash.

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

Como a exploração me afeta?

O Bash e o SO controlam um conjunto de variáveis de ambiente que descrevem o usuário conectado atual, onde procurar programas no disco rígido e outras funções desse tipo. Ao criar uma variável de ambiente com uma estrutura específica, um invasor poderá executar o 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 SSH com uma configuração específica, como git over ssh. Como Mitre adverte, o uso da ForceCommandopção sshd é um vetor de ataque. Contas cujo shell não é do bash não são afetadas.
  • Enganando você a definir a variável de ambiente.
  • Fazer com que outro programa defina uma variável de ambiente para ter esse valor criado. Por exemplo, você pode ter um servidor da web e um script que precisam definir uma variável de ambiente com conteúdo de usuário específico. Mesmo que esse script crie 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 que a exploração seja bem-sucedida .
  • Outras maneiras que não mencionei aqui.

Depois de definir essa variável, na próxima vez que bashfor aberto, por qualquer motivo, o código do atacante será executado. Isso é especialmente assustador sudo -s, pois gera uma festança como superusuário (uma regra administrativa de usuário que tem controle total sobre os dados e programas do seu computador). Mesmo se você iniciar o bash apenas como usuário padrão, os arquivos desse usuário poderão ser excluídos.

É importante observar que, mesmo se você não usar o bash, muitos programas irão gerar o bash sozinhos como parte de sua operação. Mesmo neste caso, você é vulnerável. No entanto, o Ubuntu /bin/shnã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 servidor HTTP Apache, scripts executados por clientes DHCP não especificados e outras situações em que a configuração do ambiente ocorre através de um limite de privilégio da execução do Bash.

Eu sou vulnerável?

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

dpkg -s bash | grep Version

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

Por exemplo, eu vejo:

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

e pode determinar que eu não sou vulnerável.

Como atualizo?

O gerenciador de atualizações padrão oferecerá essa atualização. Este é um excelente exemplo de como as atualizações de segurança são importantes, independentemente do sistema operacional usado ou da manutenção.

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

Primeiro, verifique se você

Se você está vulnerável, primeiro pegue 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 recente que inclui a versão fixa e o segundo comando instala a versão mais nova (fixa) do bash.

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


20
Desculpe, você é vulnerável . O patch original não resolve todo o problema. Consulte cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169 AFAIAA, atualmente não há nenhuma correção disponível publicamente. Veja, por exemplo, people.canonical.com/~ubuntu-security/cve/pkg/bash.html
Mormegil

4
@hexafraction Onde você lê que a 12.10 recebe uma atualização para isso? Acho que não, 12.10, 13.04, 13.10 são muito em fim de vida ! E também, os repositórios de backport não são usados ​​para atualizações de segurança .
gertvdijk

2
@hexafraction Não, eles não! Esse é o objetivo de ser o fim da vida: não há mais suporte.
gertvdijk

11
@ MichaelHärtl Se você está no Ubuntu 12.10, pode baixar a versão 12.04 do bash em packages.ubuntu.com/precise/bash e instalá-lo manualmente.
David

2
A correção para CVE-2014-7169 está disponível no gerenciador de atualizações (para mim).
Calmarius 26/09/14

27

Roubou isso do cft no Hacker News . Se você tiver problemas com seus repositórios como eu (Odroid-XU), isso deve funcionar bem se você deseja corrigir / construir 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

Então corra:

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á bem!


AVISO: make install instalará o bash in /usr/local/bin, portanto /bin/bashnão é modificado e pode ser chamado a partir do curl !!


11
Aqui está como construir o bash 3.2 com o patch no debian lenny: gist.github.com/mattwhite/86de50d30134129e44ef
Matt White

13
-1. Não há necessidade de construir a partir da fonte. O Ubuntu possui um patch de segurança nos repositórios. Se você tiver "problemas com seu repo", corrija-o. Você provavelmente estará vulnerável de muitas outras maneiras, se não receber atualizações de segurança!
gertvdijk

11
@ Matt White Obrigado! Você acabou de me salvar algumas horas :)
Florian Fida

5
@FlorianFida This is AskUbuntu! É esperado que todos neste site publiquem respostas no escopo do uso do Ubuntu.
gertvdijk

6
@ MichaelHärtl 12.10 é Fim da vida. Ele não recebe mais nenhuma atualização de segurança há muito tempo. Melhorar!!!
gertvdijk

9

Nota: 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 ppa's adicionais para receber esse patch. Apenas o seguinte é necessário.

sudo apt-get update

sudo apt-get upgrade

Para garantir que você corrigiu o bash corretamente, 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

11
Isso estava correto, mas um patch oficial foi disponibilizado e a atualização de segurança foi lançada. Consequentemente, essas etapas não são mais necessárias.
precisa saber é o seguinte

Isto está correto. Vou editar o post acima. Obrigado.
branch.lizard

1

Se você estiver no 11.04: use as etapas 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 baixado o patche necessário, 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"

0

Estou usando o Natty 11.04, que é EOL (e atualizei o /etc/apt/sources.list para usar old-releases.ubuntu.com), então tenho que construir a partir do código-fonte. Eu queria criar um .deb, portanto, pelo menos, o gerenciamento de pacotes está "ciente" de que a versão do bash não é a padrão. Não sou 100% bem-sucedido - no entanto, o pacote é registrado como "mais recente" e o bashbinário acaba corrigido, 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 diretório (sub) bash-4.2/, existe: um arquivo bash-4.2.tar.xz, que precisa ser descompactado para chegar à bashfonte; e um subdiretório chamado debian.

Fiz as seguintes alterações para evitar dependências 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 bash-4.2/diretório, faça:

bash-4.2$ dch --local patchCVE

... e preencha as anotações no changelog quando solicitado. Isso garantirá que o .deb (e os metadados relacionados) sejam chamados (no meu caso) bash_4.2-0ubuntu3patchCVE1_i386.deb.

Então você pode tentar criar com dpkg-buildpackage -us -ucou debuildcomando. Nota - qualquer um deles descompactará a fonte do zip - substituindo assim os patches que você tiver! Ainda assim, execute um deles uma vez para que a fonte seja descompactada e construída (a nota debuildainda pode falhar no final devido ao texlive, mas deve descompactar e criar a fonte).

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

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 criar os arquivos .deb, execute:

bash-4.2$ fakeroot debian/rules binary

Isso 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, este .deb contém um binário não corrigido (?!), Então 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

Pergunta: A pergunta original indica um possível vetor de ataque como "scripts executados por clientes DHCP não especificados". O que isto significa? Isso significa que o / sbin / dhclient do Ubuntu <- é vulnerável?
Bran

Acho que talvez os clientes não especificados signifiquem que o Ubuntu tenha um / sbin / dhclient infectado, que executa comandos que levam ao script bash que lança o shellshock. É isso que os clientes DHCP são vulneráveis ​​ao shellshock? (Hope isso faz sentido, ver a minha mensagem acima de 10 de outubro)
Bran
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.