Peligros ocultos de las funciones hash: ataques de extensión de longitud y riesgos de seguridad del lado del servidor

Introducción

El ataque de extensión de longitud es un ataque relacionado con las propiedades de ciertos tipos de funciones hash (como MD5, SHA-1 y SHA-2). En pocas palabras, este ataque aprovecha el hecho de que conociendo H(mensaje) y la longitud del mensaje, podemos calcular fácilmente H(mensaje || relleno || extensión) sin conocer el mensaje en sí. Donde "||" representa una conexión, se agrega "relleno" de acuerdo con las disposiciones de la función hash.

Esto se debe a que estas funciones hash utilizan la estructura Merkle-Damgård, que divide la entrada en varios bloques, y el valor hash de cada bloque depende del valor hash del bloque anterior. Esto significa que una vez que calculamos el hash de un determinado mensaje, tenemos un estado desde el cual podemos comenzar y agregar más bloques.

Un modo de verificación del lado del servidor

Para facilitar la descripción del escenario de vulnerabilidad, primero asumimos que existe un modo de autenticación del lado del servidor, es decir, cuando el usuario intenta iniciar sesión, el servidor pasará un hash específico basado en el ID, el nombre y el nombre del usuario. una clave de 30 dígitos conocida sólo por el servidor. El algoritmo genera un valor hash y lo envía al cliente. Más tarde, cuando el cliente intenta acceder a algunas interfaces específicas, como la interfaz para modificar los permisos del usuario, el servidor regenerará el hash para verificación en función del ID del rol, el nombre del rol, los permisos del rol y la misma clave de 30 dígitos del frente. -finalizar ENVIAR. Si el hash cargado es consistente con el hash generado por el servidor, la verificación se considera exitosa y los permisos del nuevo rol se escriben en la base de datos.

Para facilitar la comprensión, aquí hay algunos códigos simples escritos según la descripción a modo de ejemplo:

Pensar más allá de la autoridad

Debido a vulnerabilidades en el modo de verificación, un atacante puede eludir la verificación de permisos reconstruyendo la solicitud de transacción sin conocer la clave secreta. La idea central de un ataque no autorizado es aprovechar las características de los ataques de expansión de longitud. El atacante primero necesita obtener el valor hash original y calcular la longitud de los datos originales mediante un algoritmo iterativo simple. Una vez que se obtiene esta información, se pueden agregar parámetros adicionales no autorizados a los datos originales y se puede usar el mismo algoritmo hash para generar hashes maliciosos.

Principio del ataque de extensión de longitud

El ataque de extensión de longitud se produce debido al mecanismo interno de algunas funciones hash. Estas funciones primero dividen los datos en fragmentos de longitud fija antes de procesar los datos de entrada y luego rellenan al final de cada fragmento para cumplir con requisitos específicos. Este diseño permite a un atacante construir un nuevo valor hash efectivo rellenando y agregando nuevos datos mientras conoce el valor hash y la longitud del mensaje original.

Tomemos como ejemplo SHA-256, que funciona en bloques de 512 bits. Para datos cuya longitud no sea múltiplo de 512 bits, se requiere relleno. Sus reglas de llenado son las siguientes:

  1. Agregue un bit "1" al final de los datos;

  2. Agregue una cierta cantidad de bits "0", de modo que la longitud del módulo de datos 512 sea igual a 448 (para más detalles, consulte [1] );

  3. Agregue un bloque de 64 bits de longitud al final, que indica la longitud de los datos originales.

En resumen, se añade un "1" seguido de m "0", más un entero de 64 o 128 bits al final del mensaje para producir un mensaje de relleno de longitud 512*n. El número entero añadido es la longitud del mensaje original. Luego, la función hash procesa el mensaje de relleno en n bloques de 512 bits.

Método de construcción

En este ejemplo, usaremos el código mencionado en la imagen de arriba como un escenario específico, donde la cadena de datos es data="user_id=1&user_name=aa" y la clave es SecretKey="Length_extension\ _attack\ _secreto". El servidor analizará el campo de datos en los datos cargados y analizará los parámetros requeridos user_id y user_name a través del delimitador &. Si el campo de rol existe, el servidor también obtendrá el valor de este campo. Luego, el servidor codifica todos los campos con la SecretKey y la compara con el hash de verificación cargado. Si los valores hash son consistentes, se considera que los parámetros cumplen con las reglas y se usan directamente.

Primero, iniciamos sesión en la interfaz loginHandler para obtener el valor hash hash="37d310d3465506486431fb2c2eb163f0f470479703f66dc9e5fdead8a3390c68" generado usando SHA-256 en función de los datos y SecretKey.

