Категория OWASP: MASVS-CODE: качество кода
Обзор
Реализация HostnameVerifier отвечает за проверку того, что имя хоста в сертификате сервера совпадает с именем хоста сервера, к которому пытается подключиться клиент.
Небезопасная реализация интерфейса HostnameVerifier в приложении для Android не позволяет должным образом проверить имя хоста сервера, с которым взаимодействует приложение. Это может позволить злоумышленнику выдать себя за легитимный сервер и обманом заставить приложение отправить ему конфиденциальные данные.
Эта уязвимость существует, поскольку в классе HostnameVerifier есть вызовы функций, которые могут пропускать проверку имени хоста сертификата X.509 и вместо этого проверять только хеш сертификата. Распространенное заблуждение заключается в том, что функция SSLSession#isValid выполняет операцию, связанную с безопасностью, тогда как на самом деле ее цель – только проверить, действителен ли сеанс и доступен ли он для возобновления или присоединения. Ни то, ни другое не подтверждает безопасность сеанса. Класс HostnameVerifier заменен на NetworkSecurityConfig.
Влияние
Небезопасная реализация интерфейса HostnameVerifier может привести к уязвимостям, которые могут использоваться для выполнения атак типа "человек посередине" (MiTM) на сетевой трафик из уязвимого приложения. Если этот код будет запущен, злоумышленники смогут удаленно или локально скомпрометировать сетевые данные приложения пользователя. Последствия зависят от того, какой именно контент сетевого трафика был случайно раскрыт (информация, позволяющая идентифицировать личность, конфиденциальная информация, значения сеанса, учетные данные сервиса и т. д.).
Предотвращение атак
Используйте файл NetworkSecurityConfig.xml, чтобы обеспечить правильную обработку всех подключений на этапах производства, тестирования, отладки и разработки, вместо того чтобы использовать или реализовывать собственный код проверки TLS/SSL-сертификатов.
Ресурсы
- Документация по настройке сетевой безопасности
- Проверка ищет реализации HostnameVerifier, метод verify которых всегда возвращает значение true (то есть доверяет любому имени хоста).
- Документация для разработчиков по классу HostnameVerifier
- Класс AllowAllHostnameVerifierDetector в Android