2. Что Вы Узнаете?
❖ Как защитить данные на устройстве
❖ iOS Data Protection
❖ Keychain
❖ Как защитить данные при передаче по сети
❖ TLS и его проблемы
❖ ATS
9. Типичные ошибки
❖ Хранение паролей/конфиденциальной информации в NSUserDefaults/
UserDefaults, SQLite (например через CoreData), и т.п.
❖ Использование NSFileProtectionNone/kSecAttrAccessibleAlways
❖ “Утечка” паролей/конфиденциальной информации в логи
❖ Пароли/конфиденциальная информация на скриншотах
10. iOS Data Protection (1)
❖ Различные классы защиты
❖ Шифрование файлов
❖ Keychain для хранения паролей и ключей
❖ Шифрование может быть “привязано” к пасскоду
❖ Шифрование резервных копий
❖ Доступно с iOS 4
19. Как установить класс защиты?
// Create a new file with a given protection class
FileManager.default.createFile(atPath: path,
contents: data,
attributes: [FileAttributeKey.protectionKey.rawValue:
FileProtectionType.complete])
// Change protection class on an existing file
FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete],
ofItemAtPath: path)
// Write Data object to a file and set given protection class
data.write(to: url,
options: .completeFileProtection)
20. Как установить класс защиты?
let attributes = [
kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
// ...
] as NSDictionary
SecItemAdd(attributes as CFDictionary, nil)
21. iOS Data Protection (2)
❖ Secure Enclave
❖ Touch ID
❖ LocalAuthentication
❖ Keychain ACLs
❖ iPhone 5s
22. Secure Enclave
❖ Встроенный защищенный со-процессор
❖ Отдельная ОС, secure boot
❖ A7+(iPhone 5s и новее)
❖ Отвечает за Touch ID, проверку пасскода, шифрование данных,
Keychain ACL
23. Touch ID в Вашем
приложении?
LocalAuthentication
Framework
Keychain Access Control
Lists
24. LocalAuthentication
let context = LAContext()
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
error: nil)
{
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
localizedReason: <# Reason #>) {
(success, error) in
if success {
<# User authentication successful #>
}
}
}
37. iTunes Backup
❖ <app>/Documents включается в бэкап
❖ <app>/Library/Caches и <app>/tmp не включаются в бэкап
❖ NSURLIsExcludedFromBackupKey исключает файл из бэкапа
❖ Из зашифрованного бэкапа можно извлечь записи Keychain, кроме
тех, для которых установлен класс …ThisDeviceOnly
38. File Sharing
❖ Доступ к “песочнице” приложения
❖ Был включен по умолчанию до iOS 8.3
❖ Все еще включен по умолчанию в бета-версиях iOS
❖ В iOS 8.4+ включен только для приложений с
UIFileSharingEnabled
39. Как защитить данные?
❖ Data Protection не поможет защитить данные вне устройства
❖ Используйте дополнительный уровень шифрования
❖ Например, SQLCipher
❖ Или SQLite Encryption Extension
❖ Ключ/пароль от БД храните в Keychain с надежным классом
защиты
47. App Transport Security
❖ WWDC 2016: с января 2017 исключения потребуют обоснования
и дополнительного рассмотрения при подаче в AppStore
❖ NSAllowsArbitraryLoads
❖ NSAllowsArbitraryLoadsForMedia
❖ NSAllowsArbitraryLoadsInWebContent
❖ NSExceptionAllowsInsecureHTTPLoads
❖ NSExceptionMinimumTLSVersion
❖ SFSafariViewController не требует исключений
❖ 2016-12-21: Apple отложила введение этого правила
48. App Transport Security
❖ Поддержка ATS требует изменений на сервере
❖ Действительный сертификат ключа RSA (2048 бит и более)
или ECC (256 бит и более), SHA-256
❖ TLS 1.2
❖ ECDHE
❖ https://developer.apple.com/
49. Transport Layer Security
❖ TLS (для TCP) и DTLS (для UDP) являются стандартами для
защиты данных при передаче по сети
❖ Проблема: (D)TLS зависит от сертификатов
50. Сертификаты
❖ iOS 10 содержит 172 доверенных сертификата
❖ https://support.apple.com/en-us/HT207177
❖ iOS “верит” всем сертификатам, подписанным любым из этих
сертификатов
51. Certificate Pinning
❖ Ограничивает список доверенных сертификатов для данного
хоста/сервиса
❖ “Сертификат сервера myservice.com имеет отпечаток 012345…”
❖ “Сертификат сервера otherservice.com выпущен Let's Encrypt”
❖ Требует аккуратного обращения — можно невзначай “сломать”
клиентов
52. Certificate Pinning
❖ Легко допустить ошибки
❖ Реализация в AFNetworking, например, случайно отключила
валидацию сертификатов
❖ https://datatheorem.github.io/TrustKit/
53. Certificate Transparency
❖ Журналирует выпущенные сертификаты
❖ Не позволяет удалить сертификат из журнала
❖ Клиент может проверить есть ли сертификат сервера в CT
❖ https://www.certificate-transparency.org/