Обнаружены «внутренние домены», заданные для поиска
Описание
Во время статического анализа декомпилированных исходников инструментарий обнаружил строки-URL, соответствующие паттернам «внутренних доменов», указанных пользователем. Факт присутствия таких доменов в финальной сборке свидетельствует о том, что разработчики забыли удалить или заменить служебные или тестовые адреса (например, https://staging.company.internal/api
), используемые на этапе разработки или внутренних тестов.
Наличие внутренних доменов в опубликованном APK может привести к ряду негативных последствий:
- Раскрытие внутренней инфраструктуры: злоумышленник получает информацию о структуре сети, названиях сервисов, используемых технологиях (например,
kibana.dev.company.local
). - Внешний доступ к незащищённым средам: если тестовый или staging-сервер доступны извне, их можно атаковать для обхода основного контура безопасности.
- Утечка логики и данных: сборка может обращаться к эндпоинтам без полноценной аутентификации, раскрывая внутренние API-методы или тестовые данные.
- Возможность подмены ответов (MITM): внутренние адреса часто обслуживаются без TLS-сертификатов, валидных в публичном Интернете. Злоумышленник может эмулировать эти домены и вернуть произвольный ответ.
Типовые сценарии обнаружения:
- Жёстко прописанные строки-URL в коде (
.java
,.kt
) или ресурсах (strings.xml
). - Файлы конфигурации (JSON, YAML, Protobuf) внутри APK, где сохранены тестовые эндпоинты.
- Логику переключения окружений без отключения «dev»/«staging» веток в релиз-сборке:
const val BASE_URL = if (BuildConfig.DEBUG) {
"https://api.staging.company.internal"
} else {
"https://api.prod.company.com"
}
// При ошибочном флаге или переопределении через buildVariant внутренняя ссылка окажется в релизе
Рекомендации
-
Сконфигурировать сборочный процесс:
- Храните адреса окружений в gradle-профилях или CI/CD-секретах, а не в коде.
- Убедитесь, что продакшн-домены подставляются только для релизных buildTypes и productFlavors.
-
Использовать централизованное хранилище конфигурации:
- Для смены окружений применяйте Remote Config, Firebase, ConfigCat или аналогичные сервисы с возможностью feature flags.
- Это позволит изменять цели API без пересборки приложения и без риска утечки внутренних адресов.
-
Шифровать чувствительные строки:
- Если по техническим причинам необходимо оставить внутренний домен в приложении (например, для fallback), храните его в зашифрованном виде и расшифровывайте только в рантайме через Android Keystore.
- Учтите, что это не основной способ защиты, а лишь затрудняет тривиальное извлечение строки.