Защита приложений и пользовательских данных — непростая задача. Много что может пойти не так, много мест, в которых могут быть допущены ошибки. Цель доклада — помочь разработчикам избежать этих ошибок.
Мы рассмотрим доступные механизмы защиты данных в iOS, типичные ошибки и анти-шаблоны при их использовании, и способы их избежать. Рассмотрим способы защиты данных при хранении на устройстве и при передаче по сети. Поговорим о грядущем требовании включать ATS, о Secure Enclave, о вредоносном коде (malware) и джейлбрейке.
5. iOS Data Protection (1)
❖ Различные классы защиты
❖ Шифрование файлов
❖ Keychain для хранения паролей и ключей
❖ Шифрование может быть “привязано” к
пасскоду
❖ Шифрование резервных копий
18. jà* 3“2à…%",2ü *ëà““ ƒà?,2/?
// 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)
19. jà* 3“2à…%",2ü *ëà““ ƒà?,2/?
let attributes = [
kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
// ...
] as NSDictionary
SecItemAdd(attributes as CFDictionary, nil)
20. iOS Data Protection (2)
❖ Secure Enclave
❖ Touch ID
❖ LocalAuthentication
❖ Keychain ACLs
21. Secure Enclave
❖ Встроенный защищенный со-процессор
❖ Отдельная ОС, secure boot
❖ A7+(iPhone 5s и новее)
❖ Отвечает за Touch ID, проверку пасскода,
шифрование данных, Keychain ACL
22. Touch ID " bàøåì
Cð,ë%›å…,,?
LocalAuthentication
Framework
Keychain Access
Control Lists
23. LocalAuthentication
let context = LAContext()
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
error: nil)
{
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
localizedReason: <# Reason #>) {
(success, error) in
if success {
<# User authentication successful #>
}
}
}
24. Keychain ACL
Задаёт условия при которых данные из Keychain будут
возвращены:
❖ kSecAccessControlUserPresence
❖ kSecAccessControlTouchIDAny
❖ kSecAccessControlTouchIDCurrentSet
❖ kSecAccessControlDevicePasscode
❖ kSecAccessControlOr, kSecAccessControlAnd
25. Keychain ACL
let acl = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
.touchIDCurrentSet,
nil)
let attributes = [
kSecAttrAccessControl: acl!,
// ...
] as NSDictionary
SecItemAdd(attributes as CFDictionary, nil)
27. Keychain ACL
let acl = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
[.touchIDCurrentSet, .applicationPassword],
nil)
let context = LAContext()
context.setCredential("my-secret-password".data(using: .utf8),
type: .applicationPassword)
let attributes = [
kSecAttrAccessControl: acl!,
kSecUseAuthenticationContext: context
// ...
] as NSDictionary
SecItemAdd(attributes as CFDictionary, nil)
28. Ò,C,÷…/å %ø,K*,
❖ Хранение паролей/конфиденциальной информации
в NSUserDefaults/UserDefaults, SQLite (например
через CoreData), и т.п.
❖ Использование NSFileProtectionNone/
kSecAttrAccessibleAlways
❖ “Утечка” паролей/конфиденциальной информации
в логи
❖ Пароли/конфиденциальная информация на
скриншотах
32. iTunes Backup
❖ <app>/Documents включается в бэкап
❖ <app>/Library/Caches и <app>/tmp не включаются в
бэкап
❖ NSURLIsExcludedFromBackupKey исключает файл из
бэкапа
❖ Из зашифрованного бэкапа можно извлечь записи
Keychain, кроме тех, для которых установлен класс
…ThisDeviceOnly
33. File Sharing
❖ Доступ к “песочнице” приложения
❖ Был включен по умолчанию до iOS 8.3
❖ Все еще включен по умолчанию в бета-версиях iOS
❖ В iOS 8.4+ включен только для приложений с
UIFileSharingEnabled
34. jà* ƒà?,2,2ü äà……/å?
❖ Data Protection не поможет защитить данные вне
устройства
❖ Используйте дополнительный уровень шифрования
❖ Например, SQLCipher
❖ Или SQLite Encryption Extension
❖ Ключ/пароль от БД храните в Keychain с
надежным классом защиты
36. Transport Layer Security
❖ TLS (для TCP) и DTLS (для UDP) являются
стандартами для защиты данных при передаче по
сети
❖ Проблема: (D)TLS зависит от сертификатов
37. qåð2,ô,*à2/
❖ iOS 10 содержит 172 доверенных сертификата
❖ https://support.apple.com/en-us/HT207177
❖ iOS “верит” всем сертификатам, подписанным
любым из этих сертификатов
38. Certificate Pinning
❖ Ограничивает список доверенных сертификатов для
данного хоста/сервиса
❖ “Сертификат сервера abc.com имеет отпечаток 01 23
45 …”
❖ “Сертификат сервера def.com выпущен Let's
Encrypt”
❖ Требует аккуратного обращения — можно невзначай
“сломать” клиентов
39. Certificate Pinning
❖ Легко допустить ошибки
❖ Реализация в AFNetworking, например, случайно
отключила валидацию сертификатов
❖ https://datatheorem.github.io/TrustKit/
40. Certificate Transparency
❖ Журналирует выпущенные сертификаты
❖ Не позволяет удалить сертификат из журнала
❖ Клиент может проверить есть ли сертификат сервера
в CT
❖ https://www.certificate-transparency.org/
41. App Transport Security
В теории:
❖ Блокирует небезопасные соединения
❖ Позволяет создавать исключения
На практике:
42. App Transport Security
❖ С Января 2017 исключения потребуют обоснования и
дополнительного рассмотрения при подаче в
AppStore
❖ NSAllowsArbitraryLoads
❖ NSAllowsArbitraryLoadsForMedia
❖ NSAllowsArbitraryLoadsInWebContent
❖ NSExceptionAllowsInsecureHTTPLoads
❖ NSExceptionMinimumTLSVersion
❖ SFSafariViewController не требует исключений
43. App Transport Security
❖ Поддержка ATS требует изменений на сервере
❖ Действительный сертификат ключа RSA (2048 бит и
более) или ECC (256 бит и более), SHA-256
❖ TLS 1.2
❖ ECDHE
❖ https://developer.apple.com/