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

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

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

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

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

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

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

Этапы разработки

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

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    562

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) — серверный заголовок с закреплёнными ключами. Браузеры его поддерживали, потом убрали из-за рисков (можно заблокировать сайт навсегда неправильной конфигурацией). В мобильных приложениях — не используем, пиннинг делаем на клиенте.

Безопасность мобильных приложений: OWASP MASVS, pinning и защита от реверса

Мы провели аудит более 40 мобильных приложений — и на каждом втором находили токены в UserDefaults, отсутствие pinning и открытый для реверса код. OWASP Mobile Application Security Verification Standard (MASVS) — не академический документ. Это чек-лист пентестера. И то, что он находит, часто требует не patch, а переписывания целых модулей. Разберём три самые болезненные точки: certificate pinning, обфускация и хранение секретов. И покажем, как их закрыть без даунтаймов на продакшне.


Почему certificate pinning ломает продакшн?

Certificate Pinning — привязка приложения к конкретному TLS-сертификату или его публичному ключу. Без него трафик перехватывается через Charles или mitmproxy за пять минут — это OWASP MASVS-NETWORK-2. Но в продакшн pinning часто ломает: сертификат истёк, резервный пин не настроен — пользователи не могут войти. Крупное финансовое приложение в 2022 году ушло в даунтайм на 8 часов именно из-за этого.

На iOS реализуется через URLSessionDelegate.urlSession(_:didReceive:completionHandler:) с проверкой SecTrust. Или через TrustKit — библиотеку с декларативной конфигурацией через Info.plist. TrustKit также умеет отправлять отчёты о неудачных проверках на ваш сервер — полезно для мониторинга MITM-атак.

На Android — network_security_config.xml:

<network-security-config>
  <domain-config>
    <domain includeSubdomains="true">api.example.com</domain>
    <pin-set expiration="2026-01-01">
      <pin digest="SHA-256">base64_public_key_hash</pin>
      <pin digest="SHA-256">backup_key_hash</pin>
    </pin-set>
  </domain-config>
</network-security-config>

Критическое правило: всегда два пина — основной и резервный. Если сертификат истекает, а backup pin не настроен, все пользователи не смогут войти до следующего обновления. Именно так ломаются production-сборки.

Ещё одна точка отказа: CDN и third-party SDK. Если рекламный SDK или аналитика делают запросы к своим серверам, а в network_security_config настроен глобальный pinning — SDK сломается. Конфигурация должна быть поддоменно-специфичной.


Как защитить данные в Keychain и Keystore?

MASVS-STORAGE-1 и STORAGE-2 — самые часто нарушаемые требования. Частая ошибка на iOS: токены авторизации хранятся в UserDefaults. Данные оттуда бэкапятся в iCloud и доступны при восстановлении на другое устройство. Токен на новом iPhone — это чужая авторизованная сессия. Правильно: Keychain с kSecAttrAccessibleWhenUnlockedThisDeviceOnly и kSecAttrSynchronizable = false.

На Android аналогично: SharedPreferences хранится в открытом XML на устройствах без шифрования (/data/data/). Используйте EncryptedSharedPreferences из Jetpack Security или напрямую Android Keystore для ключевых данных.
Мы зашифровали токены в одном финтех-приложении — количество утёкших сессий сократилось на 90% за первый месяц.


Обфускация и защита кода

iOS: Swift-код компилируется в нативный бинарник, который не декомпилируется до читаемого Swift. Но Objective-C runtime и Mach-O metadata дают много информации через class-dump и nm. Имена классов, методов, строки в бинарнике — всё видно. Для критичных строк (ключи конфигурации — не API-ключи, их там быть не должно) используем обфускацию через SwiftShield.

Android: Java/Kotlin компилируется в DEX, который читается через jadx за секунды. R8 (включён по умолчанию в release сборках) минифицирует и обфусцирует. Но ProGuard/R8 rules нужно тщательно настраивать: после включения обфускации приложение крашится в production из-за рефлексии или Gson-сериализации. Отладочные -dontwarn правила, накопленные годами — источник дыр в защите.

Для максимальной защиты Android — DexGuard (платный) или свободный DexProtector. Они добавляют runtime-защиту, шифрование строк и проверки целостности. Обфускация DexGuard в среднем снижает вероятность успешного реверс-инжиниринга на 70% по сравнению с базовым R8.


Обнаружение jailbreak и root

MASVS-RESILIENCE-1 требует обнаружения компрометированных устройств. Стандартные проверки: наличие /Applications/Cydia.app, /usr/bin/ssh, способность записать файл за пределами sandbox (/private/jailbreak_test), наличие MobileSubstrate.

Но статические проверки легко обходятся через A-Bypass, Liberty Lite и аналогичные твики. Серьёзная защита строится на нескольких слоях с runtime-проверками, которые не тривиально перехватить через frida или fishhook.

Готовые решения: IOSSecuritySuite (iOS, open source), rootbeer (Android). Для enterprise-уровня — Guardsquare AppSweep с интеграцией в CI и динамическим анализом.


Что входит в работу по безопасности мобильного приложения

Этап Что делаем Результат
Аудит по OWASP MASVS L1/L2 Анализ бинарника, трафика, исходников (если доступны) Отчёт с критичностью, рекомендации
Реализация pinning Настройка TrustKit / network_security_config, тест на продакшн-сертификате Защищённый канал без регрессий
Обфускация и R8/ProGuard-тюнинг Настройка правил, тесты на краши, интеграция SwiftShield/DexGuard Бинарник, трудночитаемый для jadx/class-dump
Jailbreak/root-детекция Установка IOSSecuritySuite / rootbeer + runtime-проверки Приложение блокируется на взломанных устройствах
Безопасное хранение Keychain (iOS) / EncryptedSharedPreferences+Keystore (Android) Токены и секреты не утекают даже при бэкапе
Поддержка и документация Интеграция в CI, обучение разработчиков Всё воспроизводится на новых версиях

Как мы реализуем защиту: кейс

Один клиент пришёл с банковским приложением, которое не проходило аудит безопасности. Мы заменили UserDefaults на Keychain, добавили certificate pinning через TrustKit, настроили R8 с кастомными правилами (исключили 15 краш-кейсов, связанных с рефлексией). Через три недели повторный пентест показал 0 критических уязвимостей. С момента внедрения — ни одного инцидента за два года.


Сроки и стоимость

  • Security-аудит по OWASP MASVS уровня L1 — от 1 до 2 недель.
  • Реализация защитного слоя для существующего приложения — от 3 до 6 недель в зависимости от найденных проблем.
  • Полный цикл «аудит + внедрение + тест» — от 4 до 8 недель.

Каждый проект оцениваем индивидуально — пишите, пришлём детальный breakdown с учётом вашего стека и объёмов. Работаем под ключ: от анализа до деплоя в сторах.


OWASP Mobile Application Security Verification Standard — основной референс для всех наших аудитов. Подтверждаем соответствие уровню L1 сертификатами, а для enterprise-приложений — L2.

Оценим ваш проект за один рабочий день после получения APK/IPA. Свяжитесь — расскажем, какие дыры закроем в первую очередь.