48

Андрей Беленко "Безопасность мобильных приложений "

Embed Size (px)

Citation preview

Page 1: Андрей Беленко "Безопасность мобильных приложений "
Page 2: Андрей Беленко "Безопасность мобильных приложений "

Ï%"å“2*à

❖ Защита данных на устройстве❖ iOS Data Protection❖ Keychain

❖ Защита данных в сети❖ TLS❖ ATS

Page 3: Андрей Беленко "Безопасность мобильных приложений "

gà÷åì (, %2 *%ã%) ƒà?,?à2ü äà……/å?

Page 4: Андрей Беленко "Безопасность мобильных приложений "

Ïð,ë%›å…,ÿì …3›…% õðà…,2ü äà……/å

Page 5: Андрей Беленко "Безопасность мобильных приложений "

iOS Data Protection (1)

❖ Различные классы защиты

❖ Шифрование файлов

❖ Keychain для хранения паролей и ключей

❖ Шифрование может быть “привязано” к пасскоду

❖ Шифрование резервных копий

Page 6: Андрей Беленко "Безопасность мобильных приложений "

jëà““ ƒà?,2/ %Cðåäåëÿå2 ä%“23C…%“2ü ƒà?,?àåì/õ äà……/õ

Page 7: Андрей Беленко "Безопасность мобильных приложений "

jëà““ ƒà?,2/ %Cðåäåëÿå2 ä%“23C…%“2ü ƒà?,?àåì/õ äà……/õ

Page 8: Андрей Беленко "Безопасность мобильных приложений "

jëà““/ ƒà?,2/: Keychain

❖ kSecAttrAccessibleAlways[ThisDeviceOnly]

❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]

❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]

❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly

Page 9: Андрей Беленко "Безопасность мобильных приложений "

jëà““/ ƒà?,2/: Keychain

❖ kSecAttrAccessibleAlways[ThisDeviceOnly]

❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]

❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]

❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly

Page 10: Андрей Беленко "Безопасность мобильных приложений "

jëà““/ ƒà?,2/: Keychain

❖ kSecAttrAccessibleAlways[ThisDeviceOnly]

❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]

❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]

❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly

Page 11: Андрей Беленко "Безопасность мобильных приложений "

jëà““/ ƒà?,2/: Keychain

❖ kSecAttrAccessibleAlways[ThisDeviceOnly]

❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]

❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]

❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly

Page 12: Андрей Беленко "Безопасность мобильных приложений "

jëà““/ ƒà?,2/: ôàLë/

❖ NSFileProtectionNone

❖ NSFileProtectionComplete

❖ NSFileProtectionCompleteUntilFirstUserAuthentication

❖ NSFileProtectionCompleteUnlessOpen

Page 13: Андрей Беленко "Безопасность мобильных приложений "

jëà““/ ƒà?,2/: ôàLë/

❖ NSFileProtectionNone

❖ NSFileProtectionComplete

❖ NSFileProtectionCompleteUntilFirstUserAuthentication

❖ NSFileProtectionCompleteUnlessOpen

Page 14: Андрей Беленко "Безопасность мобильных приложений "

jëà““/ ƒà?,2/: ôàLë/

❖ NSFileProtectionNone

❖ NSFileProtectionComplete

❖ NSFileProtectionCompleteUntilFirstUserAuthentication

❖ NSFileProtectionCompleteUnlessOpen

Page 15: Андрей Беленко "Безопасность мобильных приложений "

jëà““/ ƒà?,2/: ôàLë/

❖ NSFileProtectionNone

❖ NSFileProtectionComplete

❖ NSFileProtectionCompleteUntilFirstUserAuthentication

❖ NSFileProtectionCompleteUnlessOpen

Page 16: Андрей Беленко "Безопасность мобильных приложений "

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#> } }

Page 17: Андрей Беленко "Безопасность мобильных приложений "

