Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Андрей Беленко (Microsoft), Mobile Безопасност...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for CodeFest CodeFest
January 31, 2018

Андрей Беленко (Microsoft), Mobile Безопасность мобильных приложений, CodeFest 2017

https://2017.codefest.ru/lecture/1216

Защита приложений и пользовательских данных — непростая задача. Много что может пойти не так и много где можно допустить ошибки. Цель доклада — помочь разработчикам избежать этих ошибок.

Рассмотрим доступные механизмы защиты данных в iOS, антишаблоны при их использовании, распространенные проблемы и способы их избежать. Рассмотрим способы защиты данных при хранении на устройстве и при передаче по сети. Поговорим о грядущем требовании включать ATS, о Secure Enclave, о вредоносном коде (malware) и джейлбрейке.

Avatar for CodeFest

CodeFest

January 31, 2018
Tweet

More Decks by CodeFest

Other Decks in Technology

Transcript

  1. Что Вы Узнаете? ❖ Как защитить данные на устройстве ❖

    iOS Data Protection ❖ Keychain ❖ Как защитить данные при передаче по сети ❖ TLS и его проблемы ❖ ATS
  2. Типичные ошибки ❖ Хранение паролей/конфиденциальной информации в NSUserDefaults/ UserDefaults, SQLite

    (например через CoreData), и т.п. ❖ Использование NSFileProtectionNone/kSecAttrAccessibleAlways ❖ “Утечка” паролей/конфиденциальной информации в логи ❖ Пароли/конфиденциальная информация на скриншотах
  3. iOS Data Protection (1) ❖ Различные классы защиты ❖ Шифрование

    файлов ❖ Keychain для хранения паролей и ключей ❖ Шифрование может быть “привязано” к пасскоду ❖ Шифрование резервных копий ❖ Доступно с iOS 4
  4. Как определить доступность? class AppDelegate: UIApplicationDelegate { func applicationProtectedDataDidBecomeAvailable(_ application:

    UIApplication) { <#code#> } func applicationProtectedDataWillBecomeUnavailable(_ application: UIApplication) { <#code#> } }
  5. Как установить класс защиты? // 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)
  6. iOS Data Protection (2) ❖ Secure Enclave ❖ Touch ID

    ❖ LocalAuthentication ❖ Keychain ACLs ❖ iPhone 5s
  7. Secure Enclave ❖ Встроенный защищенный со-процессор ❖ Отдельная ОС, secure

    boot ❖ A7+(iPhone 5s и новее) ❖ Отвечает за Touch ID, проверку пасскода, шифрование данных, Keychain ACL
  8. LocalAuthentication let context = LAContext() if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) {

    context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: <# Reason #>) { (success, error) in if success { <# User authentication successful #> } } }
  9. Keychain ACL let acl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenUnlocked, .touchIDCurrentSet, nil) let

    attributes = [ kSecAttrAccessControl: acl!, // ... ] as NSDictionary SecItemAdd(attributes as CFDictionary, nil)
  10. 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)
  11. iTunes Backup ❖ <app>/Documents включается в бэкап ❖ <app>/Library/Caches и

    <app>/tmp не включаются в бэкап ❖ NSURLIsExcludedFromBackupKey исключает файл из бэкапа ❖ Из зашифрованного бэкапа можно извлечь записи Keychain, кроме тех, для которых установлен класс …ThisDeviceOnly
  12. File Sharing ❖ Доступ к “песочнице” приложения ❖ Был включен

    по умолчанию до iOS 8.3 ❖ Все еще включен по умолчанию в бета-версиях iOS ❖ В iOS 8.4+ включен только для приложений с UIFileSharingEnabled
  13. Как защитить данные? ❖ Data Protection не поможет защитить данные

    вне устройства ❖ Используйте дополнительный уровень шифрования ❖ Например, SQLCipher ❖ Или SQLite Encryption Extension ❖ Ключ/пароль от БД храните в Keychain с надежным классом защиты
  14. App Transport Security ❖ WWDC 2016: с января 2017 исключения

    потребуют обоснования и дополнительного рассмотрения при подаче в AppStore ❖ NSAllowsArbitraryLoads ❖ NSAllowsArbitraryLoadsForMedia ❖ NSAllowsArbitraryLoadsInWebContent ❖ NSExceptionAllowsInsecureHTTPLoads ❖ NSExceptionMinimumTLSVersion ❖ SFSafariViewController не требует исключений ❖ 2016-12-21: Apple отложила введение этого правила
  15. App Transport Security ❖ Поддержка ATS требует изменений на сервере

    ❖ Действительный сертификат ключа RSA (2048 бит и более) или ECC (256 бит и более), SHA-256 ❖ TLS 1.2 ❖ ECDHE ❖ https://developer.apple.com/
  16. Transport Layer Security ❖ TLS (для TCP) и DTLS (для

    UDP) являются стандартами для защиты данных при передаче по сети ❖ Проблема: (D)TLS зависит от сертификатов
  17. Сертификаты ❖ iOS 10 содержит 172 доверенных сертификата ❖ https://support.apple.com/en-us/HT207177

    ❖ iOS “верит” всем сертификатам, подписанным любым из этих сертификатов
  18. Certificate Pinning ❖ Ограничивает список доверенных сертификатов для данного хоста/сервиса

    ❖ “Сертификат сервера myservice.com имеет отпечаток 012345…” ❖ “Сертификат сервера otherservice.com выпущен Let's Encrypt” ❖ Требует аккуратного обращения — можно невзначай “сломать” клиентов
  19. Certificate Pinning ❖ Легко допустить ошибки ❖ Реализация в AFNetworking,

    например, случайно отключила валидацию сертификатов ❖ https://datatheorem.github.io/TrustKit/
  20. Certificate Transparency ❖ Журналирует выпущенные сертификаты ❖ Не позволяет удалить

    сертификат из журнала ❖ Клиент может проверить есть ли сертификат сервера в CT ❖ https://www.certificate-transparency.org/
  21. Приложения и Jailbreak ❖ Не полагайтесь на jailbreak detection на

    100% ❖ Принимайте все критичные решения вне приложения