Перейти к содержанию

Обнаружены «внутренние домены», заданные для поиска

Описание

При статическом анализе распакованного IPA-файла были обнаружены URL-строки, совпадающие с паттернами «внутренних доменов», заданными пользователем в конфигурации модуля поиска ссылок. Это значит, что внутренняя или тестовая адресация (например, https://staging.company.internal/api) осталась в релиз-сборке для App Store / TestFlight.

Присутствие таких доменов в опубликованном приложении ведёт к рискам:

  • Раскрытие внутренней инфраструктуры (названия хостов, микросервисов, подсетей).
  • Удалённый доступ к незащищённым средам: staging-сервера могут быть доступны из-вне и содержать менее жёсткие политики безопасности.
  • Утечка логики и данных через обращения к внутренним API без полноценных механизмов авторизации.
  • Подмена ответов (MITM) — внутренние домены часто не имеют валидного публичного TLS-сертификата; злоумышленник может эмулировать их.

Типовые точки обнаружения:

  1. Секции __TEXT / __cstring бинаря (Mach-O) со строками, совпадающими с заданными regex-паттернами.
  2. Пакет ресурсов (.plist, .strings, .json, .yaml) содержит ссылки на *.internal*.company.
  3. Build-time переключатель окружений не отключён для схемы Release:

    #if DEBUG
    let baseURL = "https://api.staging.company.internal"
    #else
    let baseURL = "https://api.prod.company.com"
    #endif
    // Ошибка в схеме или настройке конфигурации может привести к утечке staging-URL
    

Рекомендации

  1. Выстроить корректную систему конфигураций Xcode:

    • Создайте отдельные build configuration files (Prod.xcconfig, Staging.xcconfig) и храните URL-ы там, а не в коде.
    • Убедитесь, что целевая схема «Release» подключает только Prod.xcconfig.
    // Prod.xcconfig
    BASE_URL = https://api.prod.company.com
    
    // Staging.xcconfig
    BASE_URL = https://api.staging.company.internal
    
    // Использование
    let baseURL = Bundle.main.infoDictionary?["BASE_URL"] as? String
    
  2. Применять remote-config/feature flags:

    • Для временных переключений окружений используйте Firebase Remote Config, LaunchDarkly, ConfigCat — это позволит динамически менять endpoints без пересборки и без рисков утечки строк.
  3. Защищать строки в рантайме:

    • Если внутренний домен обязан находиться в приложении (например, fallback-сервер), храните его зашифрованным, расшифровывайте в памяти, а ключ храните в Keychain / Secure Enclave.
    • Это лишь усложняет извлечение строки, но не заменяет корректной конфигурации.

Ссылки

  1. OWASP MASVS — контроль MASVS-CODE-4 «Build, Environment & Code Quality»
  2. Apple Developer — «Adding a build configuration file to your project» (.xcconfig)
  3. Apple Developer — «NSAppTransportSecurity» (руководство по App Transport Security)
  4. Medium — «Ensuring Security for Secrets in iOS App Development»
К началу