Na conferência 39C3 (Chaos Communication Congress) que ocorre na Alemanha, foram revelados detalhes sobre 12 vulnerabilidades anteriormente desconhecidas e ainda não corrigidas (0-day) no GnuPG (GNU Privacy Guard), que fornece utilitários compatíveis com os padrões OpenPGP e S/MIME para criptografia de dados, manipulação de assinaturas eletrônicas, gerenciamento de chaves e acesso a repositórios públicos de chaves. As vulnerabilidades mais perigosas permitem contornar a verificação de assinatura digital e conseguem a execução de código ao processar dados criptografados na representação ASCII (ASCII Armor). Protótipos funcionais de exploits e patches prometem ser publicados posteriormente. Os identificadores CVE ainda não foram atribuídos.
As vulnerabilidades são causadas por erros no código para processar dados e analisar formatos, e não estão relacionadas a falhas em algoritmos de criptografia. Por exemplo, um erro no parser provoca uma falha ao determinar quais dados foram realmente assinados, criando condições nas quais os dados verificados podem não coincidir com os dados assinados, permitindo que um invasor substitua o texto aberto sem acesso à chave privada.
Problemas identificados:
- Um erro no código do parser de dados criptografados, distribuídos no formato ASCII-Armor (arquivos de texto com o bloco "BEGIN/END PGP ARMORED FILE"), resulta em gravação em uma área de memória fora dos limites do buffer. O problema pode levar à execução de código ao processar, no gpg, dados preparados especificamente. A vulnerabilidade se manifesta na função armor_filter() e é causada por um incremento duplo do contador "n" no loop "for" — apesar da instrução "n++" dentro do loop, o contador também é incrementado no corpo do loop ao gravar dados no buffer "buf[n++]". Como resultado, um byte extra é gravado além do limite do buffer, e a variável com o tamanho "ret_len" é atribuída a um valor que excede o real.
- A possibilidade de criar ou sobrescrever qualquer arquivo, conforme permitido pelas permissões de acesso atuais, devido ao processamento incorreto do conteúdo do campo "filename" no pacote de dados. A vulnerabilidade pode ser explorada para alavancar a execução de código no sistema ao executar os comandos "gpg —decrypt poc.enc" e "gpg poc.enc" para visualizar o arquivo poc.enc enviado pelo invasor. A execução de código pode ser alcançada, por exemplo, através da criação dos arquivos ~/ .bash_completion ou ~/ .ssh/authorized_keys.
- A capacidade de substituir o texto claro exibido ao usuário ao especificar a opção «—decrypt» e verificar usando assinaturas digitais fornecidas separadamente (Detached Signature, criadas com a opção «—detach-sig» e entregues em um arquivo sig separado). O problema é que, ao enviar separadamente a mensagem e o arquivo sig, um atacante que controla o tráfego intermediário (MITM) pode alterar o arquivo sig, após o qual a verificação permanecerá bem-sucedida, mas ao visualizar a mensagem do arquivo sig usando a opção «—decrypt», outro conteúdo será exibido. echo Plaintext > plaintext gpg —detach-sig plaintext # alteração plaintext.sig pelo atacante com a adição de texto adicional gpg —verify plaintext.sig plaintext # verificado gpg —decrypt plaintext.sig # verificado, mas exibe texto diferente
- A possibilidade de adicionar dados arbitrários a uma mensagem assinada mantendo a verificação bem-sucedida da assinatura. O problema surge devido ao truncamento de dados após 20000 caracteres ao calcular o hash.
- Verificação incorreta de códigos de criptografia autenticada (MDC — Modification Detection Codes), permitindo manipular pacotes criptografados de tal maneira que, ao descriptografar, o conteúdo obtido seja tratado como outro tipo de pacote (por exemplo, interpretado como uma chave pública destinada à publicação).
- A possibilidade de inserir dados adicionais em assinaturas CS (Cleartext Signature) criadas usando a flag «—not-dash-escaped» ou convertidas de assinaturas separadamente fornecidas (Detached Signature). A vulnerabilidade pode ser usada para criar uma falsa impressão ao usuário sobre quais dados foram realmente assinados. Por exemplo, o usuário pode baixar de fontes confiáveis uma chave correta para verificar a assinatura digital, mas um atacante durante um ataque MITM pode substituir a imagem ISO baixada pelo usuário e adicionar um hash adicional à assinatura da imagem, de maneira que a verificação da imagem adulterada passe com sucesso, desde que exista uma chave correta de verificação no sistema.
- Inserção de dados adicionais na representação ASCII de uma assinatura CS (Cleartext Signature) através da inserção de um caractere com código zero. A vulnerabilidade, por exemplo, permite inserir texto arbitrário no cabeçalho Hash.
- Interpretação incorreta do formato OpenPGP, que faz com que a mensagem «One-Pass Signed Message» em formato ASCII possa ser processada como uma mensagem «Cleartext Signature» após uma alteração específica no cabeçalho. A vulnerabilidade permite substituir os dados originais assinados por conteúdo malicioso, mantendo a aparência de verificação bem-sucedida.
- Ausência de separação explícita na saída de informações sobre o sucesso da verificação da assinatura digital e o conteúdo da mensagem, o que permite criar mensagens não assinadas falsificadas que, ao serem executadas via «gpg --decrypt», parecem autênticas.
- Possibilidade de criar mensagens OpenPGP que serão processadas de maneira diferente no gpg do que em outras implementações do OpenPGP. O problema é causado pela forma como são processadas strings muito longas nos dados OpenPGP em representação ASCII.
- Criação de condições durante a verificação da assinatura digital para reverter o algoritmo de verificação de hash para o inseguro SHA1.
- Possibilidade de inserir suas próprias chaves secundárias (subkey) sem autenticação usando o componente privado da chave mestra. O ataque é realizado por meio da adição de um repositório de chaves falso usando a opção «--keyring».
Duas vulnerabilidades adicionais foram identificadas no minisign, uma ferramenta simplificada para criação e verificação de assinaturas digitais. Ambas as vulnerabilidades (1, 2) permitem o uso de sequências de controle de terminal («\e[1E») ou caracteres especiais («\r») no campo de comentário para modificar a saída do programa, por exemplo, substituindo informações sobre o resultado da verificação.
Fonte: opennet.ru
