Основы безопасности 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