En criptografía y seguridad informática , un ataque de extensión de longitud es un tipo de ataque en el que un atacante puede usar Hash ( mensaje 1 ) y la longitud del mensaje 1 para calcular Hash ( mensaje 1 ‖ mensaje 2 ) para un mensaje 2 controlado por el atacante , sin necesidad de conocer el contenido del mensaje 1. Esto es problemático cuando el hash se usa como un código de autenticación de mensaje con la construcción Hash ( secreto ‖ mensaje ), [1] y mensaje y se conoce la longitud del secreto , porque un atacante puede incluir información adicional al final del mensaje y producir un hash válido sin conocer el secreto. Algoritmos como MD5 , SHA-1 y la mayoría de SHA-2 que se basan en la construcción Merkle–Damgård son susceptibles a este tipo de ataque. [1] [2] [3] Las versiones truncadas de SHA-2, incluidas SHA-384 y SHA-512/256 no son susceptibles, [4] ni tampoco el algoritmo SHA-3 . [5] HMAC también utiliza una construcción diferente y por lo tanto no es vulnerable a ataques de extensión de longitud. [6] Por último, simplemente realizar Hash ( mensaje ‖ secreto ) es suficiente para no verse afectado.
Las funciones de hash vulnerables funcionan tomando el mensaje de entrada y usándolo para transformar un estado interno. Una vez que se ha procesado toda la entrada, se genera el resumen de hash mostrando el estado interno de la función. Es posible reconstruir el estado interno a partir del resumen de hash, que luego se puede utilizar para procesar los nuevos datos. De esta manera, se puede extender el mensaje y calcular el hash que es una firma válida para el nuevo mensaje.
Se podría implementar un servidor para entregar waffles de un tipo específico a un usuario específico en una ubicación para manejar solicitudes del formato dado:
Datos originales: count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggoFirma original: 6d5f807e23db210bc254a28be2d6759a0f5f5d99
El servidor ejecutaría la solicitud dada (entregar diez waffles del tipo eggo a la ubicación dada para el usuario "1") solo si la firma es válida para el usuario. La firma utilizada aquí es una MAC , firmada con una clave desconocida para el atacante. [nota 1]
Es posible que un atacante modifique la solicitud en este ejemplo cambiando el waffle solicitado de " egg0 " a " liege ". Esto se puede hacer aprovechando una flexibilidad en el formato del mensaje si el contenido duplicado en la cadena de consulta da preferencia al último valor. Esta flexibilidad no indica una vulnerabilidad en el formato del mensaje, porque el formato del mensaje nunca fue diseñado para ser criptográficamente seguro en primer lugar, sin el algoritmo de firma para ayudarlo.
Datos nuevos deseados: count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo &waffle=liege
Para firmar este nuevo mensaje, normalmente el atacante necesitaría conocer la clave con la que se firmó el mensaje y generar una nueva firma generando una nueva MAC. Sin embargo, con un ataque de extensión de longitud, es posible introducir el hash (la firma proporcionada anteriormente) en el estado de la función hash y continuar donde se había quedado la solicitud original, siempre que se conozca la longitud de la solicitud original. En esta solicitud, la longitud de la clave original era de 14 bytes, lo que se podía determinar probando solicitudes falsificadas con varias longitudes supuestas y comprobando qué longitud da como resultado una solicitud que el servidor acepta como válida.
El mensaje que se introduce en la función hash suele contener un relleno , ya que muchos algoritmos solo pueden funcionar con mensajes de entrada cuya longitud sea un múltiplo de un tamaño determinado. El contenido de este relleno siempre lo especifica la función hash utilizada. El atacante debe incluir todos estos bits de relleno en su mensaje falsificado antes de que se alineen los estados internos de su mensaje y el original. Por lo tanto, el atacante construye un mensaje ligeramente diferente utilizando estas reglas de relleno:
Nuevos datos: count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo \x80\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00 \x00\x00\x02\x28&waffle=lieja
Este mensaje incluye todo el relleno que se agregó al mensaje original dentro de la función hash antes de su carga útil (en este caso, un 0x80 seguido de una cantidad de 0x00 y una longitud de mensaje, 0x228 = 552 = (14+55)*8, que es la longitud de la clave más el mensaje original, agregado al final). El atacante sabe que el estado detrás del par clave/mensaje hash para el mensaje original es idéntico al del nuevo mensaje hasta el "&" final. El atacante también conoce el resumen del hash en este punto, lo que significa que conoce el estado interno de la función hash en ese punto. Entonces es trivial inicializar un algoritmo hash en ese punto, ingresar los últimos caracteres y generar un nuevo resumen que pueda firmar su nuevo mensaje sin la clave original.
Nueva firma: 0e41270260895979317fff3898ab85668953aaa2
Al combinar la nueva firma y los nuevos datos en una nueva solicitud, el servidor verá la solicitud falsificada como una solicitud válida debido a que la firma es la misma que se habría generado si se hubiera conocido la contraseña.
A diferencia de SHA-1 y SHA-2, Keccak no tiene la debilidad de la extensión de longitud, por lo que no necesita la construcción anidada HMAC. En cambio, el cálculo MAC se puede realizar simplemente anteponiendo la clave al mensaje.