В данной статье рассказывается как узнать класс защиты файла в iOS
Как видно из рисунка ниже, каждый файл в iOS зашифрован уникальным ключом. Содержимое файла шифруется файловым ключом; файловый ключ шифруется ключом класса защиты (ключом класса защиты данных). Зашифрованный файловый ключ сохраняется в метаданных файла. Метаданные файла, в свою очередь, шифруются ключом файловой системы (ключ EMF). Ключ файловой системы генерируется на основе аппаратного ключа UID. Ключ UID вшивается в устройство при производстве, является уникальным для каждого устройства и никакой код, выполняющийся на CPU, не может прочитать UID.
Если бы файл шифровался одним лишь ключом файловой системы, то мы могли бы извлечь файл из ram-памяти с помощью специальных утилит (например, msft_guy automated custom ramdisk) даже с устройств, защищенных паролем. Механизм защиты данных служит для предотвращения подобных атак. Защита данных на устройствах с iOS достигается за счет специальных ключей шифрования, которые генерируются на основе пароля и UID. Поэтому, если файл защищен определенным классом защиты, и пользователь установил пароль на свое устройство, то нарушитель даже с помощью специальных утилит не сможет получить доступ к файлу, пока он не узнает пароля. Проще говоря, механизм защиты данных добавляет дополнительный уровень безопасности, зашифровывая файлы ключом, полученным на основе пароля.
Чтобы назначить файлу класс защиты, нужно присвоить атрибуту файла NSFileProtectionKey определенную константу. Затем, в зависимости от выбранной константы, файл шифруется на соответствующем ключе класса защиты данных.
Пример: Если файл имеет класс защиты NSFileProtectionComplete, то файл будет зашифрован на ключе первого класса защиты (Class 1 protection class key). Ключ первого класса защиты доступен только после разблокировки устройства. По умолчанию файлы имеют класс защиты NSFileProtectionNone; ключ класса защиты NSFileProtectionNone доступен даже при заблокированном устройстве. Список доступных классов защиты данных для файлов приведен ниже в таблице.
Key id |
Класс защиты |
Описание |
1 |
NSProtectionComplete |
Файл доступен только после разблокировки устройства |
2 |
NSFileProtectionCompleteUnlessOpen |
Файл доступен после разблокировки устройства или файл доступен, если его дескриптор оставался открытым до блокировки устройства |
3 |
NSFileProtectionCompleteUntilFirstUserAuthentication |
Файл доступен после первой разблокировки и до перезагрузки устройства |
4 |
NSProtectionNone |
Файл доступен, даже если устройство заблокировано |
5 |
NSFileProtectionRecovery |
Недокументировано |
Я написал программу (FileDP), которая на вход получает файл, а на выходе возвращает название класса защиты исходного файла. Знание класса защиты позволяет определить и ключ класса защиты, которым зашифрован файл. Программа может помочь при анализе безопасности iOS-приложений, а также показать, имеют ли конфиденциальные файлы надлежащий класс защиты или нет.
Извлечение класса защиты файла
|
5. Используйте следующую команду, чтобы получить класс защиты конкретного файла или всех файлов в папке:
|
После того, как программа FileDP завершила работу с папкой приложения, я обнаружил, что файлы настроек приложения не защищены, так как имеют класс защиты NSFileProtectionNone. В файлах настроек многие приложения сохраняют свои конфигурационные данные, а также конфиденциальную информацию, такую как имя пользователя, сессионные cookies и токены аутентификации. Обычно файл настроек генерируется средой разработки XCode, и пользователь не может изменять атрибуты сгенерированного файла.
Пример: Файл настроек Facebook – com.Facebook.Facebook.plist – содержит в себе токены аутентификации пользователя и cookies. Как видно из следующей картинки, файл имеет класс защиты NSFileProtectionNone.
Не ждите, пока хакеры вас взломают - подпишитесь на наш канал и станьте неприступной крепостью!