jà* 3“2à…%",2ü *ëà““ ƒà?,2/?

Page 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)

Page 19: Андрей Беленко "Безопасность мобильных приложений "

jà* 3“2à…%",2ü *ëà““ ƒà?,2/?

let attributes = [ kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly, // ... ] as NSDictionary SecItemAdd(attributes as CFDictionary, nil)

Page 20: Андрей Беленко "Безопасность мобильных приложений "

iOS Data Protection (2)

❖ Secure Enclave

❖ Touch ID

❖ LocalAuthentication

❖ Keychain ACLs

Page 21: Андрей Беленко "Безопасность мобильных приложений "

Secure Enclave

❖ Встроенный защищенный со-процессор

❖ Отдельная ОС, secure boot

❖ A7+(iPhone 5s и новее)

❖ Отвечает за Touch ID, проверку пасскода, шифрование данных, Keychain ACL

Page 22: Андрей Беленко "Безопасность мобильных приложений "

Touch ID " bàøåì Cð,ë%›å…,,?

LocalAuthentication Framework

Keychain Access Control Lists

Page 23: Андрей Беленко "Безопасность мобильных приложений "

LocalAuthentication

let context = LAContext() if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) { context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: <# Reason #>) { (success, error) in if success { <# User authentication successful #> } } }

Page 24: Андрей Беленко "Безопасность мобильных приложений "

Keychain ACL

Задаёт условия при которых данные из Keychain будут возвращены:❖ kSecAccessControlUserPresence

❖ kSecAccessControlTouchIDAny

❖ kSecAccessControlTouchIDCurrentSet

❖ kSecAccessControlDevicePasscode

❖ kSecAccessControlOr, kSecAccessControlAnd

Page 25: Андрей Беленко "Безопасность мобильных приложений "

Keychain ACL

let acl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, .touchIDCurrentSet, nil) let attributes = [ kSecAttrAccessControl: acl!, // ... ] as NSDictionary SecItemAdd(attributes as CFDictionary, nil)

Page 26: Андрей Беленко "Безопасность мобильных приложений "

Keychain ACL

Задает дополнительный секрет без которого получение данных из Keychain невозможно:❖ kSecAccessControlApplicationPassword

Page 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)

Page 28: Андрей Беленко "Безопасность мобильных приложений "

Ò,C,÷…/å %ø,K*,

❖ Хранение паролей/конфиденциальной информации в NSUserDefaults/UserDefaults, SQLite (например через CoreData), и т.п.

❖ Использование NSFileProtectionNone/kSecAttrAccessibleAlways

❖ “Утечка” паролей/конфиденциальной информации в логи

❖ Пароли/конфиденциальная информация на скриншотах

Page 29: Андрей Беленко "Безопасность мобильных приложений "

Data Protection ƒà?,?àå2 äà……/å …à 3“2ð%L“2"å

Page 30: Андрей Беленко "Безопасность мобильных приложений "

Data Protection …å C%ì%›å2 å“ë, äà……/å C%*,äàþ2 3“2ð%L“2"% (K.*àC, “,…õð%…,ƒàö,ÿ, , 2.C.)

Page 31: Андрей Беленко "Безопасность мобильных приложений "

œr2å÷*,B äà……/õ

iTunes Backup iCloud

File Sharing Джейлбрейк

Page 32: Андрей Беленко "Безопасность мобильных приложений "

iTunes Backup

❖ <app>/Documents включается в бэкап

❖ <app>/Library/Caches и <app>/tmp не включаются в бэкап

❖ NSURLIsExcludedFromBackupKey исключает файл из бэкапа

❖ Из зашифрованного бэкапа можно извлечь записи Keychain, кроме тех, для которых установлен класс …ThisDeviceOnly

Page 33: Андрей Беленко "Безопасность мобильных приложений "

File Sharing

❖ Доступ к “песочнице” приложения

❖ Был включен по умолчанию до iOS 8.3

