Внедрение и тестирование защиты данных iOS - PullRequest
25 голосов
/ 01 марта 2011

Только что увидел Сессию 209. Защита данных приложений из WWDC 2010 года.

В ключевой заметке объясняется много вещей, включая способ установки атрибутов защиты данных для ваших файлов (NSFileProtectionComplete, NSFileProtectionNone) и какрешить, какая защита лучше всего подходит для вашего случая.

Я только что реализовал ее, но не могу понять, как проверить, включена ли защита, есть идеи?

Кроме того, у меня естьбаза данных sql lite, к которой нужно время от времени обращаться в фоновом режиме, и этот метод защиты данных, кажется, недостаточно хорош ... какая-нибудь ссылка или учебное пособие, которое проведет меня через лучшую защиту БД?(найден sql-шифр, но довольно сложно добавить его в расширенный проект)

Спасибо!

Ответы [ 7 ]

22 голосов
/ 22 сентября 2011

Обновление: В iOS 6 предположительно возможно требовать защиты данных для вашего приложения с помощью разрешения, которое необходимо настроить в идентификаторе приложения в профиле обеспечения iOS. Я еще не проверял это, и это лучшая информация, которую я мог найти на ней https://devforums.apple.com/message/707939#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), которые в сочетании со сторонним сервером могут использоваться для реализации политик, требующих включения защиты данных на устройствах.

10 голосов
/ 30 апреля 2012

Вы можете использовать приложение iExplorer , чтобы определить, зашифрованы ли ваши файлы. iExplorer позволяет вам просматривать файловую систему вашего iPhone / iPad и открывать файл (конечно, ваше устройство должно быть подключено к вашему Mac).

Когда устройство заблокировано, файлы не могут быть правильно прочитаны.

8 голосов
/ 01 марта 2011

Из NSFileManager класс документа:

Файл хранится в зашифрованном виде на диске и не может быть прочитан или записан, пока устройство заблокировано или загружается.

Вы просто передаете константу, когда устанавливаете атрибуты файла.

При записи содержимого объекта NSData на диск с помощью writeToFile: options: error: метод, включите параметр NSDataWritingFileProtectionComplete.

Используйте setAttributes: ofItemAtPath: error: метод NSFileManager для добавления атрибута NSFileProtectionKey (со значением NSFileProtectionComplete) в существующий файл

http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StandardBehaviors/StandardBehaviors.html

РЕДАКТИРОВАТЬ (Определение доступности защищенных файлов)

Защищенный файл доступен только при разблокированном устройстве. Поскольку приложения могут продолжать работать, пока устройство заблокировано, ваш код должен быть подготовлен к тому, чтобы предотвратить возможность недоступности защищенных файлов в любое время. Инфраструктура 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, поскольку такие инструменты требуют, чтобы устройство находилось в «доверенном» режиме, поэтому у них есть разрешения для доступа к содержимому вашего устройства / приложения.

Удачи!

5 голосов
/ 13 апреля 2016

Тестирование может быть выполнено в Xcode:

  1. Удалите и переустановите приложение
  2. На устройстве iOS перейдите в «Настройки»> «Пароль» и убедитесь, что для параметра «Требуется пароль» установлено значение «Немедленно»
  3. Заблокируйте телефон и подождите 20 секунд
  4. В Xcode перейдите в Окно> Устройства
  5. Выберите приложение, которое вы хотите протестировать
  6. Щелкните по винту с настройками и выберите «загрузить контейнер»
  7. Щелкните правой кнопкой мыши загруженный файл .xcappdata и выберите «показать содержимое пакета». Все, что вы можете просмотреть здесь, не было зашифровано NSFileProtectionComplete
  8. Разблокируйте телефон и повторите шаги 3-6. Файлы, которые раньше не отображались и теперь можно просматривать, были успешно зашифрованы.

enter image description here

4 голосов
/ 12 сентября 2014

Защита файлов может быть включена для каждого файла или для каждого каталога или для всего приложения (с использованием прав и профиля обеспечения).Чтобы определить, защищен ли файл или каталог, проверьте атрибуты файловой системы для ключа защиты данных.Это должно быть допустимо, даже если родительский каталог защищен:

- (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;
}
3 голосов
/ 14 октября 2016

Я не думаю, что вы сможете протестировать защиту данных с помощью компьютерных инструментов и iPhone без джейлбрейка - возможно, вы могли это сделать в прошломПожалуйста, смотрите мой ответ здесь для обновленного метода тестирования защиты данных: https://stackoverflow.com/a/40044841/1165843

0 голосов
/ 12 октября 2015

Для полного тестирования я бы предложил использовать такие инструменты, как iDB (https://github.com/dmayer/idb) для выполнения пентестинга в вашем приложении для iOS, как описано в этом руководстве . Для вас также может быть важна эта шпаргалка для тестирования безопасности iOS.

...