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

16b6c87229eaf58768d25ed7b2bbbf52?s=47 CodeFest
January 31, 2018

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

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

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

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

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

January 31, 2018
Tweet

Transcript

  1. Безопасность мобильных приложений Андрей Беленко Security PM Skype

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

    iOS Data Protection ❖ Keychain ❖ Как защитить данные при передаче по сети ❖ TLS и его проблемы ❖ ATS
  3. Зачем (и от кого) защищать данные?

  4. Приложениям нужно хранить данные

  5. None
  6. None
  7. None
  8. None
  9. Типичные ошибки ❖ Хранение паролей/конфиденциальной информации в NSUserDefaults/ UserDefaults, SQLite

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

    файлов ❖ Keychain для хранения паролей и ключей ❖ Шифрование может быть “привязано” к пасскоду ❖ Шифрование резервных копий ❖ Доступно с iOS 4
  11. Класс защиты определяет доступность защищаемых данных

  12. Класс защиты определяет доступность защищаемых данных

  13. Классы защиты kSecAttrAccessibleAlways[ThisDeviceOnly] & NSFileProtectionNone

  14. Классы защиты kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly] kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly & NSFileProtectionComplete NSFileProtectionCompleteUnlessOpen

  15. Классы защиты kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly] & NSFileProtectionCompleteUntilFirstUserAuthentication

  16. Как определить доступность? if UIApplication.shared.isProtectedDataAvailable { <#code#> }

  17. Как определить доступность? class AppDelegate: UIApplicationDelegate { func applicationProtectedDataDidBecomeAvailable(_ application:

    UIApplication) { <#code#> } func applicationProtectedDataWillBecomeUnavailable(_ application: UIApplication) { <#code#> } }
  18. Как установить класс защиты?

  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 #> } } }
  25. Keychain ACL задаёт условия при которых ОС вернет данные из

    Keychain
  26. Keychain ACL kSecAccessControlUserPresence

  27. Keychain ACL kSecAccessControlTouchIDAny

  28. Keychain ACL kSecAccessControlTouchIDCurrentSet

  29. Keychain ACL kSecAccessControlDevicePasscode

  30. Keychain ACL kSecAccessControlApplicationPassword

  31. Keychain ACL kSecAccessControlOr, kSecAccessControlAnd

  32. Keychain ACL let acl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenUnlocked, .touchIDCurrentSet, nil) let

    attributes = [ kSecAttrAccessControl: acl!, // ... ] as NSDictionary SecItemAdd(attributes as CFDictionary, nil)
  33. 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)
  34. Data Protection защищает данные на устройстве

  35. Data Protection не поможет если данные покидают устройство (бэкап, синхронизация,

    и т.п.)
  36. “Утечки” данных iTunes Backup iCloud File Sharing Джейлбрейк

  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 с надежным классом защиты
  40. Приложениям нужно передавать данные

  41. None
  42. None
  43. None
  44. None
  45. App Transport Security В теории: ❖ Блокирует небезопасные соединения ❖

    Позволяет создавать исключения
  46. App Transport Security На практике:

  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/
  54. ATS + CT

  55. Jailbreak

  56. Приложения и Jailbreak ❖ Не полагайтесь на jailbreak detection на

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

  58. @abelenko Андрей Беленко Security PM Skype Вопросы? andrey.belenko@gmail.com