Внедрение и тестирование защиты данных iOS
Только что увидел сессию 209 - Защита данных приложений от WWDC 2010 года.
В ключевой заметке объясняется много вещей, включая способ установки атрибутов защиты данных для ваших файлов (NSFileProtectionComplete, NSFileProtectionNone) и как решить, какая защита лучше всего подходит для вашего случая.
Я только что реализовал это, но не могу понять, как проверить, включена ли защита, есть идеи?
Кроме того, у меня есть база данных sql lite, к которой нужно время от времени обращаться в фоновом режиме, и этот метод защиты данных, кажется, недостаточно хорош... какая-нибудь ссылка или учебное пособие, которое поможет мне пройти через лучшую защиту БД? (найден sql-шифр, но довольно сложно добавить его в расширенный проект)
Спасибо!
7 ответов
Обновление: в iOS 6 предположительно возможно требовать защиты данных для вашего приложения с помощью разрешения, которое необходимо настроить в App ID в профиле обеспечения iOS. Я еще не проверял это, и это лучшая информация, которую я мог найти на нем https://devforums.apple.com/message/707939
Мои исследования по этому вопросу привели меня к мысли, что очень трудно определить, включена ли защита данных на устройстве.
Защита файла включается настройкой NSFileProtectionKey
атрибут файла к NSFileProtectionComplete
Например, чтобы создать защищенный файл, вы можете запустить такой код:
[[NSFileManager defaultManager] createFileAtPath:[self filePath]
contents:[@"super secret file contents" dataUsingEncoding:NSUTF8StringEncoding]
attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
forKey:NSFileProtectionKey]];
К сожалению, этот код будет выполняться без ошибок, даже если защита данных не включена на устройстве (или если код запускается на симуляторе, где защита данных недоступна).
Хуже того, NSFileProtectionComplete
Атрибут будет установлен независимо от того, защищен файл или нет. Следующие:
self.fileProtectionValue = [[[NSFileManager defaultManager] attributesOfItemAtPath:[self filePath]
error:NULL] valueForKey:NSFileProtectionKey];
NSLog(@"file protection value: %@", self.fileProtectionValue);
выплюнет file protection value: NSFileProtectionComplete
независимо от того, включена защита данных или нет.
Есть два метода, которые я смог использовать, чтобы определить, работает ли защита файлов должным образом. К сожалению, ни один из этих методов не подходит для определения, включена ли защита данных на устройстве в полевых условиях.
Оба метода основаны на идее, что защищенный файл не может быть прочитан, если устройство заблокировано.
Первый метод заключается в использовании таймера, чтобы попытаться прочитать файл после блокировки устройства, но пока ваше приложение продолжает работать:
[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);
}
Если вы запустите приведенный выше код и заблокируете устройство, защищенное данными, оно выплюнет:
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"}
Задержка в 20 секунд необходима, потому что существует примерно 10 секунд льготного периода, в течение которого защищенные данные все еще доступны после блокировки устройства с защитой данных.
Второй способ - создать защищенный файл в приложении, выйти из приложения, заблокировать устройство, подождать 10 секунд, а затем использовать органайзер XCode для загрузки содержимого приложения. Это приведет к сообщению об ошибке, и защищенный файл будет пустым.
Если какой-либо из вышеперечисленных тестов не работает, как описано, защита данных либо не включена, либо ваш код защиты файлов был реализован неправильно.
Поскольку я не нашел способа проверить в приложении, что защита данных включена, прежде чем записывать конфиденциальную информацию на диск, я подал в Apple запрос на расширение возможностей, чтобы пометить приложение как требующее включения защиты данных., (Rdar: // 10167256)
Apple предлагает решение для этого через свои API-интерфейсы управления мобильными устройствами (MDM), которые в сочетании со сторонним сервером могут использоваться для реализации политик, требующих включения защиты данных на устройствах.
Вы можете использовать приложение iExplorer, чтобы определить, зашифрованы ли ваши файлы. iExplorer позволяет вам просматривать файловую систему вашего iPhone/iPad и открывать файл (конечно, ваше устройство должно быть подключено к вашему Mac).
Когда устройство заблокировано, файлы не могут быть прочитаны правильно.
Из документа класса NSFileManager:
Файл хранится в зашифрованном виде на диске и не может быть прочитан или записан, пока устройство заблокировано или загружается.
Вы просто передаете константу, когда устанавливаете атрибуты файла.
При записи содержимого объекта NSData на диск с помощью метода writeToFile:options:error: включите параметр NSDataWritingFileProtectionComplete.
Используйте setAttributes:ofItemAtPath:error: метод NSFileManager, чтобы добавить атрибут NSFileProtectionKey (со значением NSFileProtectionComplete) в существующий файл
РЕДАКТИРОВАТЬ (Определение доступности защищенных файлов)
Защищенный файл доступен только тогда, когда устройство разблокировано. Поскольку приложения могут продолжать работать, пока устройство заблокировано, ваш код должен быть готов к тому, что в любой момент вы сможете получить доступ к защищенным файлам. Инфраструктура UIKit позволяет отслеживать, включена ли защита данных в данный момент.
*
Use 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.
Любое приложение, которое работает с защищенными файлами, должно реализовывать методы делегата приложения. Когда вызывается applicationProtectedDataWillBecomeUnavailable: метод, ваше приложение должно немедленно закрыть все защищенные файлы и воздерживаться от их повторного использования до тех пор, пока не будет вызван applicationProtectedDataDidBecomeAvailable: метод. Любые попытки получить доступ к защищенным файлам, пока они недоступны, потерпят неудачу.
Проверка защиты файлов на взломанных устройствах
Чтобы перейти к следующему шагу, если вы хотите проверить защиту файла точного файла, вам понадобится взломанное устройство. Для этого вот (не подробно) шаги:
1) джейлбрейк устройства iOS
2) Установите Open SSH через Cydia (это необходимо для удаленного доступа к файлам с этого устройства) ( https://cydia.saurik.com/openssh.html)
3) Войдите в систему с вашего компьютера (используя Mac-клиент или терминал) как пользователь root на ваше устройство.
Чтобы найти расположение каталогов и файлов вашего приложения, существуют различные способы. Либо ты можешь
grep
процесс приложения (например,ps ax | grep YourAppName
) - Убедитесь, что приложение работает на устройстве, чтобы получить подробности процесса. Должно быть указано расположение пакетов приложений.- Кроме того, вы также можете искать определенный файл, используя
find
Вы заинтересованы в. Например.find / -type f -name YouAppName.sqlite
, Это должно дать местоположение файла на устройстве.
Отсюда вы можете попытаться увидеть, действительно ли файл доступен или нет, когда телефон заблокирован паролем; или нет. - Вы можете просто запустить cat YouAppName.sqlite
чтобы увидеть, если содержимое доступно. Если файл защищен, он должен показывать
операция не разрешена
ошибка; иначе, если бы показать содержимое файла.
Опять же, это необходимо, если вы действительно хотите проверить защиту отдельного файла. Если права и возможности установлены правильно, проверки прав должно быть достаточно для защиты файлов.
На боковом узле инструменты проводника файлов, такие как iExplorer, мало помогают в проверке FileProtection, поскольку такие инструменты требуют, чтобы устройство находилось в "доверенном" режиме, поэтому у них есть разрешения для доступа к содержимому вашего устройства / приложений.
Удачи!
Тестирование может быть сделано в Xcode:
- Удалить и переустановить приложение
- На устройстве iOS перейдите в "Настройки"> "Код доступа" и убедитесь, что для параметра "Требуется пароль" установлено значение "Немедленно".
- Заблокируйте телефон и подождите 20 секунд
- На Xcode зайдите в Окно> Устройства
- Выберите приложение, которое вы хотите протестировать
- Нажмите Cog настройки и выберите "скачать контейнер"
- Щелкните правой кнопкой мыши загруженный файл.xcappdata и выберите "показать содержимое пакета". Все, что вы можете просмотреть здесь, не было зашифровано
NSFileProtectionComplete
- Разблокируйте телефон и повторите шаги 3-6. Файлы, которые раньше не отображались и теперь можно просматривать, были успешно зашифрованы.
Защита файлов может быть включена для каждого файла или для каждого каталога или для всего приложения (с использованием прав и профиля обеспечения). Чтобы определить, защищен ли файл или каталог, проверьте атрибуты файловой системы для ключа защиты данных. Это должно быть допустимо, даже если родительский каталог защищен:
- (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;
}
Чтобы определить, доступен ли защищенный контент, UIApplication предоставляет метод для запроса состояния защиты, isProtectedDataAvailable
, Использование этого метода выше позволит вам определить, доступен ли конкретный файл или каталог:
- (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;
}
Я не думаю, что вы сможете протестировать защиту данных с помощью компьютерных инструментов и iPhone без джейлбрейка - возможно, вы могли это сделать в прошлом. Пожалуйста, смотрите мой ответ здесь для обновленного метода тестирования защиты данных: /questions/2435012/nsfileprotectioncomplete-ne-shifruet-fajl-osnovnyih-dannyih/2435013#2435013
Для полного тестирования я бы предложил использовать такие инструменты, как iDB ( https://github.com/dmayer/idb) для выполнения пентестинга в вашем приложении для iOS, как описано в этом руководстве. Также актуальным для вас может быть этот шпаргалка для тестирования безопасности iOS.