Первая и самая распространенная угроза — это хранение конфиденциальных данных в ресурсах (res/values/). Никогда не помещайте API-ключи, пароли, токены доступа или IP-адреса серверов в строковые ресурсы (strings.xml) или иные XML-файлы ресурсов. Эти файлы компилируются в открытом виде и могут быть легко извлечены из APK-файла с помощью таких инструментов, как Apktool. Вместо этого используйте безопасное хранилище: Android Keystore для криптографических ключей, EncryptedSharedPreferences для небольших данных или серверную часть для динамического получения чувствительной информации.
Второй ключевой пункт — безопасная обработка внешних XML-данных. Если ваше приложение парсит XML, полученный из сети (например, RSS-ленты, конфигурации с сервера), вы должны быть уверены, что этот процесс не подвержен XML-эксплойтам. Атаки типа XML External Entity (XXE) могут привести к чтению локальных файлов устройства или к DoS-атакам. Отключите обработку внешних сущностей в вашем парсере. Для SAXParserFactory установите `setFeature("http://xml.org/sax/features/external-general-entities", false)`. Аналогичные меры предосторожности существуют для XmlPullParser и DOM-парсеров.
Особое внимание уделите WebView и загрузке контента. При использовании `WebView.loadDataWithBaseURL()` с XML/HTML-контентом убедитесь, что JavaScript отключен, если в нем нет необходимости (`webView.getSettings().setJavaScriptEnabled(false)`). Это предотвратит выполнение потенциально вредоносных скриптов, которые могут быть внедрены в данные. Кроме того, строго ограничьте доступ к локальным файлам через `file://` схему, используя настройки `allowFileAccess` и `allowContentAccess`.
Манифест приложения (AndroidManifest.xml) — это особая зона риска. Неправильно объявленные разрешения (permissions) или компоненты (activity, service, receiver) могут сделать приложение уязвимым. Всегда устанавливайте атрибут `android:exported` явно для каждого компонента. Если компонент должен быть доступен только из вашего приложения, установите `exported="false"`. Используйте защищенные разрешения (custom permissions) с подписью (`android:protectionLevel="signature"`) для межпроцессного взаимодействия между вашими собственными приложениями. Тщательно проверяйте intent-фильтры, чтобы избежать перехвата или подмены намерений.
Конфигурационные XML-файлы, такие как `network_security_config.xml`, являются мощным инструментом защиты. Используйте его для принудительного использования HTTPS (шифрование трафика) с помощью тега ``. Реализуйте привязку сертификатов (certificate pinning), чтобы защититься от атак с использованием поддельных сертификатов на уровне устройства. Однако будьте осторожны: слишком жесткая привязка может привести к неработоспособности приложения при смене сертификата на сервере, поэтому предусмотрите механизмы безопасного обновления.
Чеклист безопасности XML для Android-разработчика:
- Уберите все секреты (ключи, пароли) из strings.xml и ресурсов.
- Для парсинга внешнего XML отключите обработку внешних сущностей (XXE protection).
- Явно задайте атрибут `android:exported` для всех компонентов в манифесте.
- Используйте `network_security_config.xml` для принудительного HTTPS и (опционально) привязки сертификатов.
- В WebView отключайте JavaScript для ненадежного XML/HTML-контента.
- Проверяйте и санируйте (очищайте) любые XML-данные, поступающие от пользователя или извне, перед использованием.
- Минимизируйте использование разрешений в манифесте, запрашивайте только необходимые.
- Шифруйте локальные XML-файлы с конфиденциальными данными, используя CryptoFile.
- Регулярно обновляйте зависимости библиотек, связанных с XML-парсингом, для получения исправлений уязвимостей.
- Проводите статический анализ кода (SAST) и динамическое тестирование (DAST) для выявления уязвимостей, связанных с XML.
Комментарии (8)