Uploaded by kigokat560

Grisha Lyullin Osnovy bezopasnosti iOS-prilozhenii 774

advertisement
Основы безопасности
iOS приложений
@jayfromfuture
whoami
- Гриша Люллин
- СПбГЭТУ «ЛЭТИ»,
ФКТИ, КБ - done
- Java developer - 5 лет
- Application security
инженер в Wrike - 1 год
- spbctf с 2017 - н.
в. 💙💙💙
2
Подготовить окружение
3
Окружение
Минимум:
●
●
●
●
компьютер-хост (в идеале с
macOS)
джейлброкнутый девайс с
желаемой версии iOS (симулятор
не подойдет)
сеть Wi-Fi, которая разрешает
трафик от клиента к клиенту (или
подход SSH Over USB)
Перехватывающий прокси (Burp
Suite, Charles, mitmproxy и т.д.)
https://gph.is/g/4LWgVRL
4
Окружение: джейлбрейк
1.
2.
3.
4.
Найти подходящий тестовое устройство, сделать
резервную копию.
Проверить, что для установленной версии iOS есть
джейлбрейк: https://canijailbreak.com/
Если есть варианты, то выбрать наиболее
подходящий (сравнения между Tethered / Untethered,
https://cydia-app.com/tethered-vs-untethered/)
Джейлбрейкнуть, следуя инструкции к выбранному
способу:
- Checkra1n: https://checkra.in/ ,
https://cydia-app.com/checkrain/
- Unc0ver: https://unc0ver.dev/,
https://cydia-app.com/unc0ver
https://giphy.com/gifs/spongebob-spongebob-squar
epants-nickelodeon-10isG6thgr3QIM
“Технический анализ эксплойта checkm8” (a1exdandy,
Digital Security),
https://habr.com/ru/company/dsec/blog/471668/
5
Окружение: полезные приложения
Что дальше:
●
Установить Cydia (процесс может отличаться в зависимости от джейлбрейка
https://cydia-app.com/checkrain/)
Поставить полезные приложения, например:
●
●
●
●
●
●
файловый менеджер (Filza File Manager,
http://cydia.saurik.com/package/com.tigisoftware.filza/)
терминал (например NewTerm 2: https://chariz.com/get/newterm)
sshd (OpenSSH: https://cydia.saurik.com/openssh.html) и поменять стандартный
пароль
(https://www.reddit.com/r/jailbreak/comments/atsgyh/tutorial_set_a_new_ssh_root_pas
sword/)
обход обнаружения джейлбрейка (наприер, Liberty Lite:
https://yalujailbreak.net/liberty-lite/)
обход валидации SSL сертификатов / пиннинга (ssl-kill-switch2,
https://github.com/nabla-c0d3/ssl-kill-switch2
приложение для установки неподписанных IPA файлов (например, AppSync
Unified: https://cydia.akemi.ai/?page/net.angelxwind.appsyncunified)
6
Окружение: прокси
1.
2.
3.
4.
Подключить хост и девайс к
одной Wi-Fi сети. В качестве
альтернативы можно сделать:
SSH поверх USB + пробросить
порт
○ iproxy 2222 22
○ ssh -R 8080:localhost:8080
root@localhost -p 2222
Сконфигурировать прокси в
настройках Wi-Fi на устройстве.
Запустить прокси.
Добавить сертификат от прокси
на девайс в список доверенных:
https://portswigger.net/support/insta
lling-burp-suites-ca-certificate-in-anios-device
7
Раздобыть IPA файл
8
Как получить IPA файл приложения
-
-
-
Приложения для управления
устройством с компьютера
(например, iTunes или Apple
Configurator 2
https://apps.apple.com/ru/app/appl
e-configurator-2/id1037126344?l=e
n&mt=12)
установить из AppStore и потом
сдампить (например, через
frida-ios-dump
https://github.com/AloneMonkey/fri
da-ios-dump)
Сайты с IPA файлами (IPA Library
https://iosninja.io/ipa-library и
аналогичные).
9
Получить IPA используя Apple Configurator 2
1.
2.
3.
4.
Установить приложение на
девайс
Выбрать это приложение в Apple
Configurator 2, подключить
девайс, начать обновление
Отключить девайс
(опционально, так загруженный
IPA файл дольше доступен)
Забрать IPA на хосте по пути
вида:
~/Library/Group
Containers/<id>.group.com.apple.c
onfigurator/Library/Caches/Assets/
TemporaryItems/MobileApps
10
IPA файл: распаковка
https://tenor.com/view/xmas-christmas-gift-opening-excited-snl-gif-10593261
11
IPA файл: разархивирование
Apple использует сжатие LZFSE для IPA пакетов (алгоритм сжатия данных
без потерь с открытым исходным кодом, созданный Apple Inc).
Соответственно нужен подходящий инструмент для распаковки (например,
https://github.com/sskaje/unzip-lzfse).
12
IPA файл: что внутри
●
●
●
●
●
/Payload/ - все что относится непосредственно к приложению
/Payload/Application.app - скомпилированный код и статические
ресурсы
○ Info.plist - описывает приложение для операционной системы iOS,
используя список свойств
○ Основной исполняемый файл, двоичный файл скомпилирован под
ARM и использует формат файла Mach-O (либо fat binary)
○ Внешние библиотеки, фреймворки, плагины, ресурсы
○ Информация о сборке для Apple (например,
embedded.mobileprovision с информацией о разработчике и
приложении)
/iTunesArtwork - иконка приложения для AppStore
/iTunesMetadata.plist - информация о приложении (то, что видно в App
Store)
/WatchKitSupport/WK - поддержка Apple Watch
13
Property list (plist)
*.plist это файлы, в которых
хранятся сериализованные
объекты.
Открыть можно в:
●
●
XCode
hex редактор (010 Editor
with plugin, xxd, и т.д.)
14
iTunesMetadata.plist
Когда приложение публикуется,
разработчик может указать такую
информацию, как жанр приложения,
поджанр, уведомление об авторских
правах, поддерживаемые устройства iOS
и необходимые возможности устройства.
Файл iTunesMetadata.plist
UIRequiredDeviceCapabilities
15
Info.plist
Является основным источником
информации для приложения iOS.
Фактически, все связанные
исполняемые файлы (расширения
приложений, фреймворки и
приложения) должны иметь файл
Info.plist.
●
●
●
●
Разрешения приложения
UsageDescription
Пользовательские схемы URL:
CFBundleURLTypes
Экспортируемые /
импортируемые
пользовательские типы
документов:
UTExportedTypeDeclarations /
UTImportedTypeDeclarations
Конфигурация безопасности
транспорта приложений (ATS):
NSAppTransportSecurity
16
Кастомные URL схемы
<a href="fb1040188382695742://fuzzing_here">
fb1040188382695742
</a>
Apple URL Schemes:
● tel:
● facetime: / facetime-audio:
● sms:
● mailto:
https://www.sans.org/blog/insecure-handling-ofurl-schemes-in-apples-ios/
17
embedded.mobileprovision
18
Исполняемый файл
Собрать информацию через:
●
●
strings
class-dump
19
Исполняемый файл
Реверсим:
●
●
IDA Pro (supports ARM, ARM64)
Ghidra
INTRODUCTION TO ARM
ASSEMBLY
20
Бинарный файл из AppStore
21
Runtime: ASLR / Stack Smashing / ARC
●
●
●
Рандомизация адресного пространства (ASLR) - флаг PIE
Защита от Stack Smashing - флаг –fstack-protector-all. Приложения,
которые используют канарейки, будут содержать _stack_chk_fail и
_stack_chk_guard в исполняемом файле
Автоматический подсчет ссылок (ARC) - _objc_release в исполняемом
файле.
22
Проверить флаги ASLR / Stack Smashing / ARC
Команда otool отображает
указанные части объектных
файлов или библиотек, понимает
как файлы Mach-O (объектные
файлы Mach), так и форматы
файлов fat.
otool -Vh app_binary
otool -Iv app_binary | grep stack
otool -Iv app_binary | grep
_objc_release
otool -lv app_binary | grep crypt
23
Защита бинарного файла: шифрование
Флаг “сryptid” со значением 1 указывает, что приложение зашифровано. Для
незашифрованных приложений значение cryptid равно 0. Когда приложение
iOS запускается, загрузчик расшифровывает его и загружает в память.
Существует установленный процесс, позволяющий воспользоваться этим
процессом и снять защиту приложения iOS. Наприме, используя
https://github.com/AloneMonkey/frida-ios-dump сдампить запущенное
приложение.
24
Сдампленный бинарный файл
25
26
MobSF
Mobile Security Framework (MobSF) - инструмент для
тестирования на проникновение, анализа
вредоносных программ и оценки безопасности
мобильных приложений. Может выполнять
статический и динамический анализ (под iOS есть
только статический анализ). Удобно отображает
дополнительную информацию о приложении.
https://github.com/MobSF/Mobile-Security-Framework-M
obSF
27
MobSF
28
29
Установить и запустить
30
Установка приложения
●
●
●
●
Установить приложение для
установки неподписанных IPA
файлов (либо переподписывать
их, создав себе акк и сертификат
на https://developer.apple.com/)
Xcode (Devices and Simulators)
Cydia Impactor (если что-то не
работает:
https://cydiaimpactor.online/cydia-im
pactor-errors/)
Через приложение на девайсе,
например, через Filza: загрузить
IPA на девайс (например, через
SFTP), найти IPA файл и кликнуть
Install
31
Запуск приложения
●
●
●
При запуске приложения на
джейлброкнутом девайсе можно
столкнутся с тем, что разработчики
попытались заблокировать запуск,
реализовав детектирование джейлбрейка.
Один из простых способов обхода
использование специальных приложений.
Это срабатывает в случае простых
механизмов детекта.
Для более сложных способов см.
“инструменты динамической
интрументизации”.
32
33
34
Анализ трафика приложения
35
Анализ трафика приложения: HTTP и HTTPS
36
Анализ трафика приложения: SSL пиннинг
-
-
Заранее вычисляют т.н. пины: хэшсуммы от серверного сертификата
или же от отдельных его полей
(например, SubjectPublicKeyInfo)
Сохраняют данные пины в коде
приложения.
При обращениях к серверу
приложение снова вычисляет пины
сертификата и сравнивает со
списком доверенных. Таким
образом просто добавления
сертификата в доверенные на
девайсе не поможет.
37
Анализ трафика приложения: SSL пиннинг
Популярные варианты реализации:
-
TrustKit
Alamofire
NSURLSession
38
TrustKit
let googleCom: [String: Any] = [
kTSKReportUris:
["https://<host>/report"],
kTSKDisableDefaultReportUri: true,
kTSKEnforcePinning: true,
kTSKIncludeSubdomains: true,
kTSKPublicKeyHashes: [
"Z8geUnmtnmt4ehRyQAOJ4...",
“YZPgTZ+woNCCCIW3LH2..."
]
]
...
let trustKitConfig: [String: Any] = [
kTSKSwizzleNetworkDelegates: true,
kTSKPinnedDomains: [
"google.com": googleCom,
...
]
]
Параметры конфигурации передаются
initSharedInstanceWithConfiguration
при запуске приложения и
инициализируют SSL pinning. TrustKit
проверит, что хотя бы один из
указанных контактов находится в
цепочке проверенных сертификатов
сервера.
●
●
TrustKit: Code Injection on iOS 8 for
the Greater Good
Как посчитать хэши
39
TrustKit bypassing
Способы обойти:
-
-
Перехватить вызов
initSharedInstanceWithConfigura
tion и выставить
TKSEnforcePinning в 0.
Перехватить вызов
verifyPublicKeyPin и заменить
на функцию, которая всегда
возвращает 0
(=TSKTrustEvaluationSuccess).
TrustKit Bypass
40
Анализ трафика приложения: SSL пиннинг
ssl-kill-switch2
41
WebView
42
WebView
UIWebView (deprecated) и WKWebView предназначены для встраивания
содержимого веб-страниц прямо в приложение, поддерживая CSS и JS.
Также поддерживает базовую логику навигации в веб (переход
вперед/назад/гиперссылки и т.д.).
Начиная с iOS 8.0 и OS X 10.10, используйте WKWebView для добавления
веб-содержимого в ваше приложение и не используйте UIWebView.
●
●
●
●
●
javaScriptEnabled
javaScriptCanOpenWindowsAutomatically
allowUniversalAccessFromFileURLs
allowFileAccessFromFileURLs
isFraudulentWebsiteWarningEnabled
https://developer.apple.com/documentation/webkit/wkpreferences
43
Web Inspector (Safari)
44
Хранение данных на устройстве
45
NSUserDefaults
NSUserDefaults - интерфейс к хранилищу вида “ключ-значение”, позволяет
сохранять значения между запусками приложения на девайсе.
46
Keychain и шифрование
iOS Encryption Systems Deploying iOS Devices in Security-critical Environments, 2013
https://www.apple.com/ph/privacy/docs/iOS_Security_Guide.pdf
47
Параметры Keychain
Атрибуты доступности (accessible):
●
●
●
●
●
●
●
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
kSecAttrAccessibleWhenUnlockedThisDeviceOnly
kSecAttrAccessibleWhenUnlocked
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
kSecAttrAccessibleAfterFirstUnlock
kSecAttrAccessibleAlwaysThisDeviceOnly
kSecAttrAccessibleAlways
● ...AfterFirstUnlock - до следующего перезапуска устройства
● ...ThisDeviceOnly - элементы с этим атрибутом не переносятся на
новое устройство. Т.е. после восстановления из резервной копии на
другое устройства эти элементы не будут присутствовать
48
Параметры Keychain
Флаги контроля доступа (ACL - access control flags, поддерживают "and" and
"or"):
●
●
●
●
●
●
●
devicePasscode
biometryAny
biometryCurrentSet
userPresence: либо пасскод либо биометрия
watch
applicationPassword
privateKeyUsage
49
50
Локальная аутентификация
51
Локальная аутентификация
Варианты:
●
●
●
●
Никакой
Пасскод (4-6 цифр)
Пароль
Биометрия (Touch ID, Face ID)
●
●
Understanding-the-iOS-Biometrics-Bypass
https://github.com/sensepost/objection/issues/136
52
53
Динамическая инструментализация
54
Инструменты
●
●
●
Frida - набор динамических инструментов для разработчиков, реверсинженеров и исследователей безопасности.
Objection - это набор инструментов для мобильных исследований во
время выполнения на базе Frida, созданный для того, чтобы помочь
оценить уровень безопасности ваших мобильных приложений без
необходимости джейлбрейка.
Cycript - позволяет исследовать и изменять запущенные приложения на
iOS или OS X, используя гибрид синтаксиса Objective-C ++ и JavaScript,
через интерактивную консоль.
55
Frida: простой обход джейлбрейка
frida-ps -Uia
frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause
frida -U -f com.highaltitudehacks.DVIAswiftv2 -l jb_bypass.js --no-pause
56
https://stackoverflow.com/questions/49194968/detect-jailbroken-in-ios-11-or-later
57
58
59
Objection: обход Touch ID
60
Cycript: связать элементы UI c кодом
cy# var buttons = choose(UIButton)
cy# buttons[8].titleLabel.text
@"Jailbreak Test 1"
cy# buttons[8].allTargets
[NSSet setWithArray:@[#"<DVIA_v2.JailbreakDetectionViewController:
0x1058308f0>"]]]
cy# buttons[8].allControlEvents
64
cy# target=[buttons[8].allTargets anyObject]
#"<DVIA_v2.JailbreakDetectionViewController: 0x1058308f0>"
cy# [buttons[0] actionsForTarget:target
forControlEvent:UIControlEventTouchUpInside]
@["jailbreakTest1Tapped:"]
=> JailbreakDetectionViewController -> jailbreakTest1Tapped
61
Demo time
62
Полезные ссылки
OWASP Mobile Security Testing Guide
https://github.com/OWASP/owasp-mstg/
https://mobile-security.gitbook.io/mobile-security-testing-guide/
Damn Vulnerable iOS App (DVIA)
https://github.com/prateek147/DVIA-v2/
63
Спасибо за внимание
64
Download