Por: Conrado Gouvêa
Na última semana foi publicado mais um ataque que afeta o protocolo SSL/TLS, utilizado para comunicação segura na internet. Denominado DROWN (“Decrypting RSA with Obsolete and Weakened eNcryption” ou em português “decifrando RSA com cifração obsoleta e enfraquecida”) foi consequência de uma série de erros envolvendo o protocolo SSL e a sua implementação na biblioteca OpenSSL. Ele permite quebrar o sigilo de conexões entre clientes e servidores, mesmo utilizando versões modernas do protocolo. Se um servidor suporta SSLv2 e possui certas falhas, esse servidor está vulnerável. Para entender o ataque é primeiramente necessário relembrar o histórico dos protocolos SSL.
O SSL evoluiu da seguinte forma:
- SSLv2 (1995)
- SSLv3 (1996)
- TLSv1.0 (1999)
- TLSv1.1 (2006)
- TLSv1.2 (2008)
Pouco tempo após a adoção do SSLv2 foi descoberto que ele era completamente inseguro. O protocolo foi substancialmente modificado e o SSLv3 corrigiu muitas dessas falhas. Atualmente, não há nenhuma razão para utilizar SSLv2. Mesmo o Windows XP com Internet Explorer 6.0 já é capaz de utilizar SSLv3 (que, embora problemático, não é totalmente inseguro como o SSLv2).
Outra peça necessária para se entender o DROWN é o ataque de oráculo de padding contra a cifração RSA versão PKCS#1 v1.5, descoberto por Daniel Bleichenbacher em 1998. Quando se cifra algum dado utilizando RSA é necessário adicionar um “padding” à mensagem antes de cifrá-la. Tal padding é uma sequência de bytes que previne uma classe importante de ataques; sem ele, o RSA se torna completamente inseguro. Implementações costumavam retornar algum código de erro quando o padding estava incorreto ao decifrar uma mensagem. O ataque de oráculo de padding explora esse fato.
O ataque de oráculo de padding é fatal pela seguinte razão: se um atacante manipular uma mensagem cifrada e por acaso essa mensagem manipulada possuir o padding correto, o servidor não irá retornar erro. Dessa forma o atacante descobre que a mensagem correspondente àquela mensagem cifrada manipulada por ele possuía um padding correto. Repetindo essa operação múltiplas vezes com diferentes manipulações, o atacante consegue descobrir a mensagem original.
Este ataque pode ser evitado com uma implementação cuidadosa (retornando dados aleatórios ao invés de indicar erro quando há um padding inválido). Esta proteção foi implementada no OpenSSL, inclusive no SSLv2. Porém, como veremos, não foi o suficiente.
Por último, para entender o DROWN, é preciso ter em mente que o SSL quando utiliza acordo de chaves com RSA, geralmente opera da seguinte forma:
- O cliente gera uma chave simétrica;
- O cliente cifra esta chave com a chave pública RSA do servidor (utilizando PKCS#1 v1.5) e envia para o servidor;
- O servidor decifra (validando o padding) e obtém a chave simétrica escolhida pelo cliente, permitindo a comunicação com tal chave
Assim, vários fatores se uniram para permitir o ataque:
O SSLv2 possui suítes criptográficas de exportação. Tais suítes foram adicionadas nos anos 90 sob exigência do governo americano. Comentamos sobre essa questão no post sobre o ataque FREAK.
- Como a chave de tais suítes de exportação é pequena (40 bits), é possível para um atacante utlizar o ataque de oráculo de padding, mesmo com a proteção do OpenSSL. Para isso, ele utiliza a suíte de exportação e um ataque de força bruta para descobrir se o padding de uma mensagem cifrada está correto.
- Outra falha no código de suítes de exportação no OpenSSL permitia um oráculo de padding muito mais eficiente, permitindo o ataque em tempo real.
- Devido a um bug no OpenSSL, era possível utilizar suítes criptográficas SSLv2 mesmo quando o SSLv2 foi desativado, aumentando o número de servidores vulneráveis.
- Versões recentes do protocolo TLS/SSL ainda possuem uma estrutura parecida com o SSLv2 (chave simétrica cifrada com chave RSA, exceto ao se utilizar forward secrecy). Isso permite que o atacante intercepte uma mensagem (chave simétrica) cifrada com a chave RSA e quebrá-la explorando o oráculo de padding efetuando tentativas de conexão com o mesmo servidor, porém utilizando SSLv2 e a mensagem cifrada interceptada.
Desta forma, o DROWN é um ataque de protocolo cruzado: ele quebra protocolos seguros ao interceptar um pedaço da comunicação neste protocolo e utilizando este pedaço em um protocolo inseguro, no caso, o SSLv2.
Também é importante notar que muitos servidores utilizam a mesma chave privada para múltiplos serviços. Então, por exemplo, se um servidor web está corretamente configurado e não permite o uso do SSLv2, ele ainda pode ser quebrado se a mesma chave é utilizada em um servidor de e-mails que suporte SSLv2.
A versão genérica do DROWN permite a quebra de uma conexão em 8 horas com um custo de 440 dólares de computação. A versão especial, como mencionado, permite o ataque em tempo real.
Como desenvolvedor ou responsável por servidores SSL/TLS:
- Atualizar o OpenSSL para 1.0.1s ou 1.0.2g
- Desativar SSLv2 (se possível, SSLv3 também)
Como desenvolvedor ou responsável por clientes SSL/TLS, ou como usuário final:
- Não há o que se fazer: o ataque depende apenas de servidores vulneráveis.
Referências
https://drownattack.com/