En criptografía , el ataque Fluhrer, Mantin y Shamir es un ataque de cifrado de flujo al ampliamente utilizado cifrado de flujo RC4 . El ataque permite a un atacante recuperar la clave en un flujo cifrado RC4 a partir de una gran cantidad de mensajes en ese flujo.
El ataque de Fluhrer, Mantin y Shamir se aplica a métodos de derivación de claves específicos, pero no se aplica en general a SSL basado en RC4 (TLS) , ya que SSL genera las claves de cifrado que utiliza para RC4 mediante hash, lo que significa que diferentes sesiones SSL tienen claves no relacionadas. [1] Sin embargo, el ataque de bar mitzvah estrechamente relacionado , basado en la misma investigación y revelado en 2015, explota aquellos casos en los que el proceso de codificación SSL genera claves débiles .
El ataque Fluhrer, Mantin y Shamir (FMS), publicado en su artículo de 2001 "Debilidades en el algoritmo de programación de claves de RC4", [2] aprovecha una debilidad en el algoritmo de programación de claves RC4 para reconstruir la clave a partir de mensajes cifrados. El ataque FMS ganó popularidad en herramientas de ataque de red como AirSnort, weplab y aircrack , que lo utilizan para recuperar la clave utilizada por redes inalámbricas protegidas con WEP .
Esta discusión utilizará el siguiente algoritmo de programación de claves RC4 (KSA).
comienza ksa(con int longitud de clave, con byte clave[longitud de clave]) para i de 0 a 255 S[i] := yo fin para j := 0 para i de 0 a 255 j := (j + S[i] + clave[i mod longitud de clave]) mod 256 intercambiar(S[i],S[j]) fin parafin
También se utilizará el siguiente algoritmo de generación pseudoaleatoria (PRGA).
comienza prga(con byte S[256]) yo := 0 j := 0 mientras se genera la salida: yo := (yo + 1) mod 256 j := (j + S[i]) módulo 256 intercambiar(S[i],S[j]) salida S[(S[i] + S[j]) mod 256] mientras tantofin
La base del ataque FMS reside en el uso de vectores de inicialización débiles (IV) utilizados con RC4. RC4 cifra un byte a la vez con una salida de flujo de claves de prga() ; RC4 utiliza la clave para inicializar una máquina de estados a través de ksa() , y luego modifica continuamente el estado y genera un nuevo byte del flujo de claves a partir del nuevo estado. Teóricamente, el flujo de claves funciona como un pad aleatorio de un solo uso , ya que un generador de números pseudoaleatorios controla la salida en cada paso.
Con ciertos IV, un atacante que conoce el primer byte del flujo de claves y los primeros m bytes de la clave puede derivar el ( m + 1)º byte de la clave debido a una debilidad en el KSA. Debido a que el primer byte del texto sin formato proviene del encabezado SNAP de WEP , un atacante puede asumir que puede derivar el primer byte del flujo de claves de B ⊕ 0x AA (el encabezado SNAP es casi siempre 0xAA). A partir de allí, solo necesitan un IV en la forma ( a + 3, n − 1, x ) para el índice de clave a igual a 0, el espacio de valor del elemento n igual a 256 (ya que 8 bits forman un byte) y cualquier x . Para comenzar, el atacante necesita IV de (3, 255, x ). WEP utiliza IV de 24 bits, lo que hace que cada valor tenga una longitud de un byte.
Para comenzar, el atacante utiliza el IV como los primeros 3 elementos en K[ ]. Llena la S-box S[ ] con valores secuenciales de 0 a n como lo hace RC4 al inicializar la S-box a partir de un K[ ] conocido. Luego, realiza las primeras 3 iteraciones de ksa() para comenzar a inicializar la S-box.
Después del tercer paso, el atacante puede posiblemente, pero no definitivamente, derivar el cuarto byte de la clave usando la salida del flujo de clave O calculando (O − j − S [ i ]) mod n = K [ i ], con el valor i = 3 en este paso.
En este punto, el atacante aún no tiene el cuarto byte de la clave. Este algoritmo no regenera el siguiente byte de la clave, sino que genera un posible valor de la clave. Al recopilar varios mensajes (por ejemplo, paquetes WEP) y repetir estos pasos, el atacante generará una serie de posibles valores diferentes. El valor correcto aparece con mucha más frecuencia que cualquier otro; el atacante puede determinar el valor de la clave al reconocer este valor y seleccionarlo como el siguiente byte. En este punto, puede comenzar el ataque nuevamente en el quinto byte de la clave.
Aunque el atacante no puede atacar palabras de la clave fuera de orden, puede almacenar mensajes para un ataque secuencial posterior sobre palabras posteriores una vez que conozca las palabras anteriores. Nuevamente, solo necesita mensajes con IV débiles y puede descartar otros. A través de este proceso, puede reunir una gran cantidad de mensajes para atacar la clave completa; de hecho, puede almacenar solo una pequeña porción del comienzo de esos mensajes, lo suficiente para llevar a cabo el ataque hasta donde la palabra de la clave que el IV le permita atacar.