21 junio 2012

MD5, Certificados y viceversa

Poco a poco se van conociendo más detalles sobre el ataque criptográfico que está tras el certificado 'rogue' que emplea Flame.

Sergio de los Santos, lo ha bordado en sus explicaciones sobre el affaire aquí y aquí. Poco más hay que añadir a sus explicaciones.

No obstante, si que merece la pena repasar un poco la teoría de este tipo de ataques, los diferentes tipos y sus vectores.

Desde el famoso ataque del 2008 a MD5 hasta hoy, el término 'colisiones' se ha empleado concienzudamente para definir un tipo de ataque. Erróneamente mucha gente asocia este ataque como el único del que puede adolecer un algoritmo de 'hashing', e incluso confunde este ataque con otros.

De entrada, vamos a poner en liza los actores de esta película:

Dato1 --> HashDato1

Dato2 --> HashDato2

Donde 'Dato' puede ser cualquier cosa que se pueda resumir en un hash, puede ser un fichero o puede ser los campos de un certificado digital.

Ataques a algoritmos de hash

De entrada, hay que comentar que todos los algoritmos de hashing son vulnerables a este tipo de ataques. Evidentemente en su resistencia a este tipo de ataques estriba lo mas o menos aptos. Lo que define su resistencia es lo 'computacionalmente factible' que resulta ejecutarlos.

En el momento que un dato de tamaño arbitrario X ha de ser resumido en un hash de longitud fija, se abre la puerta a que existan diferentes tipos de datos que resulten en una mismo hash.

Ataque de tipo 'Primera preimagen' : Tomando como referencia los actores mencionados anteriormente, un ataque de 'primera preimagen' es aquel en el que, conociendo HashDato1, un atacante es capaz de generar un mensaje (Dato2) capaz de generar el mismo hash.

Ataque de tipo 'Segunda preimagen': En este caso el dato a tener en cuenta es 'Dato1' y el ataque estriba en la capacidad de generar un Dato2 que compute en un hash idéntico al de Dato1

Ataque de tipo Colisiones: En este tipo de ataques, el atacante tiene el control sobre Dato1 y Dato2 y mediante la manipulación de ambos, es capaz de generar un Dato1 y Dato2 diferentes entre si, pero que computen en un mismo resultado ante la función de hash.

Los ataques de tipo 'Preimagen' son los menos frecuentes y mas costosos a nivel computacional, y además los más dañinos. El poder generar un Dato2 con su correspondiente HashDato2 idéntico a HashDato1 a partir de simplemente un Dato1 o HashDato1, sería realmente dañino y motivo para anular cualquier tipo de algoritmo de hashing.

Los ataques de tipo 'colisiones', como se ha podido ver en el affaire Flame y en el incidente del 2008, si son factibles pero requieren que el atacante mantenga el control sobre Dato1 y Dato2. 

Y aquí está la clave de todo el asunto. Tanto en el caso Flame como en el anterior, el atacante tenía el control de ambos datos. ¿Cómo? Muy fácil, a la hora de pedir un certificado digital, la CA de turno no genera un certificado y te lo da, tu tienes que enviar lo que se conoce como CSR (Certificate Signing Request), es decir una petición de certificado con unos datos que controlas tu.

Y aquí está la gracia del asunto, empleando sofisticados ataques, pudieron generar un CSR 'ninja' que, una vez procesado por la CA, generaba un certificado perfectamente válido pero que, oh sorpresa, los campos podían ser modificados por los de otro certificado que generase el mismo hash que los campos entregados a la CA en el CSR

Por eso ha sido posible vulnerar ambas CAs y subvertidas para que generen certificados fraudulentos, porque empleaban un algoritmo de hash deficiente y porque los atacantes manipularon de forma realmente ingeniosa las peticiones de certificado para conseguir llevar a cabo un ataque de tipo 'colisiones'