Upload
mobicode
View
84
Download
9
Embed Size (px)
Citation preview
Ï%"å“2*à
❖ Защита данных на устройстве❖ iOS Data Protection❖ Keychain
❖ Защита данных в сети❖ TLS❖ ATS
gà÷åì (, %2 *%ã%) ƒà?,?à2ü äà……/å?
Ïð,ë%›å…,ÿì …3›…% õðà…,2ü äà……/å
iOS Data Protection (1)
❖ Различные классы защиты
❖ Шифрование файлов
❖ Keychain для хранения паролей и ключей
❖ Шифрование может быть “привязано” к пасскоду
❖ Шифрование резервных копий
jëà““ ƒà?,2/ %Cðåäåëÿå2 ä%“23C…%“2ü ƒà?,?àåì/õ äà……/õ
jëà““ ƒà?,2/ %Cðåäåëÿå2 ä%“23C…%“2ü ƒà?,?àåì/õ äà……/õ
jëà““/ ƒà?,2/: Keychain
❖ kSecAttrAccessibleAlways[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]
❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
jëà““/ ƒà?,2/: Keychain
❖ kSecAttrAccessibleAlways[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]
❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
jëà““/ ƒà?,2/: Keychain
❖ kSecAttrAccessibleAlways[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]
❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
jëà““/ ƒà?,2/: Keychain
❖ kSecAttrAccessibleAlways[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]
❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
jëà““/ ƒà?,2/: ôàLë/
❖ NSFileProtectionNone
❖ NSFileProtectionComplete
❖ NSFileProtectionCompleteUntilFirstUserAuthentication
❖ NSFileProtectionCompleteUnlessOpen
jëà““/ ƒà?,2/: ôàLë/
❖ NSFileProtectionNone
❖ NSFileProtectionComplete
❖ NSFileProtectionCompleteUntilFirstUserAuthentication
❖ NSFileProtectionCompleteUnlessOpen
jëà““/ ƒà?,2/: ôàLë/
❖ NSFileProtectionNone
❖ NSFileProtectionComplete
❖ NSFileProtectionCompleteUntilFirstUserAuthentication
❖ NSFileProtectionCompleteUnlessOpen
jëà““/ ƒà?,2/: ôàLë/
❖ NSFileProtectionNone
❖ NSFileProtectionComplete
❖ NSFileProtectionCompleteUntilFirstUserAuthentication
❖ NSFileProtectionCompleteUnlessOpen
jà* %Cðåäåë,2ü ä%“23C…%“2ü?
1.Проверить свойство: if UIApplication.shared.isProtectedDataAvailable { <#code#> }
2.Реализовать делегаты:class AppDelegate: UIApplicationDelegate { func applicationProtectedDataDidBecomeAvailable(_ application: UIApplication) { <#code#> } func applicationProtectedDataWillBecomeUnavailable(_ application: UIApplication) { <#code#> } }
jà* 3“2à…%",2ü *ëà““ ƒà?,2/?
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)
jà* 3“2à…%",2ü *ëà““ ƒà?,2/?
let attributes = [ kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly, // ... ] as NSDictionary SecItemAdd(attributes as CFDictionary, nil)
iOS Data Protection (2)
❖ Secure Enclave
❖ Touch ID
❖ LocalAuthentication
❖ Keychain ACLs
Secure Enclave
❖ Встроенный защищенный со-процессор
❖ Отдельная ОС, secure boot
❖ A7+(iPhone 5s и новее)
❖ Отвечает за Touch ID, проверку пасскода, шифрование данных, Keychain ACL
Touch ID " bàøåì Cð,ë%›å…,,?
LocalAuthentication Framework
Keychain Access Control Lists
LocalAuthentication
let context = LAContext() if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) { context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: <# Reason #>) { (success, error) in if success { <# User authentication successful #> } } }
Keychain ACL
Задаёт условия при которых данные из Keychain будут возвращены:❖ kSecAccessControlUserPresence
❖ kSecAccessControlTouchIDAny
❖ kSecAccessControlTouchIDCurrentSet
❖ kSecAccessControlDevicePasscode
❖ kSecAccessControlOr, kSecAccessControlAnd
Keychain ACL
let acl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, .touchIDCurrentSet, nil) let attributes = [ kSecAttrAccessControl: acl!, // ... ] as NSDictionary SecItemAdd(attributes as CFDictionary, nil)
Keychain ACL
Задает дополнительный секрет без которого получение данных из Keychain невозможно:❖ kSecAccessControlApplicationPassword
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)
Ò,C,÷…/å %ø,K*,
❖ Хранение паролей/конфиденциальной информации в NSUserDefaults/UserDefaults, SQLite (например через CoreData), и т.п.
❖ Использование NSFileProtectionNone/kSecAttrAccessibleAlways
❖ “Утечка” паролей/конфиденциальной информации в логи
❖ Пароли/конфиденциальная информация на скриншотах
Data Protection ƒà?,?àå2 äà……/å …à 3“2ð%L“2"å
Data Protection …å C%ì%›å2 å“ë, äà……/å C%*,äàþ2 3“2ð%L“2"% (K.*àC, “,…õð%…,ƒàö,ÿ, , 2.C.)
œr2å÷*,B äà……/õ
iTunes Backup iCloud
File Sharing Джейлбрейк
iTunes Backup
❖ <app>/Documents включается в бэкап
❖ <app>/Library/Caches и <app>/tmp не включаются в бэкап
❖ NSURLIsExcludedFromBackupKey исключает файл из бэкапа
❖ Из зашифрованного бэкапа можно извлечь записи Keychain, кроме тех, для которых установлен класс …ThisDeviceOnly
File Sharing
❖ Доступ к “песочнице” приложения
❖ Был включен по умолчанию до iOS 8.3
❖ Все еще включен по умолчанию в бета-версиях iOS
❖ В iOS 8.4+ включен только для приложений с UIFileSharingEnabled
jà* ƒà?,2,2ü äà……/å?
❖ Data Protection не поможет защитить данные вне устройства
❖ Используйте дополнительный уровень шифрования
❖ Например, SQLCipher
❖ Или SQLite Encryption Extension
❖ Ключ/пароль от БД храните в Keychain с надежным классом защиты
Ïð,ë%›å…,ÿì …3›…% Cåðåäà"à2ü äà……/å
Transport Layer Security
❖ TLS (для TCP) и DTLS (для UDP) являются стандартами для защиты данных при передаче по сети
❖ Проблема: (D)TLS зависит от сертификатов
qåð2,ô,*à2/
❖ iOS 10 содержит 172 доверенных сертификата❖ https://support.apple.com/en-us/HT207177
❖ iOS “верит” всем сертификатам, подписанным любым из этих сертификатов
Certificate Pinning
❖ Ограничивает список доверенных сертификатов для данного хоста/сервиса
❖ “Сертификат сервера abc.com имеет отпечаток 01 23 45 …”
❖ “Сертификат сервера def.com выпущен Let's Encrypt”
❖ Требует аккуратного обращения — можно невзначай “сломать” клиентов
Certificate Pinning
❖ Легко допустить ошибки
❖ Реализация в AFNetworking, например, случайно отключила валидацию сертификатов
❖ https://datatheorem.github.io/TrustKit/
Certificate Transparency
❖ Журналирует выпущенные сертификаты
❖ Не позволяет удалить сертификат из журнала
❖ Клиент может проверить есть ли сертификат сервера в CT
❖ https://www.certificate-transparency.org/
App Transport Security
В теории:
❖ Блокирует небезопасные соединения
❖ Позволяет создавать исключения
На практике:
App Transport Security
❖ С Января 2017 исключения потребуют обоснования и дополнительного рассмотрения при подаче в AppStore
❖ NSAllowsArbitraryLoads ❖ NSAllowsArbitraryLoadsForMedia ❖ NSAllowsArbitraryLoadsInWebContent ❖ NSExceptionAllowsInsecureHTTPLoads ❖ NSExceptionMinimumTLSVersion
❖ SFSafariViewController не требует исключений
App Transport Security
❖ Поддержка ATS требует изменений на сервере
❖ Действительный сертификат ключа RSA (2048 бит и более) или ECC (256 бит и более), SHA-256
❖ TLS 1.2
❖ ECDHE❖ https://developer.apple.com/
ATS + CT
Jailbreak
Ïð,ë%›å…,ÿ , Jailbreak
❖ Не полагайтесь на jailbreak detection на 100%
❖ Принимайте все критичные решения вне приложения
XcodeGhost
qCà“,K%[email protected]
@abelenko