iphone - rastrear - Implementando y probando la protección de datos de iOS
notes app ios (7)
Acabo de ver la sesión 209 - Asegurar datos de aplicaciones de la WWDC de 2010.
El discurso explica muchas cosas, incluida la forma en que puede establecer atributos de protección de datos para sus archivos (NSFileProtectionComplete, NSFileProtectionNone) y cómo decidir qué protección es mejor para su caso.
Acabo de implementarlo, pero no sé cómo probar si la seguridad está activada, ¿alguna idea?
Además, tengo una base de datos sql lite a la que se debe acceder periódicamente en segundo plano, y este método de protección de datos parece no ser lo suficientemente bueno ... ¿algún enlace o tutorial que me guíe a través de la mejor protección de db? (se encuentra el cifrado sql pero es un poco pesado para agregar en un proyecto evolucionado)
¡Gracias!
Del NSFileManager clase NSFileManager :
El archivo se almacena en un formato cifrado en el disco y no se puede leer o escribir mientras el dispositivo está bloqueado o arrancando.
Usted acaba de pasar la constante cuando establece los atributos del archivo.
Al escribir el contenido de un objeto NSData en el disco utilizando el método writeToFile: options: error, incluya la opción NSDataWritingFileProtectionComplete.
Utilice el método setAttributes: ofItemAtPath: error: de NSFileManager para agregar el atributo NSFileProtectionKey (con el valor NSFileProtectionComplete) a un archivo existente
EDITAR (Determinar la disponibilidad de archivos protegidos)
Solo se puede acceder a un archivo protegido cuando un dispositivo está desbloqueado. Debido a que las aplicaciones pueden continuar ejecutándose mientras el dispositivo está bloqueado, su código debe estar preparado para manejar la posibilidad de que los archivos protegidos no estén disponibles en cualquier momento. El marco UIKit proporciona formas de rastrear si la protección de datos está habilitada actualmente.
*
The application delegate can implement the applicationProtectedDataWillBecomeUnavailable: and applicationProtectedDataDidBecomeAvailable: methods and use them to track changes to the availability of protected data.
*
An application can register for the UIApplicationProtectedDataWillBecomeUnavailable and UIApplicationProtectedDataDidBecomeAvailable notifications.
*
The protectedDataAvailable property of the shared UIApplication object indicates whether protected files are currently accessible.
Cualquier aplicación que trabaje con archivos protegidos debería implementar los métodos de delegado de la aplicación. Cuando se invoca el método applicationProtectedDataWillBecomeUnavailable: su aplicación debe cerrar de inmediato todos los archivos protegidos y no volver a utilizarlos hasta que se llame al método applicationProtectedDataDidBecomeAvailable :. Cualquier intento de acceder a los archivos protegidos mientras no estén disponibles fallará.
La protección de archivos puede habilitarse por archivo o por directorio, o puede habilitarse para toda la aplicación (usando las autorizaciones y el perfil de aprovisionamiento). Para determinar si un archivo o directorio está protegido, verifique los atributos del sistema de archivos para la clave de protección de datos. Esto debería ser válido incluso si se trata de un directorio principal que se configuró para estar protegido:
- (BOOL) isProtectedItemAtURL:(NSURL *)URL {
BOOL result = YES;
NSDictionary *attributes = nil;
NSString *protectionAttributeValue = nil;
NSFileManager *fileManager = nil;
fileManager = [[NSFileManager alloc] init];
attributes = [fileManager attributesOfItemAtPath:[URL path] error:&error];
if (attributes != nil){
protectionAttributeValue = [attributes valueForKey:NSFileProtectionKey];
if ((protectionAttributeValue == nil) || [protectionAttributeValue isEqualToString:NSFileProtectionNone]){
result = NO;
}
} else {
// handle the error
}
return result;
}
Para determinar si el contenido protegido está disponible, UIApplication proporciona un método para consultar el estado de protección, isProtectedDataAvailable
. Usarlo con el método anterior le permitiría determinar si un archivo o directorio en particular está disponible:
- (BOOL) isItemAtURLAvailable:(NSURL *)URL {
BOOL result = NO;
if ([self isProtectedItemAtURL:URL]){
// Item is protected
if ([[UIApplication sharedApplication] isProtectedDataAvailable]){
// Protected content is available
result = YES;
}
} else {
result = YES;
}
return result;
}
La prueba se puede hacer dentro de Xcode:
- Eliminar y reinstalar su aplicación
- En su dispositivo iOS, vaya a Configuración> Código de acceso y asegúrese de que "Solicitar código de acceso" esté configurado como "Inmediatamente".
- Bloquee su teléfono y espere 20 segundos
- En Xcode ve a Ventana> Dispositivos
- Seleccione la aplicación que desea probar
- Haga clic en el engranaje de configuración y elija ''descargar contenedor''
- Haga clic con el botón derecho en el archivo .xcappdata descargado y seleccione "mostrar contenido del paquete". Todo lo que puedes ver aquí no ha sido encriptado por
NSFileProtectionComplete
- Desbloquee su teléfono y repita los pasos 3-6. Los archivos que anteriormente no aparecían y que ahora puede ver se encriptaron con éxito.
No creo que puedas probar Data Protection con herramientas basadas en computadora y un iPhone que ya no tenga jailbreak, tal vez podrías hacerlo en el pasado. Consulte mi respuesta aquí para obtener un método actualizado para probar Data Protection: https://.com/a/40044841/1165843
Para una prueba completa, le sugiero usar herramientas como iDB ( https://github.com/dmayer/idb ) para realizar pentesting en su aplicación iOS, como se describe en esta guía . También puede ser relevante para usted este Cheat Sheet para las pruebas de seguridad de iOS.
Puede usar la aplicación iExplorer para detectar si sus archivos están encriptados. iExplorer le permite navegar por el sistema de archivos de su iPhone / iPad, y abrir el archivo (por supuesto, su dispositivo debe estar conectado a su Mac).
Cuando el dispositivo está bloqueado, los archivos no se pueden leer correctamente.
Actualización: con iOS 6 supuestamente es posible requerir protección de datos para su aplicación mediante el uso de una autorización que debe configurarse en el ID de la aplicación en el perfil de aprovisionamiento de iOS. No he probado esto todavía, y esta es la mejor información que pude encontrar en él https://devforums.apple.com/message/707939#707939
Mis investigaciones sobre este asunto me llevan a pensar que es muy difícil determinar si la protección de datos está habilitada en un dispositivo.
La protección de archivos se habilita estableciendo el NSFileProtectionKey
archivo NSFileProtectionComplete
en NSFileProtectionComplete
Por ejemplo, para crear un archivo protegido podría ejecutar código como:
[[NSFileManager defaultManager] createFileAtPath:[self filePath]
contents:[@"super secret file contents" dataUsingEncoding:NSUTF8StringEncoding]
attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
forKey:NSFileProtectionKey]];
Lamentablemente, este código se ejecutará sin errores incluso si la protección de datos no está habilitada en el dispositivo (o si el código se ejecuta en el simulador donde la protección de datos no está disponible).
Peor aún, el atributo NSFileProtectionComplete
se establecerá independientemente de si el archivo está protegido o no. El seguimiento:
self.fileProtectionValue = [[[NSFileManager defaultManager] attributesOfItemAtPath:[self filePath]
error:NULL] valueForKey:NSFileProtectionKey];
NSLog(@"file protection value: %@", self.fileProtectionValue);
file protection value: NSFileProtectionComplete
sin importar si la Protección de datos está habilitada o no.
Hay dos métodos que he podido usar para descubrir si File Protection funciona como se esperaba. Desafortunadamente, ninguno de estos métodos es adecuado para detectar si la protección de datos está habilitada en un dispositivo en el campo.
Ambos métodos funcionan con la idea de que un archivo protegido no se puede leer si el dispositivo está bloqueado.
El método uno implica el uso de un temporizador para intentar leer el archivo una vez que el dispositivo está bloqueado, pero mientras la aplicación continúa ejecutándose:
[self performSelector:@selector(doReload) withObject:nil afterDelay:20];
- (void)doReload {
NSLog(@"protected data available: %@",[[UIApplication sharedApplication] isProtectedDataAvailable] ? @"yes" : @"no");
NSError *error;
self.fileContents = [NSString stringWithContentsOfFile:[self filePath]
encoding:NSUTF8StringEncoding
error:&error];
NSLog(@"file contents: %@/nerror: %@", self.fileContents, error);
}
Si ejecuta el código anterior y bloquea un dispositivo protegido de datos, se escupirá:
protected data available: no
file contents: (null)
error: Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x16e110 {NSFilePath=/var/mobile/Applications/D71F1F1F-6C25-4848-BB1F-51539B47EC79/Documents/protected_file, NSUnderlyingError=0x16e010 "The operation couldn’t be completed. Operation not permitted"}
La demora de 20 segundos es necesaria porque hay un período de gracia de aproximadamente 10 segundos donde los datos protegidos aún están disponibles después de que un dispositivo habilitado para protección de datos está bloqueado.
El segundo método es crear un archivo protegido en una aplicación, salir de la aplicación, bloquear el dispositivo, esperar 10 segundos y luego usar el organizador XCode para descargar el contenido de la aplicación. Esto producirá un mensaje de error y el archivo protegido estará vacío.
Si alguna de las pruebas anteriores no se comporta como se describe, Data Protection no está habilitada o su código de Protección de archivos no se implementó correctamente.
Debido a que no he encontrado ninguna forma de verificar dentro de la aplicación que Data Protection esté habilitada antes de escribir información confidencial en el disco, he presentado una solicitud de mejora de funciones con Apple para poder marcar una aplicación que requiera que Data Protection esté habilitada. . (rdar: // 10167256)
Apple ofrece una solución a esto a través de sus API de administración de dispositivos móviles (MDM), que combinadas con un servidor de terceros se pueden usar para aplicar políticas que requieren que Data Protection esté habilitado en los dispositivos.