Español | English
rss facebook linkedin Twitter

Data (Un)Protection en iOS

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.


Jose Selvi
Dept. ACSS S21sec
Twitter / Blog

(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login