❖ Все еще включен по умолчанию в бета-версиях iOS

❖ В iOS 8.4+ включен только для приложений с UIFileSharingEnabled

Page 34: Андрей Беленко "Безопасность мобильных приложений "

jà* ƒà?,2,2ü äà……/å?

❖ Data Protection не поможет защитить данные вне устройства

❖ Используйте дополнительный уровень шифрования

❖ Например, SQLCipher

❖ Или SQLite Encryption Extension

❖ Ключ/пароль от БД храните в Keychain с надежным классом защиты

Page 35: Андрей Беленко "Безопасность мобильных приложений "

Ïð,ë%›å…,ÿì …3›…% Cåðåäà"à2ü äà……/å

Page 36: Андрей Беленко "Безопасность мобильных приложений "

Transport Layer Security

❖ TLS (для TCP) и DTLS (для UDP) являются стандартами для защиты данных при передаче по сети

❖ Проблема: (D)TLS зависит от сертификатов

Page 37: Андрей Беленко "Безопасность мобильных приложений "

qåð2,ô,*à2/

❖ iOS 10 содержит 172 доверенных сертификата❖ https://support.apple.com/en-us/HT207177

❖ iOS “верит” всем сертификатам, подписанным любым из этих сертификатов

Page 38: Андрей Беленко "Безопасность мобильных приложений "

Certificate Pinning

❖ Ограничивает список доверенных сертификатов для данного хоста/сервиса

❖ “Сертификат сервера abc.com имеет отпечаток 01 23 45 …”

❖ “Сертификат сервера def.com выпущен Let's Encrypt”

❖ Требует аккуратного обращения — можно невзначай “сломать” клиентов

Page 39: Андрей Беленко "Безопасность мобильных приложений "

Certificate Pinning

❖ Легко допустить ошибки

❖ Реализация в AFNetworking, например, случайно отключила валидацию сертификатов

❖ https://datatheorem.github.io/TrustKit/

Page 40: Андрей Беленко "Безопасность мобильных приложений "

Certificate Transparency

❖ Журналирует выпущенные сертификаты

❖ Не позволяет удалить сертификат из журнала

❖ Клиент может проверить есть ли сертификат сервера в CT

❖ https://www.certificate-transparency.org/

Page 41: Андрей Беленко "Безопасность мобильных приложений "

App Transport Security

В теории:

❖ Блокирует небезопасные соединения

❖ Позволяет создавать исключения

На практике:

Page 42: Андрей Беленко "Безопасность мобильных приложений "

App Transport Security

❖ С Января 2017 исключения потребуют обоснования и дополнительного рассмотрения при подаче в AppStore

❖ NSAllowsArbitraryLoads ❖ NSAllowsArbitraryLoadsForMedia ❖ NSAllowsArbitraryLoadsInWebContent ❖ NSExceptionAllowsInsecureHTTPLoads ❖ NSExceptionMinimumTLSVersion

❖ SFSafariViewController не требует исключений

Page 43: Андрей Беленко "Безопасность мобильных приложений "

App Transport Security

❖ Поддержка ATS требует изменений на сервере

❖ Действительный сертификат ключа RSA (2048 бит и более) или ECC (256 бит и более), SHA-256

❖ TLS 1.2

❖ ECDHE❖ https://developer.apple.com/

Page 44: Андрей Беленко "Безопасность мобильных приложений "

ATS + CT

Page 45: Андрей Беленко "Безопасность мобильных приложений "

Jailbreak

Page 46: Андрей Беленко "Безопасность мобильных приложений "

Ïð,ë%›å…,ÿ , Jailbreak

❖ Не полагайтесь на jailbreak detection на 100%

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

Page 47: Андрей Беленко "Безопасность мобильных приложений "

XcodeGhost

Page 48: Андрей Беленко "Безопасность мобильных приложений "

qCà“,K%[email protected]

@abelenko