Приложение осуществляет сетевое взаимодействие по протоколу HTTP
Описание
Приложение инициирует сетевые соединения или передает данные, используя незащищенный протокол HTTP вместо повсеместно рекомендованного HTTPS. Это подвергает передаваемые данные и само приложение серьезным рискам безопасности.
Протокол HTTP передает данные в открытом, нешифрованном виде. Это означает, что любой злоумышленник, находящийся в той же сети, что и пользователь (например, публичный Wi-Fi, корпоративная сеть), или на пути следования трафика (провайдеры, узлы связи), может:
- Перехватить (Sniffing): Прочитать все передаваемые данные, включая учетные данные (логины, пароли), токены аутентификации/сессии, персональную информацию (ФИО, адреса, телефоны), платежные реквизиты, содержимое сообщений и другие конфиденциальные сведения.
- Модифицировать (Tampering): Изменить данные "на лету" как в запросах от приложения к серверу, так и в ответах от сервера к приложению. Злоумышленник может внедрить вредоносный код (например, JavaScript), подменить загружаемый контент, изменить суммы транзакций или перенаправить пользователя на фишинговый сайт.
Использование HTTP подрывает конфиденциальность и целостность передаваемых данных, что может привести к:
- Компрометации учетных записей пользователей.
- Краже личной и финансовой информации.
- Финансовым потерям (для пользователя и компании).
- Репутационному ущербу для разработчика и владельца приложения.
- Распространению вредоносного ПО через модифицированные ответы.
Современные версии Android (начиная с Android 7/API 24) предоставляют механизм Network Security Configuration (NSC), который позволяет централизованно управлять политиками сетевой безопасности, включая принудительное использование HTTPS и запрет HTTP. Отсутствие или неверная настройка NSC часто является причиной использования HTTP.
Причины возникновения уязвимости
- Устаревший код или зависимости: Использование старых библиотек, SDK или обращение к legacy backend-системам, которые не поддерживают HTTPS.
- Настройки для разработки/тестирования: Использование HTTP в средах разработки или тестирования (например, для удобства отладки с прокси), которые случайно попадают в релизную сборку.
- Явное разрешение HTTP: Некорректная настройка Network Security Configuration (NSC), явно разрешающая использование
cleartext
(HTTP) трафика для определенных доменов или для всего приложения без веской причины. - Недостаточная осведомленность: Разработчики могут не до конца понимать риски HTTP или считать внедрение HTTPS сложным.
- Использование сторонних библиотек: Подключение SDK (например, рекламных), которые сами инициируют небезопасные HTTP-соединения без ведома разработчика основного приложения.
Рекомендации
Для обеспечения безопасности сетевого взаимодействия необходимо принудительно использовать протокол HTTPS для всех соединений и правильно настроить проверку сертификатов.
-
Использовать Network Security Configuration (NSC) для запрета HTTP:
- Основной метод: Начиная с Android 7 (API 24), используйте файл
res/xml/network_security_config.xml
для определения политики сетевой безопасности. Запретите HTTP (cleartext
) трафик по умолчанию. - Создайте файл
res/xml/network_security_config.xml
: - Укажите этот файл в
AndroidManifest.xml
внутри тега<application>
: - Это заблокирует все HTTP-соединения для приложения (и его библиотек) на уровне ОС для Android 7+. Для старых версий Android (API < 24) запрет HTTP нужно реализовывать вручную через проверки URL в коде или настройки используемых HTTP-клиентов.
- Основной метод: Начиная с Android 7 (API 24), используйте файл
-
Использовать HTTPS во всем коде и библиотеках:
- Убедитесь, что все URL, используемые в вашем коде для сетевых запросов (
HttpURLConnection
,OkHttp
,Retrofit
,Volley
и т.д.), используют схемуhttps://
. - Проверьте конфигурацию всех сторонних библиотек и SDK (рекламных, аналитических, платежных и др.) на предмет использования ими HTTP. Обновите их до версий, использующих HTTPS, или откажитесь от их использования, если безопасные версии недоступны.
- Убедитесь, что все URL, используемые в вашем коде для сетевых запросов (
-
Обеспечить строгую проверку SSL-сертификатов:
- Не отключайте проверку сертификатов! Никогда не используйте кастомные
TrustManager
илиHostnameVerifier
, которые принимают любые сертификаты или любые хостнеймы. Это полностью лишает смысла использование HTTPS и делает приложение уязвимым к атакам "человек посередине" (MITM). - Стандартной проверки, предоставляемой ОС и библиотеками (
SSLSocketFactory.getDefault()
,HttpsURLConnection.getDefaultHostnameVerifier()
), обычно достаточно. Она проверяет цепочку доверия сертификата до системных или пользовательских корневых CA и соответствие имени хоста в сертификате запрошенному домену.
- Не отключайте проверку сертификатов! Никогда не используйте кастомные
-
Рассмотреть использование Certificate Pinning (для повышенной безопасности):
- Контекст: Pinning (привязка сертификатов или публичных ключей) — это дополнительная мера защиты от MITM-атак, использующих скомпрометированные или ошибочно выпущенные доверенные сертификаты. Приложение доверяет только конкретным сертификатам/ключам для определенных доменов.
- Когда использовать: Рекомендуется для приложений с высокими требованиями к безопасности (финансовые, медицинские, государственные), которые подключаются к ограниченному числу известных серверов.
- Реализация (пример OkHttp):
import okhttp3.CertificatePinner; import okhttp3.OkHttpClient; // ... пины должны быть актуальными публичными ключами ваших серверов String hostname = "secure.example.com"; CertificatePinner certificatePinner = new CertificatePinner.Builder() .add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") // Заменить реальным пином .add(hostname, "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=") // Можно добавить backup пин .build(); OkHttpClient client = new OkHttpClient.Builder() .certificatePinner(certificatePinner) // .protocols(Collections.singletonList(Protocol.HTTP_1_1)) // Если нужно отключить HTTP/2 или QUIC для пиннинга .build();
Дополнительные советы:
- HSTS (HTTP Strict Transport Security): Настройте HSTS-заголовки на ваших серверах. Это инструкция для клиента (браузера или приложения) всегда использовать HTTPS для данного домена после первого успешного HTTPS-соединения. Хотя это серверная настройка, современные HTTP-клиенты в Android ее учитывают.
- Мониторинг и логирование: Отслеживайте сетевую активность приложения на предмет аномалий или попыток использования HTTP.
- Регулярные проверки: Используйте сканеры безопасности (SAST/DAST) и ручной анализ для выявления URL с HTTP и проверки конфигурации NSC.
Ссылки
- Android Developers: Network security configuration - Официальная документация по NSC.
- Android Developers: Security with HTTPS and SSL - Общие принципы безопасного сетевого взаимодействия.
- OWASP Mobile Security Testing Guide - Network Communication - Тестирование сетевого взаимодействия.
- OWASP Mobile Top 10: M3-Insecure Communication - Описание риска.
- OkHttp Recipe: Certificate Pinning - Пример реализации пиннинга в OkHttp.