Что по-прежнему блокирует
Приложение, закрепляющее свой сертификат, не расшифруется через Busymate DevTools — ни на iOS, ни на Android, ни через прокси. Здесь точно описано, что каждый путь перехвата может и не может увидеть, как распознать хост с pinning и что при этом остаётся полезным.
Любой инструмент перехвата, расшифровывающий HTTPS, работает одинаково: он предъявляет клиенту сертификат, подписанный им самим, а клиент принимает его, потому что доверяет подписавшему центру. Certificate pinning — это когда приложение заявляет, что будет доверять только одному конкретному сертификату или ключу и ничему другому. Встретив подменный сертификат, закреплённое приложение просто отказывается от соединения. Это свойство приложения, а не переключатель в инструменте, и ни один путь перехвата в Busymate его не обходит.
Инструмент, который об этом умалчивает, отнимает у вас сессию исследования на цели, которую никогда не удалось бы расшифровать. Поэтому это руководство — карта, а не обходной путь: что перехват на iPhone, приложение для Android, настольный прокси, рутованный телефон фермы и Chrome-коннектор дают против хоста с pinning, как лента его помечает и какие части работы всё равно выполняются.
Что вам
Это руководство предполагает, что трафик уже поступает в ваш дашборд хотя бы по одному пути перехвата.
Уже спаренный и перехватывающий телефон или клиент — руководство для iPhone или Android доведёт вас до этого.
Имена хостов исследуемого приложения, добавленные в список SSL proxy, чтобы расшифровка хотя бы была предпринята.
Открытая лента дашборда с фильтром инспекции под рукой.
Разрешение исследовать приложение: эти приёмы предназначены для трафика приложений и сайтов, которыми вы владеете или которые вам разрешено отлаживать.
Делайте
Пройдите пути по порядку — каждый сужает то, что хост с pinning всё ещё может вам рассказать.
- 01
Знайте, на какое хранилище доверия опирается ваш путь перехвата
На iOS расшифровка зависит от того, установлен ли профиль Busymate и включено ли для него полное доверие в настройках — после этого каждое приложение на телефоне доверяет сертификату, который предъявляет приложение, кроме тех, что используют pinning. На Android два хранилища: пользовательское, которое с Android 7.0 учитывают только явно разрешившие его приложения, и системное, которое учитывают все приложения, но записать в него может только рутованное устройство. Настольный прокси использует то доверие, которое клиентская машина или браузер оказывают его сгенерированному центру.
Pinning стоит над всеми тремя. Приложение с pinning отвергает подменный сертификат, из какого бы хранилища он ни пришёл, поэтому перенос сертификата в более сильное хранилище никогда не помогает против хоста с pinning. Он помогает только против приложений, отказывавшихся от пользовательского хранилища.
- 02
Распознайте хост с pinning в ленте
Хост, который вы не внесли в список расшифровки, показывает закрытый замок с одним лишь именем и счётчиком запросов — так задумано, это не pinning. Хост с pinning выглядит иначе: он в вашем списке, расшифровка была предпринята, и соединение оборвалось или приложение попробовало ещё раз и сдалось. У фильтра инспекции в ленте дашборда три положения — только расшифрованные, только зашифрованные и только с SSL pinning — и последнее выделяет именно эти строки.
Второй признак — поведение: приложение перестаёт работать для этого хоста, как только он расшифровывается, и снова работает, как только вы убираете хост из списка. Если верно и то и другое, вы нашли соединение с pinning.
- 03
Перехват на iPhone: метаданные, но никогда тело
Приложение для iOS перехватывает трафик всей системы по Wi-Fi и сотовой сети и расшифровывает хосты из вашего списка. Против приложения с pinning оно по-прежнему записывает каждое соединение — хост, тайминги, число и размер запросов, активный режим подключения, — но не может выдать ни заголовки, ни тело, и никакой переключатель этого не изменит. Включение MITM All Hosts расшифровывает все хосты без pinning; для хоста с pinning оно лишь ломает его.
Практичный ход — убрать хост с pinning из списка, чтобы приложение продолжало работать, оставить остальные его хосты в списке и читать то, что раскрывают незакреплённые эндпоинты. Многие приложения закрепляют только хост аутентификации или платежей, а остальное оставляют открытым.
- 04
Android: без root, с root и где здесь pinning
На Android без root сертификат, сгенерированный приложением, живёт в пользовательском хранилище, поэтому расшифровываются только ваши отладочные сборки и другие разрешившие его клиенты; все прочие приложения записываются как метаданные. На рутованном устройстве сертификат можно установить в системное хранилище, и HTTPS становится расшифровываемым во всей системе — за исключением pinning отдельных приложений. Именно поэтому ферма телефонов держит свои Android-устройства на этом рутованном уровне.
Итак, root превращает один класс непрозрачных приложений в читаемые — те, что просто игнорировали пользовательское хранилище, — и не трогает класс с pinning. Busymate никогда не заявляет о расшифровке всей системы на устройстве без root и никогда не заявляет, что pinning побеждён на рутованном.
- 05
Прокси: тот же предел плюс хосты, которые он намеренно не трогает
У настольного прокси те же отношения с pinning, что и у мобильных приложений: закреплённый клиент отвергает его сгенерированный сертификат, и соединение обрывается. Кроме того, у прокси есть короткий список хостов, которые он никогда не перехватывает, что бы ни говорили ваши настройки SSL proxy — собственная PKI и эндпоинты отзыва Apple, респондеры статуса сертификатов из цепочки Apple и бэкенд самого Busymate, — потому что их перехват сломал бы устройство или живое соединение дашборда. Они проходят как сырые туннели, и это намеренно, а не ошибка конфигурации.
Хосты, которые прокси намеренно пропускает нетронутыми text# Passed through as raw tunnels by the proxy, regardless of your SSL-proxy list: pkis.apple.com ocsp*.apple.com crl*.apple.com valid.apple.com ppq.apple.com # the DigiCert OCSP / CRL responders Apple's chain uses *.busymate.net # the dashboard's own backend + Realtime connection - 06
Chrome-коннектор: pinning неприменим
Есть один путь перехвата, для которого pinning не имеет значения. Коннектор командной строки запускает экземпляр Chrome и читает его трафик через DevTools Protocol, на браузерной стороне TLS. Зашифрованное соединение между Chrome и сервером не затрагивается — нет подменного сертификата, который можно отвергнуть, нечего устанавливать, и pinning нечего обнаруживать. Потоки входа у провайдеров, чьи закреплённые сертификаты прокси не может открыть, записываются от начала до конца, включая редиректы и токены.
Цена — охват: он покрывает то, что работает внутри этого Chrome, а не нативное приложение. Если у нужного вам потока есть веб-версия, именно этот путь увидит её полностью.
- 07
Используйте то, что хост с pinning всё же даёт
Метаданные — это не ничто. Вы по-прежнему видите, когда приложение обращается к закреплённому хосту, как часто, насколько велики обмены и сколько они длятся, и можете сопоставить это с расшифрованными вызовами вокруг. Правила блокировки всё так же срабатывают на уровне хоста для зашифрованного хоста — путь невидим, но можно заставить приложение вести себя так, будто этот эндпоинт недоступен, а это часто именно тот сценарий отказа, который вы хотели проверить. Паузы позволяют хосту полностью обходить прокси, чтобы приложение продолжало работать, пока вы изучаете всё остальное.
И каждое ваше действие попадает в журнал аудита, так что сессия исследования оставляет запись о том, что было расшифровано, что заблокировано и что оставлено в покое.
Что может
Больше всего времени отнимают ошибки, которые выглядят как баги инструмента, но ими не являются.
Приложение сломалось, как только я добавил его хост
Это pinning. Уберите хост из списка SSL proxy — на iOS затем перезапустите VPN, чтобы туннель подхватил изменение, — и приложение восстановится. Остальные его хосты оставьте в списке.
MITM All Hosts не разблокировал приложение
И не мог. Этот переключатель расширяет набор расшифровываемых хостов без pinning; на хост, закреплённый приложением, он не влияет, а все остальные закреплённые соединения на телефоне тоже начинают падать. Выключите его обратно.
Рутование Android-телефона тоже не помогло
Root переносит сертификат в системное хранилище, что убеждает приложения, игнорировавшие пользовательское. Он не затрагивает приложение, сверяющее сертификат с собственным пином.
Системный хост Apple никогда не расшифровывается на прокси
Он в списке хостов, которые прокси никогда не перехватывает, потому что его расшифровка сломала бы устройство. Чинить нечего; фильтр показывает его зашифрованным по замыслу.
Частые
Есть ли в Busymate обход pinning?
Нет. Ни один путь перехвата не модифицирует целевое приложение, не внедряет код и не патчит его логику доверия. Честный ответ для нативного приложения с pinning — метаданные плюс то, что раскрывают его незакреплённые хосты.
Как отличить pinning от хоста, который я просто забыл добавить в список?
Хост не из списка показывает закрытый замок, а приложение продолжает работать. Хост с pinning есть в списке, расшифровка была предпринята, фильтр SSL pinning в ленте его выделяет, а приложение падает, пока вы не уберёте хост из списка.
Какой путь выбрать для потока аутентификации у провайдера с pinning?
Если у провайдера есть веб-вход, проведите его через Chrome-коннектор — TLS завершается внутри браузера, и вся цепочка редиректов записывается. Для нативного приложения расшифрованного пути нет; собирайте метаданные и незакреплённые вызовы вокруг.
Знайте предел
Ограничьте расшифровку хостами, которые вы тестируете, пусть лента подскажет, какие из них используют pinning, и потратьте сессию на то, что действительно можно прочитать.