Vulnerabilidade na geração de assinaturas com chave privada ECDSA da curva NIST P521 na ferramenta PuTTY
- Todas as versões do PuTTY de 0.68 até 0.80 têm uma vulnerabilidade grave no código que gera assinaturas a partir de chaves privadas ECDSA que usam a curva NIST P521
- Ocorre quando o PuTTY ou o Pageant gera uma assinatura da chave ao autenticar em um servidor SSH
- Foi atribuído a essa vulnerabilidade o identificador CVE-2024-31497
- Descoberta por Fabian Bäumer e Marcus Brinkmann, da Ruhr University Bochum
Impacto da vulnerabilidade
- O impacto dessa vulnerabilidade é a exposição da chave privada
- Se um invasor tiver algumas dezenas de mensagens assinadas e a chave pública, isso já fornece informação suficiente para recuperar a chave privada
- Com isso, ele pode forjar assinaturas como se fosse o usuário e fazer login em todos os servidores que usam essa chave
- Para obter essas assinaturas, basta ao invasor comprometer por pouco tempo um servidor no qual a chave é usada para autenticação, ou ter acesso temporário a uma cópia do Pageant que contenha a chave
- No entanto, essas assinaturas não ficam expostas a um observador passivo espionando a conexão SSH
- Se você tiver esse tipo de chave, a recomendação é descartá-la imediatamente
- É preciso remover a chave pública antiga de todos os arquivos OpenSSH
authorized_keys e dos arquivos equivalentes em outros servidores SSH, para que as assinaturas da chave comprometida deixem de ter valor
- Em seguida, gere um novo par de chaves para substituí-la
Tipos de chave afetados
- O único tipo de chave afetado é ECDSA de 521 bits
- Chaves em que o campo "Key fingerprint" do PuTTYgen no Windows começa com
ecdsa-sha2-nistp521, ou que aparecem descritas como "NIST p521" quando carregadas no Pageant no Windows, ou ainda que tenham um ID iniciado por ecdsa-sha2-nistp521 no protocolo SSH ou no arquivo de chave
- ECDSA de outros tamanhos e outros algoritmos de chave não são afetados
- Em particular, Ed25519 não é afetado
Detalhes do erro
- Todo esquema de assinatura DSA precisa gerar um valor aleatório durante a assinatura
- Isso é conhecido como
nonce (termo criptográfico para um valor usado uma única vez) ou pela letra k
- É amplamente conhecido que, se um invasor conseguir adivinhar o valor de k usado ou encontrar duas assinaturas geradas com o mesmo k, ele pode recuperar imediatamente a chave privada
- Por isso, gerar assinaturas DSA em sistemas sem uma fonte de aleatoriedade de alta qualidade é arriscado
- Como o PuTTY foi desenvolvido no Windows, ele originalmente não tinha nenhum gerador criptográfico de números aleatórios
- Por isso, o PuTTY vinha gerando k de forma determinística, sem usar números aleatórios
- A técnica central era calcular um hash seguro que incluía, na entrada, tanto a mensagem a ser assinada quanto a chave privada
- Essa técnica hoje é padrão no setor, e a RFC 6979 documenta um método específico e bem conhecido para fazer isso
- Porém, como o PuTTY já fazia algo equivalente desde 2001 e a RFC só foi publicada em 2013, ele não seguia essa especificação
Causa da vulnerabilidade
- A técnica do PuTTY funciona criando um hash SHA-512 e depois reduzindo-o módulo q, onde q é a ordem do grupo usada no sistema DSA
- Em todos os casos, exceto no P521, o viés causado por reduzir um número de 512 bits módulo q é desprezível
- Porém, no caso do P521, como q tem 521 bits (ou seja, mais de 512 bits), reduzir um número de 512 bits módulo q não produz efeito algum
- O resultado é um valor k cujos 9 bits superiores são sempre 0
- Esse viés torna possível um ataque de recuperação da chave
Correção da vulnerabilidade
- Para corrigir esse problema, o PuTTY abandonou completamente o sistema anterior de geração de k e passou a usar a técnica da RFC 6979 para todos os tipos de chave DSA e ECDSA
- Chaves EdDSA, como Ed25519, já usavam outro sistema e não foram alteradas
- No entanto, isso não muda o fato de que informações sobre as chaves privadas P521 existentes já foram expostas sempre que uma assinatura foi gerada com o gerador antigo de k
Opinião do GN⁺
- Trata-se de uma vulnerabilidade descoberta relativamente há pouco tempo, mas que aparentemente decorre de um problema em uma abordagem usada desde 2001. Pode ser vista como um caso que mostra o risco de uma implementação customizada que desde o início não seguia o padrão.
- Esta vulnerabilidade afeta apenas um tipo específico de chave, mas, se essa chave já tiver sido usada, o problema pode ser grave. Por isso, é importante descartar imediatamente as chaves afetadas.
- Em projetos open source, as partes relacionadas à criptografia parecem exigir adesão a padrões e também validação externa. Em especial, a geração de números aleatórios é extremamente importante, então pode ser mais seguro depender do sistema operacional ou de bibliotecas já validadas.
- O PuTTY é um emulador de terminal open source amplamente usado, com suporte aos protocolos SSH, Telnet e Rlogin, e é conveniente pelo recurso de salvar informações de conexão. Parece importante responder ativamente a futuras correções de vulnerabilidades.
- Como alternativas ao PuTTY no macOS ou Linux, é possível usar o aplicativo de terminal padrão ou o iTerm2. No Windows, alternativas como Windows Terminal, PowerShell e Cmder também podem ser consideradas.
4 comentários
Ah..
Acho que nunca usei esse tipo de chave, mas atualizei mesmo assim.
Vi isso e já atualizei direto para a 0.81 haha
Comentários do Hacker News
A seguir está um resumo dos comentários do Hacker News:
ktambém deveria ser aleatório de 521 bits, mas o PuTTY usava apenas 512 bits aleatórios, preenchendo os 9 bits mais altos com 0. Isso pode levar ao vazamento da chave privada por meio de álgebra linear.qao resultado do hash SHA-512. Parecia melhor usar apenas a quantidade necessária de bits, ou então fazer hash da mensagem e da chave privada separadamente antes de combinar os resultados.