Vulnerabilidade na biblioteca com a implementação principal do algoritmo SHA-3

Uma vulnerabilidade (CVE-3-2022) foi identificada na implementação da função hash criptográfica SHA-37454 (Keccak) oferecida no pacote XKCP (eXtended Keccak Code Package), que pode levar a um buffer overflow durante o processamento de determinados dados formatados. O problema é causado por um bug no código de uma implementação específica do SHA-3, e não por uma vulnerabilidade no próprio algoritmo. O pacote XKCP é apresentado como a implementação oficial do SHA-3, desenvolvido com a contribuição da equipe de desenvolvimento Keccak e usado como base para funções SHA-3 em várias linguagens de programação (por exemplo, o código XKCP é usado no hashlib Python módulo, o pacote Ruby digest sha3 e funções PHP hash_*).

Segundo o pesquisador que identificou o problema, ele conseguiu usar a vulnerabilidade para violar as propriedades criptográficas da função hash e encontrar a primeira e a segunda pré-imagens, além de detectar colisões. Além disso, foi anunciado que será criado um protótipo de exploração que permitirá a execução de código ao calcular o hash de um arquivo especialmente projetado. A vulnerabilidade também poderia ser potencialmente usada para atacar algoritmos de verificação de assinatura digital que usam SHA-3 (por exemplo, Ed448). Os detalhes dos métodos de ataque estão planejados para serem publicados posteriormente, depois que a vulnerabilidade for eliminada em todos os lugares.

Ainda não está claro o quanto a vulnerabilidade afeta as aplicações existentes na prática, pois para que o problema se manifeste no código, devem ser utilizados cálculos de hash cíclicos em blocos e um dos blocos processados ​​deve ter cerca de 4 GB de tamanho (pelo menos 2^32 - 200 bytes). Ao processar os dados de entrada de uma só vez (sem calcular sequencialmente o hash em partes), o problema não aparece. Como método mais simples de proteção, propõe-se limitar o tamanho máximo dos dados envolvidos em uma iteração do cálculo do hash.

A vulnerabilidade é causada por um erro no processamento de blocos de dados de entrada. Devido à comparação incorreta de valores com o tipo "int", é determinado o tamanho incorreto dos dados pendentes, o que faz com que a cauda seja gravada além do buffer alocado. Em particular, a comparação utilizou a expressão “partialBlock + instance->byteIOIndex”, o que levou ao estouro de inteiros para grandes valores das partes constituintes. Além disso, havia uma conversão de tipo incorreta "(unsigned int)(dataByteLen - i)" no código, o que causava um estouro em sistemas com um tipo size_t de 64 bits.

Código de exemplo que causa estouro: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) imprimir(h.hexdigest())

Fonte: opennet.ru

Adicionar um comentário