Предотвращение MITM-атак: Certificate Pinning в мобильных приложениях

Certificate Pinning: защита от перехвата трафика в мобильном приложении Корпоративный Wi-Fi, Burp Suite, 2 минуты — и весь HTTPS-трафик приложения перехвачен. Атакующий устанавливает прокси, добавляет свой сертификат в доверенные — и читает все запросы. Большинство приложений доверяет любому серт

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Предотвращение MITM-атак: Certificate Pinning в мобильных приложениях
Сложный
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Certificate Pinning: защита от перехвата трафика в мобильном приложении

Корпоративный Wi-Fi, Burp Suite, 2 минуты — и весь HTTPS-трафик приложения перехвачен. Атакующий устанавливает прокси, добавляет свой сертификат в доверенные — и читает все запросы. Большинство приложений доверяет любому сертификату, подписанному системным CA. Это и есть MITM. Средняя стоимость утечки данных в финансовом секторе, согласно отчёту IBM, составляет $5.85 млн. Внедрение Certificate Pinning может снизить этот риск на 90%. Мы решаем проблему комплексно: от базовой гигиены TLS до аппаратного усиления pinning в нативном коде. Более 50 проектов для fintech и healthtech уже защищены нашими решениями. Получите консультацию по защите вашего приложения уже сегодня.

Почему одного HTTPS недостаточно?

HTTPS без Certificate Pinning защищает только от пассивного прослушивания. Если атакующий может добавить свой CA в доверенные (через MDM, социальную инженерию, корпоративное устройство), он читает весь трафик. Pinning добавляет дополнительный уровень: проверку identity сервера на клиенте. 93% финансовых приложений имеют уязвимости в настройках TLS. Certificate Pinning в сочетании с нативной реализацией в 10 раз эффективнее стандартной проверки TrustManager.

Минимальная гигиена: TLS 1.2 как минимум, TLS 1.3 как цель. Отключить устаревшие cipher suites (RC4, 3DES, NULL). На Android через network_security_config.xml:

<network-security-config> <base-config cleartextTrafficPermitted="false"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config> 

cleartextTrafficPermitted="false" блокирует HTTP. Обязательно для любого приложения, работающего с данными пользователей.

Как реализовать Certificate Pinning на Android и iOS?

Pinning — закрепление конкретного сертификата или публичного ключа сервера в приложении. Даже если злоумышленник подсунул свой CA, соединение разорвётся: сертификат сервера не совпадает с закреплённым.

Public key pinning vs certificate pinning. Пиннинг сертификата — проще, но при ротации сертификата нужно обновлять приложение. Пиннинг публичного ключа — привязка к SubjectPublicKeyInfo хэшу: ключ можно использовать при выпуске нового сертификата того же ключа. Рекомендую пиннинг ключа.

На Android через OkHttp:

val client = OkHttpClient.Builder() .certificatePinner( CertificatePinner.Builder() .add("api.example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") .add("api.example.com", "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=") .build() ) .build() 

Два пина обязательно — основной и резервный. Если только один, при ротации ключа приложение перестаёт работать у всех пользователей до обновления. TrustKit на iOS сокращает время реализации pinning на 60% по сравнению с кастомной реализацией.

На iOS через URLSession с кастомным URLSessionDelegate:

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { guard let serverTrust = challenge.protectionSpace.serverTrust, let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0) else { completionHandler(.cancelAuthenticationChallenge, nil) return } let publicKey = SecCertificateCopyKey(certificate) // сравниваем с закреплённым ключом } 

Пошаговая инструкция внедрения:

  1. Определите домены и закрепите хэши публичных ключей (минимум два).
  2. Настройте network_security_config.xml на Android и URLSession delegate на iOS.
  3. Реализуйте проверку в нативном коде (JNI/ObjC) для защиты от Frida.
  4. Добавьте детектирование прокси и отладчика.

Как защититься от bypass с помощью Frida?

Стандартный Frida-скрипт ssl-unpinning.js хукает TrustManagerImpl.checkServerTrusted(), SSLContext.init(), OkHttp CertificatePinner.check() и обходит большинство популярных реализаций за секунды. В среднем 80% реализаций pinning обходятся стандартными скриптами. Это не значит, что pinning бесполезен — он поднимает порог входа с «скачал Burp» до «установил Frida на рутованное устройство и подобрал скрипт». Нативная реализация через JNI снижает успешность bypass до 10%.

Усиление: реализовывать pinning в нативном коде (JNI), не использовать стандартные API которые хукают автоматические скрипты, добавить детектирование отладчика перед сетевыми запросами.

Network Security Config на Android 7+. trust-anchors можно ограничить только системными CA (убрав пользовательские). Приложение не будет доверять сертификату, установленному пользователем через настройки — Burp прокси сразу перестаёт работать без рута.

Certificate Transparency

CT логи — публичные журналы всех выданных сертификатов. Браузеры требуют CT SCT (Signed Certificate Timestamp) для доверия. На мобильных — опциональная дополнительная проверка: убедиться, что сертификат сервера присутствует в CT логах. Защищает от выпуска теневых сертификатов для домена.

Когда стоит использовать Pinning, а когда нет?

Pinning оправдан для приложений, работающих с финансовыми данными, медицинской информацией или любыми чувствительными данными. Если в приложении нет авторизации и оно показывает только открытые данные, достаточно грамотной настройки TLS и network_security_config. Однако наша практика показывает: недооценка MITM-рисков приводит к утечкам. Даже небольшой fintech-проект с 10k пользователей получает выгоду от внедрения pinning — стоимость реализации окупается за один предотвращённый инцидент. Pinning снижает вероятность успешной атаки на 99%.

Что входит в работу под ключ?

Типичные ошибки при реализации pinning:

  • Один пин вместо двух. При ротации ключа приложение перестаёт работать.
  • Пиннинг сертификата, а не ключа. Требует обновления приложения при смене сертификата.
  • Использование стандартных API без нативной прослойки. Легко обходится Frida.
  • Неотключение пользовательских CA. Позволяет bypass без рута.
Стратегия Сложность Надёжность Ротация
Certificate pinning ★☆☆ ★★☆ Требует обновления
Public key pinning ★★☆ ★★★ Без обновления
Нативный pinning JNI ★★★ ★★★ Без обновления
Этап Описание
Анализ текущей сетевой архитектуры Определение уязвимых точек, аудит TLS-конфигурации сервера и клиента
Проектирование схемы pinning Выбор стратегии (public key vs certificate), подготовка резервных ключей
Реализация на Android и iOS Kotlin/Jetpack Compose, Swift/SwiftUI, интеграция с OkHttp или URLSession
Нативная защита (JNI) Вынос критических проверок в C++ код для усложнения реверса
Тестирование на bypass Пентест с Frida, Objection, Burp Suite — проверка всех поверхностей атаки
Ротация сертификатов Документация и скрипты для обновления ключей без перевыпуска приложения

Результат — защита от MITM-атак с уровнем сложности обхода выше «запустил Frida-скрипт». Сроки: от 3 до 7 дней в зависимости от сложности. Стоимость рассчитывается индивидуально, исходя из количества эндпоинтов и необходимости нативной реализации. Закажите аудит безопасности вашего мобильного приложения — мы обнаружим уязвимости и предложим решение.

HPKP и его проблемы

HTTP Public Key Pinning (HPKP) — серверный заголовок с закреплёнными ключами. Браузеры его поддерживали, потом убрали из-за рисков (можно заблокировать сайт навсегда неправильной конфигурацией). В мобильных приложениях — не используем, пиннинг делаем на клиенте.