En la implementación de la función hash criptográfica SHA-3 (Keccak), propuesta en el paquete XKCP (eXtended Keccak Code Package), se ha encontrado una vulnerabilidad (CVE-2022-37454), que puede llevar a un desbordamiento de buffer durante el procesamiento de ciertos datos específicamente formateados. El problema es causado por un error en el código de la implementación concreta de SHA-3 y no por una vulnerabilidad en el algoritmo en sí. El paquete XKCP se presenta como la implementación oficial de SHA-3, se desarrolla con la participación del equipo de desarrolladores de Keccak y se utiliza como base en funciones para trabajar con SHA-3 en diversos lenguajes de programación (por ejemplo, el código de XKCP se utiliza en el módulo hashlib de Python, en el paquete digest-sha3 de Ruby y en las funciones hash_* de PHP).
Según el investigador que descubrió el problema, logró explotar la vulnerabilidad para violar las propiedades criptográficas de la función hash y encontrar la primera y segunda preimagen, así como determinar colisiones. Además, se afirma que se ha creado un prototipo de exploit que permite ejecutar código al calcular el hash de un archivo especialmente diseñado. Potencialmente, la vulnerabilidad también puede ser utilizada para ataques a algoritmos de verificación de firmas digitales que utilizan SHA-3 (por ejemplo, Ed448). Se planea publicar más detalles sobre los métodos de ataque más adelante, tras la eliminación generalizada de la vulnerabilidad.
No está claro hasta qué punto la vulnerabilidad afecta a las aplicaciones existentes en la práctica, ya que para que el problema se manifieste, el código debe aplicar el cálculo cíclico del hash en bloques y uno de los bloques procesados debe tener un tamaño cercano a 4 GB (no menos de 2^32 - 200 bytes). El problema no se manifiesta al procesar los datos de entrada de una vez (sin calcular el hash en partes secuencialmente). Como método de protección más simple, se sugiere limitar el tamaño máximo de los datos involucrados en una sola iteración del cálculo del hash.
La vulnerabilidad es causada por un error en el procesamiento por bloques de datos de entrada. Debido a una comparación incorrecta de valores con el tipo «int», se determina un tamaño incorrecto de los datos que se esperan procesar, lo que conduce a escribir más allá del búfer asignado. En concreto, en la comparación se utilizó la expresión «partialBlock + instance->byteIOIndex», que al tener grandes valores en las partes individuales provocaba un desbordamiento entero. Además, en el código había un casting incorrecto «(unsigned int)(dataByteLen - i)», que llevaba a un desbordamiento en sistemas con un tipo size_t de 64 bits.
Ejemplo de código que provoca un desbordamiento: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())
Fuente: opennet.ru
