25 de julio de 2012

DNS Spoofing en Android (CVE-2012-2808)

Ayer se publicó una vulnerabilidad de DNS Spoofing (CVE-2012-2808) que afecta a todos los dispositivos Android con versiones del sistema operativo 4.0.4 y anteriores (la última versión 4.1.1 Jelly Bean que a día de hoy tan sólo usa el Nexus 7 no es vulnerable a este ataque).

El ataque consiste en el uso de un algoritmo de generación de números pseudoaleatorios (PRNG) débil para calcular el puerto de origen del paquete que realiza la consulta DNS y el identificador TXID de dicha petición.

Recordando cómo funciona el protocolo DNS, cada vez que se realiza una consulta DNS se genera un paquete que tiene un identificador único, el TXID, y se envía desde un puerto origen diferente cada vez. Ambos valores deben de ser aleatorios para evitar que un posible atacante pueda responder al cliente antes de que lo haga el servidor DNS legítimo.

Ambos valores tienen una longitud de 32 bits que "asegura" que no se pueden predecir, pero investigadores de IBM han determinado que, con el algoritmo que utiliza Android, tan sólo 21 de esos bits son realmente aleatorios. La causa, que se utiliza la hora en milisegundos del dispositivos como una de las bases para generar el valor final. Esto unido a que cada consulta DNS tiene dos valores aleatorios (el TXID y el puerto) es relativamente sencillo estimar uno a partir del otro.

Es más, depués de un determinado tiempo (en la PoC que han realizado es de unos 10 minutos), es posible predecir con una certeza suficientemente alta los próximos valores. A partir de ese momento es cuando se produciría el ataque DNS Spoofing ya que el atacante podría comenzar a responder al dispositivo móvil con el TXID y en el puerto origen correctos.

Os dejo el vídeo con la PoC y el enlace con el advisory oficial

Resumen: http://blog.watchfire.com/wfblog/2012/07/android-dns-poisoning-randomness-gone-bad-cve-2012-2808.html
Paper: http://blog.watchfire.com/files/androiddnsweakprng.pdf