Keychain

General

Se utiliza para almacenar de forma cifrada información confidencial. El cifrado de datos se realiza automáticamente antes de que sean almacenados.

Directorio de almacenamiento.

/private/var/Keychains/keychain-2.db

Persistencia de datos

Cuando se desinstala una aplicación móvil, el dispositivo retiene los datos del keychain utilizados por la aplicación, a diferencia de los datos almacenados en el sandbox de la aplicación que si son eliminados.

En el caso que un usuario venda su dispositivo sin realizar un restablecimiento de este, el comprador del dispositivo puede obtener acceso a las cuentas y datos de las aplicaciones del usuario anterior reinstalando las mismas aplicaciones. Esto no requeriría ninguna habilidad técnica para poder realizarlo.

No existe una API que los desarrolladores puedan usar para forzar el borrado de los datos cuando se desinstala una aplicación móvil. En su lugar, los desarrolladores deben seguir los siguientes pasos para evitar que los datos del keychain persistan entre las instalaciones de la aplicación móvil:

  • Cuando una aplicación se inicia por primera vez después de la instalación, borrar todos los datos del keychain asociados con la aplicación móvil. Esto evitará que un segundo usuario en el mismo dispositivo acceda accidentalmente a las cuentas del usuario anterior.

  • Al desarrollar la funcionalidad de cierre de sesión para una aplicación móvil, asegúrese de que los datos del keychain se borren como parte del proceso de cierre de sesión de la cuenta. Esto permitirá a los usuarios borrar sus cuentas antes de desinstalar una aplicación.

Control de acceso

Accesibilidad

El atributo de accesibilidad permite controlar la disponibilidad del dato en relación con el estado de bloqueo del dispositivo. También permite especificar la elegibilidad para la restauración del dato, es decir, si el dato migrará o no a un dispositivo diferente después de restaurar una copia de seguridad

  • kSecAttrAccessibleAlways (deprecado)

  • kSecAttrAccessibleAlwaysThisDeviceOnly (deprecado)

  • kSecAttrAccessibleAfterFirstUnlock

  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly

  • kSecAttrAccessibleWhenUnlocked (predeterminado): solo permitirá acceder a los datos del keychain mientras el dispositivo este desbloqueado. En caso de robo del dispositivo y que este cuente con un código de acceso configurado, el atacante deberá desbloquear el dispositivo para que se descifren los datos del keychain. Si no se ingresa el código de acceso correcto, se impedirá que el atacante pueda descifrar los datos del keychain. Sin embargo, si el código de acceso no está configurado, el atacante solo necesita deslizar el dedo para desbloquear el dispositivo y obtener los datos del keychain descifrados. Por lo tanto, no aplicar un código de acceso en el dispositivo debilita el mecanismo de encriptación del keychain.

  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly

  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: solo permitirá acceder a los datos del keychain mientras el dispositivo este desbloqueado y se encuentre configurado un código de acceso en el dispositivo. No permite almacenar datos en el dispositivo sin un código de acceso configurado en el dispositivo y al deshabilitar el código de acceso del dispositivo hará que se eliminen los datos. Los datos con este atributo no migran a un nuevo dispositivo, es decir, después de restaurar una copia de seguridad en un dispositivo diferente, estos datos no estarán. Es importante considerar que este nivel de accesibilidad exigirá que el dispositivo siempre tenga configurado un código de acceso.

Autenticación

El atributo de autenticación permite solicitar al usuario que demuestre su presencia, es decir, requerir datos biométricos, como Touch ID o Face ID, o un código de acceso.

  • kSecAccessControlDevicePasscode: restricción para acceder a un dato con un código de acceso.

  • kSecAccessControlBiometryAny: restricción para acceder a un dato con Touch ID para cualquier dedo registrado o Face ID.

  • kSecAccessControlBiometryCurrentSet: restricción para acceder a un dato con Touch ID para los dedos inscritos actualmente, o desde Face ID con el usuario inscrito actualmente.

  • kSecAccessControlUserPresence: restricción para acceder a un dato con biometría o código de acceso.

  • kSecAccessControlWatch: restricción para acceder a un dato con un reloj.

Dump

Keychain Dumper

scp keychain_dumper root@<device-ip-address>:/tmp/

ssh root@<device-ip-address>
cd /tmp/ && mkdir tools
cd tools && mkdir keychain-dumper
cd keychain-dumper && mv ../../keychain_dumper .
./keychain_dumper -s

Objection

Visualizar Keychain de una aplicación.

ios keychain dump

Exportar Keychain de una aplicación.

ios keychain dump --json keychain.json

Filtrar datos del Keychain de una aplicación.

# Filtrado a partir de la visualización del Keychain
objection --gadget <app-package-name> run "ios keychain dump" | grep -Ei "<word-1>|<word-2>|<word-3>"
objection --gadget <process-ID> run "ios keychain dump" | grep -Ei "<word-1>|<word-2>|<word-3>"

# Filtrado a partir del Keychain exportado
objection --gadget <app-package-name> run "ios keychain dump --json keychain.json" && cat keychain.json | grep -Ei "<word-1>|<word-2>|<word-3>"
objection --gadget <process-ID> run "ios keychain dump --json keychain.json" && cat keychain.json | grep -Ei "<word-1>|<word-2>|<word-3>"

Última actualización