viernes, 11 de enero de 2013

Data (Un)Protection en iOS

NOTA: Est post lo publiqué hace unos días en el blog de S21sec, pero lo pongo también aquí para tener todos mis posts "juntitos".

Para los que no estén familiarizados con los sistemas iOS: Data Protection es uno de los mecanismos que ofrece Apple para proteger la información crítica que es almacenada internamente en el dispositivo. Su objetivo es evitar que contraseñas, certificados u otro tipo de información sea recuperada de un dispositivo perdido o robado. Para ello, Apple ha creado una serie de clases mediante las cuales es posible cifrar la información de diferentes maneras en función de su necesidad de accesibilidad: 
  • When unlocked: La información se encuentra cifrada con una clave derivada del UID (clave única del dispositivo) y del Passcode elegido por el usuario, por lo que únicamente es accesible después de que el dispositivo haya sido desbloqueado por el usuario. 
  • While locked: No es habitual, pero está pensado para información que deba ser accedida mientras el dispositivo está bloqueado. 
  • After first unlock: Es muy similar a "When unlocked", con la diferencia de que la clave de cifrado, derivada del UID y del Passcode, no es eliminada de la memoria al bloquear el dispositivo. 
  • Always: La información se encuentra cifrada únicamente con el UID, con lo que es posible acceder a ella siempre, pero únicamente desde este dispositivo, ya que el UID es único a cada dispositivo iOS y este no es accesible por software. 
Los desarrolladores son, por lo tanto, responsables de escoger el tipo de protección que quieren para la información de sus aplicaciones. En el caso de la propia Apple, según indican en el documento oficial de seguridad en iOS, estos son los aplicados:


Como sucede siempre, la usabilidad se encuentra reñida con la seguridad, así que nos encontramos con que si queremos permanecer conectados a una Wifi, recibir correo electrónico, recibir mensajes instantáneos, etc, es necesario que sus claves sean accesibles aunque el dispositivo se encuentre bloqueado. Al menos, la accesibilidad "After first unlock" hace que, tras un reinicio, sea necesario introducir el Passcode una primera vez para que esta información se encuentre disponible.

Sin embargo, si un desarrollador no tiene cuidado con la clase elegida, puede encontrarse con que su información podría ser accedida sin necesidad ni tan siquiera de averiguar el Passcode empleado por el usuario. Es el caso, por ejemplo, de los certificados VPN, que como podemos ver les está asignada una accesibilidad "Always", lo cual quiere decir que son accesibles en cualquier momento, aunque nadie haya introducido el Passcode.

Si hemos obtenido el control de un dispositivo iOS, una de las acciones que podemos querer realizar es volcar el contenido del KeyChain, que es donde se almacenan las credenciales, como por ejemplo las de Wifi o los propios certificados de la VPN. Para ello podemos usar la herramienta iphone-dataprotection que debemos ejecutar desde el propio dispositivo, para que este pueda descifrar usando el propio UID:

# ./keychain_dump
Writing 10 passwords to genp.plist
Writing 0 internet passwords to inet.plist
Writing 6 certificates to cert.plist
Writing 3 keys to keys.plist


Esto nos va a devolver toda la información a la que podemos acceder en nuestra situación actual. En este caso se trata de un iOS que se encuentra bloqueado con Passcode, pero que ya ha sido desbloqueado una primera vez, así que si buscamos en los ficheros plist generados podremos ver, como comentábamos antes, algunos certificados VPN e incluso claves como puedan ser las claves de las Wifis a las que ha estado conectado:


Esto es todo lo que podemos obtener SIN conocer el Passcode del usuario pero... ¿y si podemos averiguarlo? ¿y si el usuario ha elegido un Passcode demasiado trivial? Eso ya será otro post.

5 comentarios :

Unknown dijo...

mmm... muy interesante tu articulo... Si no me equivoco, si el dispositivo no tiene pass, eso supone abrirle las puertas al enemigo no? xD

Por cierto, siempre he tenido una curiosidad por saber donde almacena iOS el pass del usuario, y si hay alguna forma de poder juguetear con eso... xD

Jose Selvi dijo...

@Valentin: Gracias! Efectivamente, si el dispositivo no tiene pass entonces estás bastante desprotegido.

¿Te refieres al Passcode que introduce el usuario para desbloquear el dispositivo? ¿O a las contraseñas del usuario root o mobile?

En el caso del Passcode (imagino que te refieres a eso), no lo he mirado por mi mismo a bajo nivel, pero de la documentación de Apple que he leido deduzco que no se guarda como tal, sino que se usa para cifrar una clave que se emplea para el cifrado de otros elementos del sistema. Si el Passcode que metes es incorrecto, esa clave se descifra incorrectamente, y por lo tanto no se puede acceder.

Unknown dijo...

Si, me refería a eso... Pues la verdad es que es un sistema de codificación bastante ingenioso, estaría muy bien poder conseguir ese archivo encriptado y probar a hacer un ataque de fuerza bruta sobre él desde un PC, ya que desde el iOS hay un límite y se bloquea...

Había visto algo por allí muy muy muy interesante (Micro Systemation XRY), pero nunca consegui ponerle mano... xD

Jose Selvi dijo...

@Valentin: El problema es que ninguna clave esta cifrada SOLO con el Passcode, para evitar precisamente que hagas eso. Hay claves que están cifradas sólo con el UID del dispositivo, pero las que están cifradas con el Passcode también lo están con el UID, para evitar que te lo puedas llevar y hacer fuerza bruta off-line.

Unknown dijo...

joooooo, pero yo quiero tontear con eso....... jajajaj ;)