domingo, 15 de abril de 2012

Diversión con CRC. Parte I

En el anterior artículo de esta serie describimos las bases de los algoritmos CRC para verificar errores de transmisión. Adicionalmente, dimos un ejemplo de cómo intentar usarlos para detectar modificaciones maliciosas intencionales sobre nuestras comunicaciones protegidas. Es importante destacar que la anterior discusión es bastante independiente al método de cifrado utilizado. Lease cualquier cifrado por bloques como AES, DES, 3DES, en cualquiera de los modos usuales, OFB, CBC, CTR, etc. En todas estas "modalidades" de encripción, en algún momento, terminamos haciendo "XOR" a nuestro texto en claro, con algún tipo de "cadena pseudo-aleatoria". Los detalles son distintos y las posiciones de inyección en cada caso pueden ser diferentes, pero la idea de ataque descrita aplica exactamente de la misma forma.

En este artículo veremos tan sólo uno de los problemas que implica utilizar CRC para verificar modificaciones maliciosas. Recordemos el objetivo de nuestro atacante, i.e. modificar el texto interceptado de tal forma que el destinatario original no se de cuenta del cambio. El problema planteado al utilizar CRC es que ahora mi atacante necesita también modificar el código CRC si desea tener algún tipo de éxito en su estafa. Ahora bien, si nuestro atacante conociera el contenido completo del texto que está cifrado, su tarea sería muy sencilla.

El primer paso sería calcular el CRC que tiene el mensaje original, calcular el CRC que tendría el mensaje modificado, y tratar al CRC viejo y al nuevo de la misma forma con que se trata a las palabras "sur" y "nor:


Es decir, el viejo CRC viene a jugar el mismo personaje de la palabra "sur" y el nuevo CRC viene a jugar el mismo personaje que la palabra "nor". Exactamente la misma técnica. Despues de lo tan seguido espero que la idea sea más bien obvia: si al texto cifrado, le "quitamos" el texto en claro, mediante una operación XOR, y le agregamos el nuevo (también con una operación XOR), pues es fin del juego. Afortunadamente, esta técnica no le sirve a nuestro atacante, pues él sólo conoce una "parte" del texto en claro, i.e. la palabra "sur". Al no conocer el resto del texto, no tiene forma de calcular el "antiguo CRC" arriba. Aquí es donde viene lo interesante.

Resulta que por las propiedades de CRC, para cualquier par de cadenas de caracteres s1 y s2, el CRC del XOR es el XOR de los CRCs. En lenguaje matemático: CRC(s1 XOR s2) es igual a CRC(s1) XOR CRC(s2)! Esto es, la función XOR es "lineal". Si recordamos el primer artículo de esta serie, tal resultado no debería ser demasiado sorprendente. La suma, se transformó en un XOR pues estamos trabajando con coeficientes módulo 2, y el cálculo del CRC tenía en su corazon una simple determinación del residuo de una división por un polinomio. Es decir, (a + b) / c = ( a / c ) + ( b / c ), todos recordamos las propiedades distributivas de las sumas en la escuela, ¿no?

Bueno, si vamos a ser sumamente estrictos, en realidad esta última comparación no es exactamente correcta en el caso de CRC32, pero está muy cerca. Por cierto, si desean conocer todo y mucho más acerca del CRC, no hay nada mejor que este artículo. Sin lugar a dudas es la referencia más citada en toda la Internet.

Retomando el tema, resulta que nuestro atacante puede abusar esta propiedad de la función CRC, y calcular la modificación que debe hacerle al CRC cifrado directamente, sin conocer el CRC original en lo absoluto. Lo único que requiere es conocer la modificación que se le va a hacer a la cadena original. Si pensamos un poco la cuestion, la siguiente ecuación debería ser cierta:

CRC(texto ori XOR modificación) = CRC(texto original) XOR CRC(modificación)

Sin embargo, como habiamos mencionado antes, para el caso de CRC32 no es del todo así. Para hacer la historía corta, la respuesta final es simplemente que hay que calcular una especie de "CRC homogeneo", para que nuestra ecuación arriba se cumpla y podamos engañar a nuestros enemigos modificando sus mensajes cifrados. El cálculo de este CRC homogeneo que mencionamos no podría ser más sencillo. Lo único que hay que cambiar son los parámetros INITXOR y OUTXOR que describimos en el anterior artículo. Los nuevos valores para estos parametros no son nada mas que "0x00". Así de simple:



Nótese que el cálculo de esta "modificación" del XOR arroja exactamente el mismo resultado que cuando hicimos la modificación del CRC antiguo con el nuevo en nuestro primer intento de ataque. Espero que ni siquiera sea necesario convencerlos de que esto realmente funciona, pues debería ser evidente. Sin embargo, aquí esta la demostración en nuestra consola de python:



Resumen ejecutivo: la utilización de la función CRC para defendernos contra ataques activos sobre comunicaciones encriptadas no es efectiva. En este caso, para realizar una modificación al texto cifrado, lo único que se requiere es el cálculo del "CRC homogeneo" de la modificación que se desea hacer al texto para obtener la modificación que debe hacerse sobre el CRC cifrado y desconocido. Por si ésto fuera poco, en los siguientes artículos exploraremos aún más ataques sobre el uso de CRC en este tipo de situaciones. La diversión apenas comienza!

2 comentarios:

  1. I’ve been browsing on-line greater than three hours today, but I never discovered any attention-grabbing article like yours. It is beautiful worth sufficient for me. Personally, if all webmasters and bloggers made good content material as you did, the net will be a lot more helpful than ever before.



    Informatica Training in Chennai

    ResponderEliminar
  2. Superb. I really enjoyed very much with this article here. Really it is an amazing article I had ever read. I hope it will help a lot for all. Thank you so much for this amazing posts and please keep update like this excellent article.thank you for sharing such a great blog with us. expecting for your.
    Digital Marketing Company in India
    seo Company in India

    ResponderEliminar