На аудите мобильного банковского приложения стандартная команда
ios sslpinning disable через Objection вернула хуки на семь методов - а трафик в Burp Suite так и не появился. Разработчики зашили проверку сертификатов через нативную обёртку над BoringSSL, которую Objection не покрывает. Пришлось писать таргетированный Frida-скрипт с перехватом SecTrustEvaluateWithError на уровне Security.framework. После обхода пиннинга в первых же запросах вылезли refresh-токены с TTL 90 дней, передаваемые в теле POST без привязки к устройству. Три часа на обход - ноль детектов со стороны приложения. Типичный сценарий пентеста iOS приложений в 2026 году: стандартного инструментария уже не хватает, а реальные находки лежат за слоем SSL Pinning.Место iOS pentest в цепочке атаки
Перехват трафика мобильного приложения - не самоцель, а этап, без которого тестирование серверного API невозможно. В терминологии MITRE ATT&CK мобильный пентест затрагивает несколько тактик:| Этап | MITRE ATT&CK | Роль в пентесте |
|---|---|---|
| Jailbreak устройства | Exploitation for Privilege Escalation (T1068) | Получение root-доступа для инструментации |
| Установка CA-сертификата | Install Root Certificate (T1553.004, Defense Evasion) | Доверие прокси-сертификату Burp Suite |
| Перехват трафика | Adversary-in-the-Middle (T1557, Credential Access) | MITM через прокси после обхода pinning |
| Анализ сетевых запросов | Network Sniffing (T1040, Discovery) | Пассивный разбор API-вызовов |
| Дамп Keychain | Keychain (T1555.001, Credential Access) | Извлечение токенов и паролей |
| Чтение локальных данных | Data from Local System (T1005, Collection) | NSUserDefaults, plist, SQLite |
| Обзор файловой системы | File and Directory Discovery (T1083, Discovery) | Поиск конфигов, логов, кэша |
Последовательность: jailbreak (или пересборка IPA с Frida Gadget) -> установка инструментов -> установка CA-сертификата -> обход SSL Pinning -> перехват и анализ трафика -> исследование локального хранения. Всё до обхода pinning - подготовка. Всё после - собственно тестирование безопасности iOS.
Требования к окружению
Железо:- iPhone с чипом A9–A11 (iPhone 6s / 7 / 8 / SE 1-го поколения / X) - для jailbreak через checkm8
- Mac с macOS 12+ - для palera1n и подписи IPA
- Кабель USB-A - Lightning (Type-C кабели нестабильны при входе в DFU-режим; если порта USB-A нет - берите переходник)
- Python 3.x:
pip3 install frida-toolsиpip3 install objection - Node.js:
npm install -g applesign(для пересборки IPA без jailbreak) - Burp Suite Community или Professional
- Sileo (менеджер пакетов, ставится через palera1n)
- frida-server из репозитория
https://build.frida.re
Совместимость по iOS и чипсетам (palera1n + checkm8):
| Чипсет | Устройства | Макс. iOS | Поддержка palera1n |
|---|---|---|---|
| A9 | iPhone 6s, SE 1st gen | iOS 15.8.x | iOS 15.0–15.8.x |
| A10 | iPhone 7, 7 Plus | iOS 15.8.x | iOS 15.0–15.8.x |
| A11 | iPhone 8, 8 Plus, X | iOS 16.7.x | iOS 15.0–16.7.x |
| A12+ | iPhone XS и новее | iOS 17–18 | Не поддерживается |
checkm8 - аппаратная уязвимость bootrom, исправленная начиная с A12. Устройства на A12+ в 2026 году не имеют стабильного публичного jailbreak. Для них - пересборка IPA с Frida Gadget (об этом ниже).
Jailbreak 2026: checkm8 и palera1n на A9–A11
checkm8 - эксплойт bootrom, опубликованный axi0mX в 2019 году. Уязвимость сидит в аппаратном коде, который Apple не может обновить через OTA - поэтому эксплойт работает для всех устройств на чипах A5–A11 при любой версии iOS. Шесть лет прошло, а он всё так же актуален.
palera1n использует checkm8 для установки jailbreak на iOS 15.0–16.7.x. Установка на Mac - одна команда:
sudo /bin/sh -c "$(curl -fsSL https://static.palera.in/scripts/install.sh)"Подключаем iPhone по USB-A (DFU через Type-C нестабилен - проверено на собственных нервах), запускаем
palera1n, следуем инструкциям для входа в DFU-режим. После загрузки на устройстве появится приложение palera1n, через которое ставится Sileo.Jailbreak через palera1n - полупривязанный (semi-tethered): после перезагрузки устройства jailbreak слетает, нужно повторно запустить palera1n с Mac. Это некритично - устройство редко перезагружается в процессе тестирования.
iOS 17+ и ограничения A12+
iOS 17 недоступна на устройствах с чипами A10 и A11 - Apple прекратила их поддержку. Устройства на A12+ (iPhone XS/XR и новее) получают iOS 17–18, но checkm8 на них не работает: bootrom исправлен аппаратно. Альтернативные jailbreak для A12+ (Dopamine и аналоги) поддерживают ограниченный набор билдов iOS 16.x и требуют конкретных версий ядра.Что это значит на практике: полноценный iOS pentest с jailbreak-устройством возможен на iPhone моделей 2015–2018 годов (A9–A11). Для тестирования приложений на современных устройствах - Frida Gadget без jailbreak.
Установка Frida iOS и настройка прокси
На jailbreak-устройстве добавляем APT-репозиторий Frida в Sileo:https://build.frida.re. Ставим пакет frida-server (выбирая версию, совпадающую с хостовой). Важный нюанс: palera1n по умолчанию использует rootless-режим на iOS 16+, для которого нужен rootless-вариант frida-server (с префиксом /var/jb/); для rootful-режима подойдёт стандартный пакет. Проверяем связь: frida-ps -Uia на хосте - должен вернуть список процессов с bundle ID всех установленных приложений.Для перехвата HTTPS-трафика нужен CA-сертификат Burp Suite. В терминах MITRE ATT&CK это Install Root Certificate (T1553.004, Defense Evasion) - установка доверенного корневого сертификата для перехвата зашифрованного трафика:
- В Burp Suite: Proxy -> Options -> Add listener на
0.0.0.0:8080 - На устройстве: Настройки -> Wi-Fi -> текущая сеть -> Настройка прокси -> Вручную -> IP хоста и порт 8080
- В Safari:
http://burpsuite-> скачать CA Certificate - Установить профиль: Настройки -> Основные -> VPN и управление устройством
- Активировать доверие: Настройки -> Основные -> Об этом устройстве -> Доверие сертификатам -> включить для PortSwigger CA.
Обход SSL Pinning iOS: от Objection до кастомных скриптов
Согласно OWASP MASTG (MASTG-TECH-0064), для большинства приложений обход certificate pinning занимает секунды - при условии, что приложение использует стандартные API. Если реализация кастомная, придётся патчить руками. Ниже - методы от простого к сложному с указанием границ применимости.Objection: быстрый обход SSL Pinning
Находим bundle ID:frida-ps -Uia | grep -i "appname". Запускаем Objection в контексте приложения:
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Работает: любые приложения, использующие Security.framework для валидации - включая кастомные обёртки, которые внутри вызывают
SecTrustEvaluate.Не работает: приложения с собственной TLS-библиотекой (BoringSSL, OpenSSL), скомпилированной непосредственно в бинарник.
SSL Kill Switch 2: системный обход
Твик для Cydia/Sileo, который патчит SecureTransport и NSURLSession глобально. Установка: добавить репозиторийhttps://julioverne.github.io в Sileo, найти SSL Kill Switch 2, установить. Активация: Настройки -> SSL Kill Switch 2 -> Disable Certificate Validation. Respring: killall -9 SpringBoard.Плюс: bypass работает для всех приложений без запуска Frida.
Минусы: не затрагивает приложения с кастомными TLS-стеками; проект давно не обновлялся (последний коммит - 2019 год) - на свежих билдах iOS 16.x возможны проблемы совместимости. Для систематического тестирования безопасности iOS я предпочитаю Frida-подход - он даёт контроль над конкретным приложением.
Обход кастомных TLS-стеков: BoringSSL и OpenSSL
Если ни Objection, ни SecTrust-скрипт не дали результата - приложение, скорее всего, тащит с собой собственную TLS-библиотеку. Подход к мобильному пентесту в этом случае меняется.Определяем загруженные модули:
frida -U -n AppName -e 'Process.enumerateModules().forEach(function(m){ console.log(m.name); })' (имя процесса в -n должно точно совпадать с выводом frida-ps -Uai - это display name, не bundle ID; регистр важен). Ищем в выводе libboringssl.dylib, libssl.dylib или нестандартные .dylib с TLS-функциями.Трассируем вызовы валидации:
frida-trace -U -i "[I]SSL[/I]verify*" com.example.app. Вывод покажет, какие функции отвечают за проверку сертификата и в каком модуле они живут.Дальше - статический анализ бинарника в Ghidra или Hopper для определения смещения целевой функции и написание точечного хука:
JavaScript:
var base = Module.findBaseAddress("libboringssl.dylib");
var offset = 0x12345; // смещение из статического анализа
Interceptor.attach(base.add(offset), {
onLeave: function(retval) {
retval.replace(0); // force success
}
});
0x12345 - пример; реальное смещение определяется через дизассемблирование конкретной сборки приложения. Этот метод - единственный рабочий против кастомных TLS-стеков. Как справедливо замечают в OWASP MASTG: «it's part of the tester's work to conduct research, since not every tool can keep up with OS versions quickly enough»«Проведение исследований — часть работы тестировщика, поскольку не каждый инструмент способен достаточно быстро адаптироваться к новым версиям операционных систем». Тут не поспоришь.Flutter и Xamarin: анализ трафика iOS через hotspot
Flutter и Xamarin-приложения игнорируют системные настройки прокси iOS. Настройка прокси в параметрах Wi-Fi не даст результата - трафик пойдёт мимо Burp Suite. Рабочий метод, описанный в методике Appknox - hotspot с перенаправлением через пакетный фильтр macOS.
Схема: второе устройство раздаёт интернет по Bluetooth на Mac. Mac расшаривает соединение по Wi-Fi (System Preferences -> Sharing -> Internet Sharing -> Bluetooth PAN -> Wi-Fi). iPhone подключается к Wi-Fi Mac. На Mac создаём файл
pf.rules с правилом rdr pass on bridge100 inet proto tcp from any to any port {80, 443} -> 127.0.0.1 port 8080, применяем через sudo pfctl -f pf.rules && sudo sysctl -w net.inet.ip.forwarding=1. В Burp Suite включаем Support invisible proxying (Proxy -> Options -> Edit -> Request Handling).Весь TCP-трафик iPhone теперь проходит через Burp. Даже dart:io-клиент Flutter, который понятия не имеет о системном прокси, попадает в перехват.
Минус: метод требует второе устройство для Bluetooth-тетеринга и Mac с Wi-Fi sharing. В полевых условиях пентеста - не всегда доступно. Для Flutter-приложений с SSL Pinning потребуется комбинация: hotspot + Frida-скрипт.
Пентест iOS без jailbreak: Frida Gadget и пересборка IPA
Для устройств на A12+ без jailbreak: встраиваем Frida Gadget в IPA-файл приложения.
Что нужно:
- Apple Developer аккаунт (бесплатный - подпись на 7 дней)
- Сертификат подписи:
security find-identity -v -p codesigning - Установленный applesign:
npm install -g applesign
objection patchipa --source app.ipa --codesign-signature <HEX_ID>Objection скачает актуальную версию Frida Gadget, внедрит FridaGadget.dylib в бинарник, переподпишет все компоненты. На выходе - новый IPA-файл с именем
*-frida-codesigned.ipa. Установка на устройство через ios-deploy -W -b ./Payload/App.app.После запуска приложение загрузит Gadget, и с хоста можно подключиться для инъекции любых скриптов, включая обход SSL Pinning.
Чем придётся платить:
- Бесплатный аккаунт: переустановка каждые 7 дней
- Приложения с проверкой целостности (OWASP MASVS-RESILIENCE) могут детектировать модификацию бинарника
- Доступ к Keychain ограничен sandbox приложения (в отличие от jailbreak, где доступны записи всех приложений)
Динамический анализ iOS: Keychain и локальное хранение
После обхода SSL Pinning и перехвата трафика - копаем данные на устройстве. В контексте MITRE ATT&CK: Keychain (T1555.001, Credential Access) и Data from Local System (T1005, Collection).Дамп Keychain через Objection:
ios keychain dump. На jailbreak-устройстве возвращает записи всех приложений. На что смотреть:- Записи с
kSecAttrAccessible=kSecAttrAccessibleAlwaysилиkSecAttrAccessibleAfterFirstUnlock- доступны без разблокировки устройства. По OWASP MASVS-STORAGE приложение обязано использоватьkSecAttrAccessibleWhenUnlockedThisDeviceOnly. На практике половина приложений этим пренебрегает - Токены авторизации и API-ключи в открытом виде
- Клиентские сертификаты для mTLS
ios plist cat Library/Preferences/<bundle_id>.plist через Objection. Типичные находки - debug-флаги (is_debug: true), URL staging-серверов, feature toggles, хеши пользовательских данных. Однажды нашёл в NSUserDefaults полный URL staging-среды с Basic Auth кредами в строке - разработчики забыли убрать после тестирования.Для обзора файловой системы (T1083): команда
env в Objection выводит пути sandbox-директорий; ios hooking list classes - загруженные классы приложения. Просмотр директорий часто выявляет SQLite-базы с незашифрованными данными, логи с токенами и кэш API-ответов.Выбор метода обхода SSL Pinning: таблица решений
| Метод | Jailbreak | Эффективен против | Не работает | Сложность |
|---|---|---|---|---|
Objection ios sslpinning disable | Да / Gadget | TrustKit, AFNetworking, Alamofire | Кастомный pinning, BoringSSL, Flutter | Низкая |
| Frida-скрипт SecTrust | Да / Gadget | Security.framework (SecTrustEvaluate/WithError) | Собственные TLS-библиотеки | Средняя |
| SSL Kill Switch 2 | Да | SecureTransport, NSURLSession (глобально) | Кастомные TLS, BoringSSL | Низкая |
| Замена сертификата в IPA | Нет | Hardcoded сертификат в bundle | Hash-pinning, runtime-проверки | Средняя |
| Hotspot + pf.rules | Нет | Flutter, Xamarin (игнорируют прокси) | Кастомные TLS-проверки | Высокая |
| Frida + Ghidra (реверс) | Да / Gadget | Любая реализация | Нет при корректном анализе | Высокая |
Логика выбора: начинаем с Objection. Не сработало - SecTrust-скрипт через Frida. Если и он бессилен -
enumerateModules() для определения TLS-библиотеки, затем frida-trace и реверс в Ghidra. Flutter/Xamarin - сразу hotspot. На устройствах без jailbreak - Frida Gadget через пересборку IPA, затем те же скрипты.Три года назад обход SSL Pinning на iOS сводился к
ios sslpinning disable, и этого хватало для большинства приложений со стандартными сетевыми библиотеками. Сейчас BoringSSL, certificate transparency, кастомные TLS-обёртки делают стандартные инструменты недостаточными для серьёзного тестирования безопасности iOS.Парадокс в другом: компании вкладываются в многослойный pinning, но оставляют Keychain-записи с флагом
kSecAttrAccessibleAlways и refresh-токены без привязки к устройству. Pinning усложняет работу пентестеру на пару часов, а реальный ущерб приносят данные, которые валяются открытым текстом после обхода.По моему опыту, наиболее продуктивная связка в 2026 году - Objection + кастомный Frida-скрипт для большинства приложений и Ghidra для случаев с кастомным TLS. Отдельная нерешённая проблема - отсутствие публичного jailbreak для A12+. Frida Gadget через пересборку IPA не даёт полного доступа к Keychain и файловой системе за пределами sandbox, так что полноценный мобильный пентест iOS возможен только на устройствах 2015–2018 года выпуска. Реальная поверхность атаки на современных iPhone остаётся менее исследованной, чем принято считать - и именно здесь сосредоточен потенциал для нетривиальных находок.
Последнее редактирование модератором: