4 pontos por GN⁺ 2024-04-16 | 4 comentários | Compartilhar no WhatsApp

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

 
tominam2 2024-04-16

Ah..

 
kuroneko 2024-04-16

Acho que nunca usei esse tipo de chave, mas atualizei mesmo assim.

 
dlehals2 2024-04-16

Vi isso e já atualizei direto para a 0.81 haha

 
GN⁺ 2024-04-16
Comentários do Hacker News

A seguir está um resumo dos comentários do Hacker News:

  • Foi descoberta uma vulnerabilidade na forma como o PuTTY gera chaves ECDSA P-521. Ao usar um módulo de 521 bits, o valor k també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.
  • A postura honesta e clara do desenvolvedor do PuTTY, Simon Tatham, ao divulgar a vulnerabilidade foi muito elogiada. Ele transmitiu os fatos como são, sem desculpas nem minimização.
  • Faltou uma explicação de contexto sobre como a vulnerabilidade foi descoberta.
  • As versões mais recentes do Windows já incluem o OpenSSH por padrão, então não é mais necessário usar o PuTTY. Ainda assim, muita gente continua usando por hábito ou inércia.
  • Provavelmente não há tantas pessoas que tenham escolhido esse tipo de chave em vez de usar o padrão.
  • Se você estiver usando uma chave de host P521, talvez seja necessário trocá-la após atualizar o cliente.
  • Vale considerar a migração para EdDSA, que não requer RNG nem operações modulares.
  • Algumas pessoas perceberam só agora que o nome PuTTY vem de putty, a massa usada para fixar vidros em janelas.
  • Houve quem não entendesse por que o PuTTY aplicava uma operação modular por q ao 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.
  • Também houve curiosidade sobre o princípio por trás da afirmação de que usar um número com os 9 bits mais altos em 0, em vez de um número aleatório de 521 bits, permitiria vazar a chave privada após 60 assinaturas.