Возможность создания резервной копии приложения
![]() |
Критичность: СРЕДНИЙ |
| Способ обнаружения: SAST, APK |
Описание
Приложение Android, собранное с включенной опцией создания резервной копии (флаг android:allowBackup="true" в AndroidManifest.xml), разрешает системе включать данные приложения в механизмы резервного копирования. В этом случае содержимое внутренней директории приложения (базы данных, SharedPreferences, файлы) может покинуть «песочницу» приложения: попасть в облачный бэкап, быть скопированным на другое устройство или, при определённых условиях, извлечённым локально. Помимо чтения данных злоумышленник потенциально может изменить содержимое файлов и восстановить приложение из модифицированного бэкапа, что в ряде случаев приводит к компрометации пользовательских данных и обходу клиентской логики.
Важно: по умолчанию (если атрибут не задан явно) allowBackup считается включённым.
Пример уязвимого кода (файл AndroidManifest.xml):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.appsec.android.activity.privateactivity">
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity
android:name=".PrivateActivity"
android:label="@string/app_name"
android:exported="false" />
</application>
</manifest>
Современные механизмы резервного копирования
При включённом allowBackup данные приложения попадают в один или несколько штатных механизмов Android:
- Auto Backup for Apps (с Android 6.0 / API 23) — автоматическое резервное копирование до 25 МБ данных приложения в облако (Google Drive пользователя). Это основной актуальный канал утечки при
allowBackup="true". - Key/Value Backup (Android Backup Service) — устаревший механизм на базе
BackupAgent, требует регистрации ключа Backup API. - Device-to-Device (D2D) transfer — прямой перенос данных при настройке нового устройства; данные приложения переносятся, даже если облачный бэкап отключён.
Устаревший вектор: adb backup / adb restore
Исторически данные извлекались локально командой adb backup:
adb backup -f mybackup.ab com.appsec.android
с последующим преобразованием в обычный архив (утилита android-backup-extractor или dd+openssl) и обратной упаковкой/восстановлением через adb restore.
Механизм adb backup/adb restore фактически прекращён
Транспорт adb backup/adb restore для данных приложений перестал работать начиная с Android 12 (API 31): даже при android:allowBackup="true" пользовательские данные приложения в архив adb backup больше не включаются (в архиве остаются по сути только APK при соответствующих флагах). Поэтому adb backup следует рассматривать как legacy-вектор, актуальный лишь для устройств с Android 11 и ниже либо для отладочных (debuggable) сборок.
Это не снимает дефект: при allowBackup="true" на актуальных версиях ОС данные по-прежнему утекают через Auto Backup (в облако) и D2D-перенос. Поэтому акцент при оценке риска смещается с adb backup на облачное резервное копирование и перенос на новое устройство.
Рекомендации
-
Явно отключите резервное копирование, если приложение хранит чувствительные данные. Установите
android:allowBackup="false"(а такжеandroid:fullBackupContent="false"для совместимости со старыми API). Это закрывает и Auto Backup, и D2D-перенос, и legacy-каналы.<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.appsec.android.activity.privateactivity"> <application android:allowBackup="false" android:fullBackupContent="false" android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name=".PrivateActivity" android:label="@string/app_name" android:exported="false" /> </application> </manifest> -
Если резервное копирование нужно для UX — используйте allow-list через правила бэкапа, а не отключайте всё подряд. Начиная с Android 12 (API 31) задавайте отдельные правила для облачного бэкапа и для D2D-переноса через атрибуты
android:dataExtractionRules; для API 23–30 —android:fullBackupContent. Исключайте из бэкапа всё чувствительное (токены, ключи, БД с ПДн):<!-- res/xml/data_extraction_rules.xml (API 31+) --> <data-extraction-rules> <cloud-backup> <exclude domain="sharedpref" path="auth_tokens.xml" /> <exclude domain="database" path="secrets.db" /> </cloud-backup> <device-transfer> <exclude domain="sharedpref" path="auth_tokens.xml" /> </device-transfer> </data-extraction-rules> <!-- res/xml/backup_rules.xml (API 23–30, атрибут android:fullBackupContent) --> <full-backup-content> <exclude domain="sharedpref" path="auth_tokens.xml" /> <exclude domain="database" path="secrets.db" /> </full-backup-content>
Подключение в манифесте:
<application
android:allowBackup="true"
android:fullBackupContent="@xml/backup_rules"
android:dataExtractionRules="@xml/data_extraction_rules"
... >
-
Не полагайтесь на бэкап как на «безопасное» хранилище. Чувствительные данные шифруйте на устройстве через Android Keystore и
EncryptedSharedPreferences/Jetpack Security; при обработке персональных данных учитывайте требования 152-ФЗ (минимизация и защита ПДн при их возможном попадании в бэкап). -
Учитывайте отладочные сборки. В
debuggable-сборках локальное извлечение данных остаётся возможным независимо от версии ОС; не оставляйте отладочные сборки и тестовые данные в публичном доступе.
Ссылки
- Android Developers — Back up user data with Auto Backup
- Android Developers —
<application>: атрибутallowBackup - Android Developers — Changes to backup and restore in Android 12 (
adb backupограничен) - Android Developers — Define device-to-device transfer and backup rules
- OWASP MASTG — Testing Data Storage (Android)
- OWASP MASVS — MASVS-STORAGE
- android-backup-extractor (legacy-инструмент для
adb backup)
