# Module #6 ## Хранение данных на файловой системе устройства ### Data Protection API Появление в ОС Security Enclave предоставило большое количество опций для разработчиков по организации доступа к данным пользователя. Все функции стали доступны начиная с iPhone 5S. Security Enclave работает со всеми примитивами криптографии. В том числе с контролем целостности ОС и данных пользователя. Защита данных построена на иерархии ключей. UID - ключ, который вшит в устройство+пользовательский ключ-пароль. Для генерации пароля используется PBKDF2 алгоритм. UID и пользовательский пароль - вершина иерархии. Оба этих объекта могут быть использованы для доступа к разным ключам, которые ассоциированы с разными состояниями устройства. (блокирование/разблокирование) Весь процесс шифрования/дешифрования данных в iOS: ![](https://i.imgur.com/Dvfv7vr.jpg) Файлы могут быть ассоциированы в одну из четырех классов защиты: `Complete Protection (NSFileProtectionComplete)` - ключ созданный на основании пользовательского кода доступа и UID устройства защищает этот класс. Создаваемый ключ хранится только в памяти и удаляется сразу после того как устройство блокируется. Данные при этом будут недоступны до следующей разблокировки. `Protected Unless Open (NSFileProtectionCompleteUnlessOpen)` - этот класс защиты похож на класс описанный выше, но разница заключается в том, что если файл был открыт при разблокированном устройстве, то при блокировании устройства файл остается доступным, чтобы можно было выполнить его обработку. `Protected Until First User Authentication (NSFileProtectionCompleteUntilFirstUserAuthentication)` - файл становится доступным как только пользователь разблокирует устройство первый раз после запуска устройства. Ключи от этого класса защиты остаются в памяти вплоть до выключения устройства. `No Protection (NSFileProtectionNone)` - ключи для этого класса защиты, который использует тольео UID. Ключ хранится в "Effaceable Storage". Это спец область памяти, которая используется для хранения небольшого количества данных. Из-за скорости работы с этой областью считается наиболее эффективно для быстрого удаления данных. Все ключи, которые используют классы защиты шифруются с использованием UID и пользовательского кода. Исключение составляет только класс `NSFileProtectionNone`. Для версий iOS начиная с 7й версии класс защиты поумолчанию - `Protected Until First User Authentication` ## Шифрование `Шифрование` - односторонее преобразование информации с использованием криптографических алгоримов. Основными частями шифрования являются `алгоритм шифрования` и `ключ`. Наличие этих двух объектов в зависимости от алгоритма позволяет производить операции по шифрованию и дешифрованию данных. Различают 2 больших класса криптографии - `симметричная` криптография и `ассиметричная` криптография. Разницу проще всего рассматривать графически: ![](https://i.imgur.com/MrNFKO4.png) ![](https://i.imgur.com/bGAb2IA.png) У каждого вида криптографии есть дополнительные характеристики, которые могут зависеть от используемого алгоритма или условий использования алгоритма. Например, симметричная криптография ключает в себя алгоритмы, которые могут использоваться в различных режимах. Например: - блочный режим шифрования; - режим сцепления блоков; - поточное шифрование; Какие есть основные рекомендации по использованию криптографии: - никогда не писать самостоятельно алгоритмы крипты - следить за проектом, который используется - следовать best practicies для алгоритма шифрования - не использовать генераторы псевдослучайных чисел, если нет уверенности в их безопасности Наиболее популярные алгоритмы симметричной криптошрафии - AES, DES. Наиболее популярные алгоритмы асимметричной криптошрафии - DSA, RSA. Какие существуют атаки на ассиметричные алгоритмы: - Searching the Message Space - Guessing d - Cycle Attack - Common Modulus - Low Exponent - Faulty Encryption - Factoring the Public Key Атаки на симметричные алгоритмы с точки зрения практики обычно подразделяется на режимы работы алгоритмов. Атаки на симметричные алгоритмы: - ECB - CBC - OFB - CTR - GCM <= iOS default ## Хранение данных в Keychain ### Что такое KeyChain Механизм, который позволяет хранить которую последовательность байт. Это могут быть ключи для шифрования, токены, идентификаторы. Имплементация - SQLite база, которая доступна только через API платформы. Для iOS Keychain существует только 1 для устройства. В противовес к macOS - каждое приложение и пользователь могут создавать множество Keychain. Доступ к Keychain может быть организован с помощью идентификации разработчика за счет подписи. "Access Groups". Keychain обслуживается securityd демоном. Настройки для доступа сообщаются через application-identifier, application-group. Данные в Keychain шифруются схожим образом со схемой шифрования файлов. Для обработки базы Keychain используется преобразование в бинарный plist файл и каждый отдельный набор данных шифруется 128 битным AES. Вообще настройка защиты и методов преобразования для элементов может быть настроена дополнительно. Выполнить это можно через установку kSecAttrAccessible. ## Сервисы Keychain Включают в себя набор функций: * SecItemAdd * SecItemUpdate * SecItemCopyMatching * SecItemDelete Каждая функция может быть использована из приложения только для тех элеметов, которые разрешены через application-group. Для безопасного зранения стоит уделять отдельное внимание тому как именно разрешается получать оступ к данным из Keycahin. Ниже приведены параметры, которые устанавливаются в качестве значения для kSecAttrAccessible: Security Enclave и все механизмы шифрования на устройстве напрямую зависят от введения данных блокировки пользователем. Это может быть биометрические данные или код. Получение доступа к данным используются флаги `kSecAttrAccessibleAlways`: - `kSecAttrAccessibleAlways` - данные доступны всегда. Несмотря на блокировку экрана. - `kSecAttrAccessibleAlwaysThisDeviceOnly` - данные не будут загружены в iCloud или локальную резервную копию. Данные доступны вне зависимости от блокировки устройства. - `kSecAttrAccessibleAfterFirstUnlock` - данные не могут быть доступны после того как перезапустится устройство. Для доступа пользователю нужно хотя бы раз разблокировать устройство. - `kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly` - данные могут быть доступны после перезагрузки только после того как пользователь разблокировал устройство. Данные не могут быть переданы на другое устройство при передаче данных пользователя. Передача может осуществляться через сервисы Apple или через локальный бэкап. - `kSecAttrAccessibleWhenUnlocked` - данные доступны только тогда, когда устройство разблокировано пользователем. - `kSecAttrAccessibleWhenUnlockedThisDeviceOnly` - данные доступны только во время того как устройство разблокировано пользователем. Данные не загружаются в iCloud или локальную резервную копию. - `kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly` - данные доступны только когда устройство разблокировано. Данный вариант защиты доступен только когда будет установлен код доступа к устройству. Данные не загружаются в iCoud или локальную резервную копию. Так же можно установить для данных КАК их можно получать: - `kSecAccessControlDevicePasscode` - получать доступ только через код доступа - `kSecAccessControlBiometryAny` - получать данные только через одну из биометрий. Причем добавление новой биометрии не нарушает доступа к данным. - `kSecAccessControlBiometryCurrentSet` - получать доступ только по биометрическим данным, которые были на момент установки правила. Если будут удаляться или добавляться биометрические данные, то данные в keychain станут недоступны. - `kSecAccessControlUserPresence` - получать доступ к данным только по зарегистрированной биометрии. ## Secure Enclave Использование API не даёт прямого доступа к ключам шифрования. Только Security Enclave может иметь к нему доступ. Кстати, самый безопасный способ проверки есть ли в системе установленный пароль/биометрия. Можно через функции SE: ```Swift public func devicePasscodeEnabled() -> Bool { return LAContext().canEvaluatePolicy(.deviceOwnerAuthentication, error: nil) } ``` Основные ошибки при использовании - не верное определение нужных привелегий и способа доступа. Наряду с этими проблемами могут быть проблемы персистентности данных в Keychain. С этой проблемой можно столкнуться если несколько раз удалить и установить приложение. Обычно тест проводится 2 раза. Сначала просмтривают данные, которые были созданы приложением, а затем удаляют приложение и пересматривают данные. Ключевые точки на которые нужно обратить внимание: - Создает ли приложение при повторной установке новые данные - Удаляет ли приложение используемые данные при удалении ## Утечка данных через межпроцессорное взаимодействие Для междпроцессорного взаимодействия на платформе можно использовать следующие технологии: - Custom URL Schemes - Universal Links - UIActivity Sharing - App Extensions - UIPasteboard ### Custom URL Schemes `Custom URL Schemes` позволяют исполььзовать приложениям кастомные протоколы для взаимодействия. Приложение должно задекларировать используемые схемы для работы с ними. Не являются Best Practice. Apple рекомендует использовать `Universal Links`. Главная причина - санитизация данных может быть усложнена. Для запуска используется третье приложение - Safari. ### Universal Links `Deep Link` для работы с приложениями, если не находится приложение, которое обрабатывает ссылку, то открывается Safari. В отличии от Custom URL Schemes, Universal Links это просто ссылки HTTP/HTTPS. ### UIActivity Sharing С 6 iOS в ОС есть возможность расшаривать данные через специальные механизмы, например AirDrop. По-умолчанию доступны механизмы расшаривания: - airDrop - assignToContact - copyToPasteboard - mail - message - postToFacebook - postToTwitter - и т.д. Список всех доступных механизмов можно найти [тут](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). ### App Extensions Начиная с 8й версии ОС доступны расширения для приложений. Это дополнение для уже работающей фичи или приложения. Программист может самостоятельно описать логику работы. Как расширения работают с ОС: ![](https://i.imgur.com/4TBBB4c.png) ### UIPasteboard Механизм позволяет расшаривать данные. Существуют 2 типа: - `systemwide general pasteboard` - расшаривает данные с любым приложением в ОС. может содержать данные даже после перезагрузки устройства(начиная с iOS 10). - `custom / named pasteboards` - для расшаривания данных с приложениями, которые имеют одинковый team ID или для использования внутри приложения (внутри процесса). Не сохраняется по-умолчанию существуют до момента завершения процесса приложения. Особенности связанные с безопасностью механизма: - Пользователи не могут настраивать доступ к pasteboard - С 9й версии ОС приложения не могут получать доступ к pasteboard в фоне. - Apple рекомендует исползовать `shared containters` вместо `named pasteboards` - Начиная с iOS 10 появилась новая Handoff фича, которая называется Univesal Clipboard включен по-умолчанию. Это позволяет содержимое `systemwide general pasteboard` автоматически пересылать данные между устройствами. Есть возможность контроллировать время хранения данных в clipboard, а так же запретить доступ к информации. ## Snapshots Функция для сохранения снимков экрана. Может быть использована для кражи конфиденциальной информации из приложения. Рекомендация - модификация фона при уводе приложения в background. ## Keyboard Для упрощения работы с клавиатурой ОС предлагает несколько опций - автоматическое дополнение и исправление орфографии. Эти функции могут быть опасны с точки зрения безопасности. По-умолчанию все данные для обработки помещаются в специальный кэш: /private/var/mobile/Library/Keyboard/dynamic-text.dat. Для кэширования используется `UITextInputTraits` протокол. Классы `UITextField`, `UITextView` и `UISearchBar` поддерживают работу с этим протоколом и предоставляет следующие функции: var autocorrectionType: UITextAutocorrectionType - определяет доступно ли автоисправление во время печати. var secureTextEntry: BOOL - определяет доступно ли копирование и кэширование текста для `UITextField`. Значение по-умолчанию выставлено в NO. ## Loggining В ОС доступны следующие функции для создания и работы с логами: - NSLog Method - printf-like function - NSAssert-like function - Macro ## Cloud Features В ОС доступна фича создания бэкапов. В бэкапы попадают все данные с устройства за исключением Apple Pay, Touch ID. Через указанную фичу может произойти утечка данных. Так же можно через изменение данных в бэкапе перенастроить приложение. ### Как Keychain попадает в бэкап Все данные Keychain сохраняются в бэкап. Они находятся в зашифрованном состоянии. Чтобы их расшифровать пользователю нужно восстановить бэкап на устройство и ввести свой пароль. Если для данных в Keychain был установлен атрибут `kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly` то данные могут быть расшифрованы только с помощью того же устройства, с которого был создан бэкап. ## Практика 1. C помощью инструментов исследования приложений выяснить какие используются методы хранения данных в системе 2. Выяснить каике алгоритмы шифрования используются для работы приложения 3. Выяснить как приложение работает с Keychain