Status
A Apple lançou as correções de segurança Bash para Shellshock e vulnerabilidades relacionadas como " OS X bash Update 1.0 ". Eles podem ser instalados por meio da atualização normal do sistema para pessoas que usam o OS X Mountain Lion v10.8.5 ou OS X Mavericks v10.9.5 (eles estão incluídos na Atualização de segurança 2014-005 ) e também podem ser instalados manualmente. As correções oficiais da Apple também estão disponíveis para OS X Lion v10.7.5 e OS X Lion Server v10.7.5, mas estão disponíveis apenas por download manual. As correções de segurança estão disponíveis através de URLs diferentes, com base na versão do sistema operacional:
(Se novos patches forem lançados, coloque-os aqui, mas guarde-os para referência.)
O patch da Apple cuida do Shellshock e de várias outras vulnerabilidades e é bom para a maioria das pessoas. As pessoas podem parar de ler aqui.
No entanto, a atenção que o bug do Shellshock chamou a atenção do bash fez com que muitos pesquisadores analisassem com atenção o bash e mais e mais vulnerabilidades (difíceis de explorar) continuam sendo encontradas. Se você está altamente preocupado com a segurança (porque talvez esteja executando o OS X Server para hospedar um site disponível publicamente), convém (tente) acompanhar as vulnerabilidades e os patches à medida que eles continuam entrando, compilando você mesmo. Caso contrário, não se preocupe.
Procure a Apple para lançar outra atualização para aproveitar algum tempo no futuro, quando a poeira baixar para encontrar mais vulnerabilidades.
Está disponível um conjunto oficial de patches do bash para o bash 3.2, patches 52, 53 e 54 (que correspondem aos patches Bash 4.3 25, 26 e 27), que corrigem CVE-2014-6271 e CVE-2014-7169, bem como o 'Game over' exibido abaixo. Isso foi testado por mim ( @alblue ) e a postagem foi atualizada de acordo (e foram feitas atualizações adicionais: veja a revisão 41 da postagem que para no patch 54).
Muitas vulnerabilidades adicionais foram relatadas contra o bash. De acordo com o post de Michal Zalewski, se você possui o patch 54 (e presumivelmente o patch oficial da Apple) "não faz sentido ficar obcecado com o status desses erros individuais, porque eles não devem mais representar um risco à segurança:"
CVE-2014-6271 - RCE original encontrado por Stephane. Corrigido por bash43-025 e entradas correspondentes em 24 de setembro para outras versões.
CVE-2014-7169 - erro de criação de arquivo / consumo de token encontrado por Tavis. Corrigido por bash43-026 & co (26 de setembro)
CVE-2014-7186 - uma falha de 10 ou mais documentos, provavelmente sem risco, encontrada por Florian e Todd. Corrigido por bash43-028 & co (1º de outubro).
CVE-2014-7187 - um risco não fatal, provavelmente sem risco de segundo encontrado por Florian. Corrigido por bash43-028 & co (1º de outubro).
CVE-2014-6277 - problema de memória não inicializada, quase certamente o RCE encontrado por Michal Zalewski. Nenhum patch específico ainda.
CVE-2014-6278 - RCE de injeção de comando encontrado por Michal Zalewski. Nenhum patch específico ainda.
Fica bem confuso. Felizmente, Chet Ramey, o mantenedor oficial do bash, postou um CVE no mapeamento de patches . Seu post se refere a patches para o bash 4.3, eu (@OldPro) os traduzimos para patches para o bash 3.2, que é aplicável ao OS X. Além disso, desde que ele postou o patch 57, então eu adicionei o seguinte:
bash32-052 CVE-2014-6271 2014-09-24
bash32-053 CVE-2014-7169 2014-09-26
bash32-054 exported function namespace change 2014-09-27 ("Game Over")
bash32-055 CVE-2014-7186/CVE-2014-7187 2014-10-01
bash32-056 CVE-2014-6277 2014-10-02
bash32-057 CVE-2014-6278 2014-10-05
Veja a publicação de David A. Wheeler para uma linha do tempo e mais detalhes.
A @alblue publicou instruções de construção no patch 55. Eu (@OldPro) adicionei o patch 56 e 57 às instruções, mas não o testei.
Testando a vulnerabilidade original
Você pode determinar se você está vulnerável ao problema original no CVE-2014-6271 executando este teste:
$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
hello
A saída acima é um exemplo de uma bash
versão não vulnerável . Se você vir a palavra vulnerable
na saída desse comando, você bash
estará vulnerável e deverá atualizar. Abaixo está uma versão vulnerável do OS X 10.8.5:
Testando a nova vulnerabilidade
Houve uma atualização para a postagem original e o Bash 3.2.52 (1) ainda está vulnerável a uma variação da vulnerabilidade, definida em CVE-2014-7169
$ rm -f echo
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST
A saída acima é um exemplo de uma bash
versão vulnerável . Se você vir uma data na saída desse comando, bash
estará vulnerável.
Desativando funções importadas automaticamente para evitar "Game Over"
Os pesquisadores observaram, sem classificá-lo como uma vulnerabilidade, que um script poderia seqüestrar uma função em um subshell usando funções importadas automaticamente:
$ env ls="() { echo 'Game Over'; }" bash -c ls
Game over
O código acima em um sistema afetado seria exibido em Game Over
vez da lista de diretórios que você esperaria ls
. Obviamente, echo 'Game Over'
pode ser substituído por qualquer código nefasto que você desejar. Isso se tornou conhecido como o bug "Game Over".
Antes da disponibilidade do patch 54, o NetBSD e o FreeBSD desabilitavam as funções bash de importação automática por padrão, em parte para impedir "Game Over", mas principalmente para conter outros erros no analisador (como CVE-2014-7169 ), como estavam continua a ser descoberto e adicionou um novo sinalizador de linha de comando--import-functions
reativar o antigo comportamento padrão. Eu (@alblue) preparei um patch (contra 3.2.53) para outras pessoas usarem se quiserem adotar esse comportamento também e o incluímos abaixo. Por padrão, este patch não está ativado no script de construção abaixo. Eu (@OldPro) acredito que esse patch não é mais necessário ou é uma boa idéia, porque quebra a compatibilidade com versões anteriores e as vulnerabilidades contra as quais ele protege são muito bem tratadas pelo patch 54 e pelos patches anteriores, e habilitar esse patch não oficial impede a aplicação de patches futuros .
(Observação para os editores de perguntas; por favor, não ative isso por padrão, pois é um patch não oficial.)
a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_functions.patch
O patch pode ser ativado executando export ADD_IMPORT_FUNCTIONS_PATCH=YES
antes de executar a compilação. Observe que a ativação desse patch desabilitará o patch 54 e quaisquer patches futuros, porque não é possível garantir que patches futuros sejam compatíveis com o patch não oficial.
O Apple Patch tem vulnerabilidade de Game Over, mais ou menos
Como apontado por @ake_____ no twitter, o patch oficial da Apple ainda é vulnerável ao ambiente de executáveis:
$ env '__BASH_FUNC<ls>()'="() { echo Game Over; }" bash -c ls
Game Over
Os usuários devem decidir por si mesmos o quanto isso é importante. Eu (@OldPro) acho que não há nada com que se preocupar, porque não há exploração conhecida por esse comportamento (nem sequer foi fornecido um identificador CVE) porque, em geral, atacantes remotos sem privilégios não podem definir o nome de uma variável de ambiente e atacantes com privilégios não podem use isso para obter privilégios que eles ainda não possuem (pelo menos não sem explorar uma vulnerabilidade adicional).
Para fornecer um pouco de experiência, o bash permite definir funções e, além disso, permite exportar essas funções para subshells através do export -f
comando Isso costumava ser implementado criando uma variável de ambiente com o mesmo nome que a função com seu valor definido para a definição da função. assim
$ ls () { echo 'Game Over'; }
$ export -f ls
$ echo $ls
Game Over
Isso aconteceu porque export -f ls
criou uma variável de ambiente chamada ls
. A vulnerabilidade "Game Over" era que era possível criar diretamente essa variável de ambiente sem precisar primeiro definir a função, o que significava que, se você pudesse injetar o nome correto da variável, poderia sequestrar um comando. A Apple tentou corrigir isso, dificultando a criação de uma variável com o nome correto. O patch oficial do bash 54 na verdade torna impossível criar uma variável com o nome correto, usando nomes de variáveis que incluem %
qual é um caractere não permitido em um nome de variável, colocando efetivamente as definições de função exportadas em um espaço de nome reservado diferente.
Se nenhuma das opções acima fizer sentido para você, não se preocupe. Você está bem com o patch da Apple por enquanto.
Binários do sistema
O OS X 10.9.5 (a última versão estável no momento) é fornecida com o Bash v3.2.51:
$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
Você pode obter e recompilar o Bash da seguinte forma , desde que você tenha o Xcode instalado (e tenha executado xcodebuild
pelo menos uma vez antes para aceitar a licença):
$ # If you want to disable auto-imported functions, uncomment the following
$ # export ADD_IMPORT_FUNCTIONS_PATCH=YES
$ mkdir bash-fix
$ cd bash-fix
$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
$ cd bash-92/bash-3.2
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-053 | patch -p0
$ # See note above about ADD_IMPORT_FUNCTIONS_PATCH
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] && curl http://alblue.bandlem.com/import_functions.patch | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-054 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-055 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-056 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-057 | patch -p0
$ cd ..
$ # Note: DO NOT ADD SUDO TO XCODEBUILD HERE
$ xcodebuild
$ build/Release/bash --version # GNU bash, version 3.2.57-release
$ build/Release/sh --version # GNU bash, version 3.2.57-release
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin
(Nota: você pode executar isso copiando e colando o bloco de código acima, acessando o Terminal e executando pbpaste | cut -c 2- | sh
. Sempre tome cuidado ao executar scripts aleatórios da Internet ...)
Depois disso, a versão do Bash deve ser a v3.2.57:
$ bash --version
GNU bash, version 3.2.57-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
Por segurança e após o teste, recomendo que você chmod -x
versões antigas para garantir que não sejam reutilizadas ou mova-as para um site de backup.
$ sudo chmod a-x /bin/bash.old /bin/sh.old
Outras respostas têm soluções para quem usa MacPorts ou Homebrew; eles não solucionam o problema, eles apenas instalam versões adicionais do Bash. Por favor, veja essas respostas se você deseja atualizá-las especificamente.
obrigado
Agradecemos a Chet, que cuida do bash, e tem disponibilizado esses patches. Obrigado a todos os que comentaram e melhoraram com o tempo.
Agora, a Apple lançou a correção real, embora isso ainda possa ser útil. Como eles lançaram apenas uma correção para Lion e versões posteriores, e o patch oficial fornece o GNU bash, versão 3.2.53 (1) -release (x86_64-apple-darwin13), no entanto, o bug Game over ainda é um pouco vulnerável. Neste ponto, a reconstrução da sua própria versão do Bash contra a versão 3.2.57 provavelmente é mais segura do que depender do patch da Apple, a menos que você faça isso errado.