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

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

CodeFest
January 31, 2018

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

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

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

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

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% ❖ Принимайте все критичные решения вне приложения