Na implementação da função hash criptográfica SHA-3 (Keccak), proposta no pacote XKCP (eXtended Keccak Code Package), foi identificada uma vulnerabilidade (CVE-2022-37454) que pode levar a um estouro de buffer durante o processamento de dados especificamente formatados. O problema é causado por um erro no código da 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, desenvolvida com a participação da equipe de desenvolvedores do Keccak e utilizada como base em funções de trabalho com SHA-3 em várias linguagens de programação (por exemplo, o código do XKCP é utilizado no módulo hashlib do Python, no pacote digest-sha3 do Ruby e nas funções hash_* do PHP).
De acordo com o pesquisador que identificou o problema, ele conseguiu explorar a vulnerabilidade para comprometer as propriedades criptográficas da função hash e encontrar a primeira e segunda pré-imagem, bem como determinar colisões. Além disso, foi relatada a criação de um protótipo de exploit, permitindo a execução de código ao calcular o hash de um arquivo especificamente formatado. Potencialmente, a vulnerabilidade também pode ser utilizada para ataques em algoritmos de verificação de assinaturas digitais que utilizam o SHA-3 (por exemplo, Ed448). Detalhes sobre os métodos de ataque serão publicados posteriormente, após a eliminação abrangente da vulnerabilidade.
Ainda não está claro como a vulnerabilidade afeta aplicativos existentes na prática, pois para que o problema se manifeste no código, deve-se aplicar o cálculo cíclico do hash em blocos, e um dos blocos processados deve ter um tamanho de cerca de 4 GB (não menos de 2^32 — 200 bytes). Durante o processamento de dados de entrada em uma única vez (sem o cálculo sequencial do hash em partes), o problema não se manifesta. Como o método de proteção mais simples, sugere-se limitar o tamanho máximo dos dados envolvidos em uma única iteração de cálculo do hash.
A vulnerabilidade é causada por um erro no processamento em blocos de dados de entrada. Devido à comparação incorreta de valores do tipo "int", o tamanho dos dados a serem processados é determinado incorretamente, levando à gravação de dados além do espaço alocado do buffer. Em particular, a expressão "partialBlock + instance->byteIOIndex" foi utilizada na comparação, o que, com grandes valores das partes, resultava em um estouro inteiro. Além disso, o código continha um casting de tipo incorreto "(unsigned int)(dataByteLen - i)", que levava a estouros em sistemas com o tipo size_t de 64 bits.
Exemplo de código que leva a estouro: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())
Fonte: opennet.ru
