Руководство

Что по-прежнему блокирует certificate pinning

Приложение, закрепляющее свой сертификат, не расшифруется через Busymate DevTools — ни на iOS, ни на Android, ни через прокси. Здесь точно описано, что каждый путь перехвата может и не может увидеть, как распознать хост с pinning и что при этом остаётся полезным.

Любой инструмент перехвата, расшифровывающий HTTPS, работает одинаково: он предъявляет клиенту сертификат, подписанный им самим, а клиент принимает его, потому что доверяет подписавшему центру. Certificate pinning — это когда приложение заявляет, что будет доверять только одному конкретному сертификату или ключу и ничему другому. Встретив подменный сертификат, закреплённое приложение просто отказывается от соединения. Это свойство приложения, а не переключатель в инструменте, и ни один путь перехвата в Busymate его не обходит.

Инструмент, который об этом умалчивает, отнимает у вас сессию исследования на цели, которую никогда не удалось бы расшифровать. Поэтому это руководство — карта, а не обходной путь: что перехват на iPhone, приложение для Android, настольный прокси, рутованный телефон фермы и Chrome-коннектор дают против хоста с pinning, как лента его помечает и какие части работы всё равно выполняются.

Перед началом

Что вам понадобится

Это руководство предполагает, что трафик уже поступает в ваш дашборд хотя бы по одному пути перехвата.

  • Уже спаренный и перехватывающий телефон или клиент — руководство для iPhone или Android доведёт вас до этого.

  • Имена хостов исследуемого приложения, добавленные в список SSL proxy, чтобы расшифровка хотя бы была предпринята.

  • Открытая лента дашборда с фильтром инспекции под рукой.

  • Разрешение исследовать приложение: эти приёмы предназначены для трафика приложений и сайтов, которыми вы владеете или которые вам разрешено отлаживать.

Шаг за шагом

Делайте по порядку

Пройдите пути по порядку — каждый сужает то, что хост с pinning всё ещё может вам рассказать.

  1. 01

    Знайте, на какое хранилище доверия опирается ваш путь перехвата

    На iOS расшифровка зависит от того, установлен ли профиль Busymate и включено ли для него полное доверие в настройках — после этого каждое приложение на телефоне доверяет сертификату, который предъявляет приложение, кроме тех, что используют pinning. На Android два хранилища: пользовательское, которое с Android 7.0 учитывают только явно разрешившие его приложения, и системное, которое учитывают все приложения, но записать в него может только рутованное устройство. Настольный прокси использует то доверие, которое клиентская машина или браузер оказывают его сгенерированному центру.

    Pinning стоит над всеми тремя. Приложение с pinning отвергает подменный сертификат, из какого бы хранилища он ни пришёл, поэтому перенос сертификата в более сильное хранилище никогда не помогает против хоста с pinning. Он помогает только против приложений, отказывавшихся от пользовательского хранилища.

  2. 02

    Распознайте хост с pinning в ленте

    Хост, который вы не внесли в список расшифровки, показывает закрытый замок с одним лишь именем и счётчиком запросов — так задумано, это не pinning. Хост с pinning выглядит иначе: он в вашем списке, расшифровка была предпринята, и соединение оборвалось или приложение попробовало ещё раз и сдалось. У фильтра инспекции в ленте дашборда три положения — только расшифрованные, только зашифрованные и только с SSL pinning — и последнее выделяет именно эти строки.

    Второй признак — поведение: приложение перестаёт работать для этого хоста, как только он расшифровывается, и снова работает, как только вы убираете хост из списка. Если верно и то и другое, вы нашли соединение с pinning.

  3. 03

    Перехват на iPhone: метаданные, но никогда тело

    Приложение для iOS перехватывает трафик всей системы по Wi-Fi и сотовой сети и расшифровывает хосты из вашего списка. Против приложения с pinning оно по-прежнему записывает каждое соединение — хост, тайминги, число и размер запросов, активный режим подключения, — но не может выдать ни заголовки, ни тело, и никакой переключатель этого не изменит. Включение MITM All Hosts расшифровывает все хосты без pinning; для хоста с pinning оно лишь ломает его.

    Практичный ход — убрать хост с pinning из списка, чтобы приложение продолжало работать, оставить остальные его хосты в списке и читать то, что раскрывают незакреплённые эндпоинты. Многие приложения закрепляют только хост аутентификации или платежей, а остальное оставляют открытым.

  4. 04

    Android: без root, с root и где здесь pinning

    На Android без root сертификат, сгенерированный приложением, живёт в пользовательском хранилище, поэтому расшифровываются только ваши отладочные сборки и другие разрешившие его клиенты; все прочие приложения записываются как метаданные. На рутованном устройстве сертификат можно установить в системное хранилище, и HTTPS становится расшифровываемым во всей системе — за исключением pinning отдельных приложений. Именно поэтому ферма телефонов держит свои Android-устройства на этом рутованном уровне.

    Итак, root превращает один класс непрозрачных приложений в читаемые — те, что просто игнорировали пользовательское хранилище, — и не трогает класс с pinning. Busymate никогда не заявляет о расшифровке всей системы на устройстве без root и никогда не заявляет, что pinning побеждён на рутованном.

  5. 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
  6. 06

    Chrome-коннектор: pinning неприменим

    Есть один путь перехвата, для которого pinning не имеет значения. Коннектор командной строки запускает экземпляр Chrome и читает его трафик через DevTools Protocol, на браузерной стороне TLS. Зашифрованное соединение между Chrome и сервером не затрагивается — нет подменного сертификата, который можно отвергнуть, нечего устанавливать, и pinning нечего обнаруживать. Потоки входа у провайдеров, чьи закреплённые сертификаты прокси не может открыть, записываются от начала до конца, включая редиректы и токены.

    Цена — охват: он покрывает то, что работает внутри этого Chrome, а не нативное приложение. Если у нужного вам потока есть веб-версия, именно этот путь увидит её полностью.

  7. 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, и потратьте сессию на то, что действительно можно прочитать.

Ask your mate