A continuación, veremos la dificultad de craqueo. Tomando nuestra situación de prueba como ejemplo, de acuerdo con el principio del ataque de extensión de longitud, siempre que conozcamos la longitud de H (mensaje) y el mensaje, podemos agregar nuevos datos mediante el ataque de extensión de longitud. El mensaje original = SecretKey + datos, ahora ya tenemos H (mensaje) en la mano, solo necesitamos saber la longitud del mensaje para construir un nuevo valor hash. Dado que SecretKey es una clave de 30 bits, sólo se necesitan 30 iteraciones para conocer la longitud del mensaje real. Por lo tanto, podemos construir fácilmente un nuevo valor hash. Como necesitamos usar permisos de administrador, debemos unir el campo malicioso "&role=admin" en los datos originales.

Podemos aprovechar la función de ataque de extensión de longitud para agregar nuevos datos y generar un nuevo valor hash sin conocer la clave secreta. Aquí se utiliza una biblioteca que ya implementa esta funcionalidad. [2] para completar la prueba. Luego use la herramienta para generar un nuevo valor hash.

Dado que la verificación de la interfaz de adminActionHandler verifica el hash según el usuario_id, el usuario_nombre y la función cargados, los datos que cargamos en este momento son usuario_id=1, usuario_name=aa\x80\x00\x00\x00 \ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x70 y rol=admin, como se muestra en la siguiente figura:

El valor hash es 84ae4ae437eeabf3bd8a26294392770b86f64a81998194156ac003d58a21acd0. Luego puede llamar a la interfaz adminActionHandler. Después de recibir los datos, el servidor comparará el hash cargado con sha256 (SecretKey + fakeData) y realizará algunas operaciones confidenciales después de pasar la verificación. De esta manera, evitamos con éxito la verificación del lado del servidor mediante el uso del ataque de extensión de longitud y realizamos la operación no autorizada.

Otros posibles escenarios de ataque

1. Verificación de la integridad del archivo: Si la integridad del archivo se verifica concatenando la clave y el contenido del archivo, y luego aplicando un hash, entonces un atacante puede expandir el archivo y generar un hash válido, evitando así las comprobaciones de integridad;

**2. Seguridad de aplicaciones web: **En aplicaciones web, si se utiliza una función hash vulnerable a ataques de extensión de longitud para verificar los datos enviados por los usuarios, los atacantes pueden aprovechar esto para enviar datos maliciosos;

3. Firmas digitales: En algunos esquemas de firma digital, si la firma se genera concatenando la clave privada y el mensaje y luego aplicando hash, es posible que un atacante expanda el mensaje y genere una firma válida;

**4. Almacenamiento de contraseñas: **Aunque es poco común, si la contraseña se almacena concatenando una clave (como un salt) y la contraseña, y luego aplicando hash, un atacante puede intentar descifrarla usando una contraseña de ataque de extensión de longitud.

Cómo prevenir

1. Elija una función hash que no sea susceptible a ataques de extensión de longitud, como SHA-3;

**2. Utilice HMAC: **HMAC requiere una clave y un mensaje como entrada. El resultado de salida depende tanto de la clave como del mensaje, por lo que el atacante no puede realizar un ataque de extensión de longitud sin conocer la clave. ;

**3. Fortalecer la verificación de autoridad: **Agregue pasos adicionales de verificación de autoridad en el lado del servidor, como el uso de autenticación multifactor.

Las siguientes son las características de algunos algoritmos Hash de uso común:

| Algoritmo | Resistencia a la colisión | Ataque de colisión con prefijo seleccionado | Resistencia a la preimagen | Ataque de extensión de longitud | | --- | --- | --- | --- | --- | | MD5 | 2^18 | 2^39 | 2^123,4 | Vulnerable | | SHA-1 | 2^61.2 | 2^63.4 | 2^160 | Vulnerable | | SHA-256 (SHA-2) | 2^65.5 | - | 2^254.9 | Vulnerable| | SHA-512 (SHA-2) | 2^32.5 | - | 2^511.5 | Vulnerable| | SHA-3 | 2^50 | - | Desconocido | No vulnerable | | BLAKE2s | 2^112 | - | 2^241 | No vulnerable | | BLAKE2b | 2^224 | - | 2^481 | No vulnerable |

Conclusión

Una defensa eficaz contra los ataques de extensión de longitud es utilizar funciones hash que sean inmunes a dichos ataques, como SHA-3 y BLAKE2. Además, también se puede proteger mediante la estructura HMAC (código de autenticación de mensaje hash con clave). Estas medidas pueden mejorar eficazmente la seguridad del sistema y garantizar la integridad de los datos y la estabilidad de las aplicaciones.

Link de referencia:

[1]

[2]

Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
  • Recompensa
  • Comentar
  • Republicar
  • Compartir
Comentar
0/400
Sin comentarios
  • Anclado
Opera con criptomonedas en cualquier momento y lugar
qrCode
Escanee para descargar la aplicación Gate
Comunidad
Español
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)