Андрей Беленко "Безопасность мобильных приложений...
TRANSCRIPT
![Page 1: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/1.jpg)
![Page 2: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/2.jpg)
Ï%"å“2*à
❖ Защита данных на устройстве❖ iOS Data Protection❖ Keychain
❖ Защита данных в сети❖ TLS❖ ATS
![Page 3: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/3.jpg)
gà÷åì (, %2 *%ã%) ƒà?,?à2ü äà……/å?
![Page 4: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/4.jpg)
Ïð,ë%›å…,ÿì …3›…% õðà…,2ü äà……/å
![Page 5: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/5.jpg)
iOS Data Protection (1)
❖ Различные классы защиты
❖ Шифрование файлов
❖ Keychain для хранения паролей и ключей
❖ Шифрование может быть “привязано” к пасскоду
❖ Шифрование резервных копий
![Page 6: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/6.jpg)
jëà““ ƒà?,2/ %Cðåäåëÿå2 ä%“23C…%“2ü ƒà?,?àåì/õ äà……/õ
![Page 7: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/7.jpg)
jëà““ ƒà?,2/ %Cðåäåëÿå2 ä%“23C…%“2ü ƒà?,?àåì/õ äà……/õ
![Page 8: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/8.jpg)
jëà““/ ƒà?,2/: Keychain
❖ kSecAttrAccessibleAlways[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]
❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
![Page 9: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/9.jpg)
jëà““/ ƒà?,2/: Keychain
❖ kSecAttrAccessibleAlways[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]
❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
![Page 10: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/10.jpg)
jëà““/ ƒà?,2/: Keychain
❖ kSecAttrAccessibleAlways[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]
❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
![Page 11: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/11.jpg)
jëà““/ ƒà?,2/: Keychain
❖ kSecAttrAccessibleAlways[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenUnlocked[ThisDeviceOnly]
❖ kSecAttrAccessibleAfterFirstUnlock[ThisDeviceOnly]
❖ kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
![Page 12: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/12.jpg)
jëà““/ ƒà?,2/: ôàLë/
❖ NSFileProtectionNone
❖ NSFileProtectionComplete
❖ NSFileProtectionCompleteUntilFirstUserAuthentication
❖ NSFileProtectionCompleteUnlessOpen
![Page 13: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/13.jpg)
jëà““/ ƒà?,2/: ôàLë/
❖ NSFileProtectionNone
❖ NSFileProtectionComplete
❖ NSFileProtectionCompleteUntilFirstUserAuthentication
❖ NSFileProtectionCompleteUnlessOpen
![Page 14: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/14.jpg)
jëà““/ ƒà?,2/: ôàLë/
❖ NSFileProtectionNone
❖ NSFileProtectionComplete
❖ NSFileProtectionCompleteUntilFirstUserAuthentication
❖ NSFileProtectionCompleteUnlessOpen
![Page 15: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/15.jpg)
jëà““/ ƒà?,2/: ôàLë/
❖ NSFileProtectionNone
❖ NSFileProtectionComplete
❖ NSFileProtectionCompleteUntilFirstUserAuthentication
❖ NSFileProtectionCompleteUnlessOpen
![Page 16: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/16.jpg)
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: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/17.jpg)
jà* 3“2à…%",2ü *ëà““ ƒà?,2/?
![Page 18: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/18.jpg)
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: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/19.jpg)
jà* 3“2à…%",2ü *ëà““ ƒà?,2/?
let attributes = [ kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly, // ... ] as NSDictionary SecItemAdd(attributes as CFDictionary, nil)
![Page 20: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/20.jpg)
iOS Data Protection (2)
❖ Secure Enclave
❖ Touch ID
❖ LocalAuthentication
❖ Keychain ACLs
![Page 21: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/21.jpg)
Secure Enclave
❖ Встроенный защищенный со-процессор
❖ Отдельная ОС, secure boot
❖ A7+(iPhone 5s и новее)
❖ Отвечает за Touch ID, проверку пасскода, шифрование данных, Keychain ACL
![Page 22: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/22.jpg)
Touch ID " bàøåì Cð,ë%›å…,,?
LocalAuthentication Framework
Keychain Access Control Lists
![Page 23: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/23.jpg)
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: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/24.jpg)
Keychain ACL
Задаёт условия при которых данные из Keychain будут возвращены:❖ kSecAccessControlUserPresence
❖ kSecAccessControlTouchIDAny
❖ kSecAccessControlTouchIDCurrentSet
❖ kSecAccessControlDevicePasscode
❖ kSecAccessControlOr, kSecAccessControlAnd
![Page 25: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/25.jpg)
Keychain ACL
let acl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, .touchIDCurrentSet, nil) let attributes = [ kSecAttrAccessControl: acl!, // ... ] as NSDictionary SecItemAdd(attributes as CFDictionary, nil)
![Page 26: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/26.jpg)
Keychain ACL
Задает дополнительный секрет без которого получение данных из Keychain невозможно:❖ kSecAccessControlApplicationPassword
![Page 27: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/27.jpg)
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: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/28.jpg)
Ò,C,÷…/å %ø,K*,
❖ Хранение паролей/конфиденциальной информации в NSUserDefaults/UserDefaults, SQLite (например через CoreData), и т.п.
❖ Использование NSFileProtectionNone/kSecAttrAccessibleAlways
❖ “Утечка” паролей/конфиденциальной информации в логи
❖ Пароли/конфиденциальная информация на скриншотах
![Page 29: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/29.jpg)
Data Protection ƒà?,?àå2 äà……/å …à 3“2ð%L“2"å
![Page 30: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/30.jpg)
Data Protection …å C%ì%›å2 å“ë, äà……/å C%*,äàþ2 3“2ð%L“2"% (K.*àC, “,…õð%…,ƒàö,ÿ, , 2.C.)
![Page 31: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/31.jpg)
œr2å÷*,B äà……/õ
iTunes Backup iCloud
File Sharing Джейлбрейк
![Page 32: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/32.jpg)
iTunes Backup
❖ <app>/Documents включается в бэкап
❖ <app>/Library/Caches и <app>/tmp не включаются в бэкап
❖ NSURLIsExcludedFromBackupKey исключает файл из бэкапа
❖ Из зашифрованного бэкапа можно извлечь записи Keychain, кроме тех, для которых установлен класс …ThisDeviceOnly
![Page 33: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/33.jpg)
File Sharing
❖ Доступ к “песочнице” приложения
❖ Был включен по умолчанию до iOS 8.3
❖ Все еще включен по умолчанию в бета-версиях iOS
❖ В iOS 8.4+ включен только для приложений с UIFileSharingEnabled
![Page 34: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/34.jpg)
jà* ƒà?,2,2ü äà……/å?
❖ Data Protection не поможет защитить данные вне устройства
❖ Используйте дополнительный уровень шифрования
❖ Например, SQLCipher
❖ Или SQLite Encryption Extension
❖ Ключ/пароль от БД храните в Keychain с надежным классом защиты
![Page 35: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/35.jpg)
Ïð,ë%›å…,ÿì …3›…% Cåðåäà"à2ü äà……/å
![Page 36: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/36.jpg)
Transport Layer Security
❖ TLS (для TCP) и DTLS (для UDP) являются стандартами для защиты данных при передаче по сети
❖ Проблема: (D)TLS зависит от сертификатов
![Page 37: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/37.jpg)
qåð2,ô,*à2/
❖ iOS 10 содержит 172 доверенных сертификата❖ https://support.apple.com/en-us/HT207177
❖ iOS “верит” всем сертификатам, подписанным любым из этих сертификатов
![Page 38: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/38.jpg)
Certificate Pinning
❖ Ограничивает список доверенных сертификатов для данного хоста/сервиса
❖ “Сертификат сервера abc.com имеет отпечаток 01 23 45 …”
❖ “Сертификат сервера def.com выпущен Let's Encrypt”
❖ Требует аккуратного обращения — можно невзначай “сломать” клиентов
![Page 39: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/39.jpg)
Certificate Pinning
❖ Легко допустить ошибки
❖ Реализация в AFNetworking, например, случайно отключила валидацию сертификатов
❖ https://datatheorem.github.io/TrustKit/
![Page 40: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/40.jpg)
Certificate Transparency
❖ Журналирует выпущенные сертификаты
❖ Не позволяет удалить сертификат из журнала
❖ Клиент может проверить есть ли сертификат сервера в CT
❖ https://www.certificate-transparency.org/
![Page 41: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/41.jpg)
App Transport Security
В теории:
❖ Блокирует небезопасные соединения
❖ Позволяет создавать исключения
На практике:
![Page 42: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/42.jpg)
App Transport Security
❖ С Января 2017 исключения потребуют обоснования и дополнительного рассмотрения при подаче в AppStore
❖ NSAllowsArbitraryLoads ❖ NSAllowsArbitraryLoadsForMedia ❖ NSAllowsArbitraryLoadsInWebContent ❖ NSExceptionAllowsInsecureHTTPLoads ❖ NSExceptionMinimumTLSVersion
❖ SFSafariViewController не требует исключений
![Page 43: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/43.jpg)
App Transport Security
❖ Поддержка ATS требует изменений на сервере
❖ Действительный сертификат ключа RSA (2048 бит и более) или ECC (256 бит и более), SHA-256
❖ TLS 1.2
❖ ECDHE❖ https://developer.apple.com/
![Page 44: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/44.jpg)
ATS + CT
![Page 45: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/45.jpg)
Jailbreak
![Page 46: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/46.jpg)
Ïð,ë%›å…,ÿ , Jailbreak
❖ Не полагайтесь на jailbreak detection на 100%
❖ Принимайте все критичные решения вне приложения
![Page 47: Андрей Беленко "Безопасность мобильных приложений "](https://reader030.vdocuments.net/reader030/viewer/2022012821/58847ed71a28ab5e248b7c45/html5/thumbnails/47.jpg)
XcodeGhost