Возможность доступа к произвольному файлу через getParcelableExtra
![]() |
Критичность: ВЫСОКИЙ |
| Способ обнаружения: IAST |
Описание
Дефект возникает, когда компонент приложения (как правило, экспортируемая Activity или Service) извлекает из входящего Intent объект Uri через getParcelableExtra() и использует его для чтения или копирования файла без валидации. Поскольку Intent приходит от внешнего отправителя, злоумышленник может подсунуть file:// или content://-Uri, указывающий на приватные файлы атакуемого приложения, и спровоцировать их чтение, копирование во внешнее хранилище или отправку на сервер.
Это классический сценарий кражи файлов из песочницы (file theft) через подмену Uri в неявном/явном Intent (часто в обработчиках ACTION_SEND).
Пример уязвимого кода:
// Uri полностью контролируется отправителем Intent
Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
// файл по контролируемому пути читается и, например, копируется в доступное место
InputStream in = getContentResolver().openInputStream(uri);
File out = new File(getExternalFilesDir(null), "uploaded.dat");
copy(in, new FileOutputStream(out)); // приватный файл вытек во внешнее хранилище
Злоумышленник отправляет:
Intent i = new Intent("com.example.IMPORT");
i.setClassName("com.example.victim", "com.example.victim.ImportActivity");
i.putExtra(Intent.EXTRA_STREAM,
Uri.parse("file:///data/data/com.example.victim/databases/secret.db"));
startActivity(i);
Проблема
- Кража приватных данных — приложение само (с собственными правами) читает файл из своей песочницы (
/data/data/<pkg>/...) и помещает его туда, откуда злоумышленник может его забрать (внешнее хранилище, экспортируемыйContentProvider, сеть). - Path Traversal — отсутствие нормализации пути позволяет через
../выйти за пределы ожидаемого каталога (CWE-22). - Доступ к файлам других приложений / системы — при наличии у приложения соответствующих прав непроверенный
Uriможет указывать на чужие данные. - Эксплуатация через
content://—Uriможет ссылаться на чужойContentProvider, что приводит к непреднамеренному раскрытию или перезаписи данных.
Рекомендации
-
Не доверяйте
Uriиз внешнегоIntent. Не используйте напрямуюfile://-пути, полученные от других приложений. -
Канонизируйте и проверяйте путь перед доступом, убеждаясь, что он находится внутри разрешённого каталога:
-
Запрещайте
file://-схему для входящихUri; принимайте толькоcontent://и обрабатывайте их черезContentResolverс проверкой источника. -
Используйте
FileProviderи временные права доступа (FLAG_GRANT_READ_URI_PERMISSION) для контролируемого обмена файлами вместо передачи произвольных путей. -
Ограничивайте экспорт компонентов:
android:exported="false"либо защитаpermissionуровняsignature, если приём файлов не предназначен для сторонних приложений. -
Проверяйте вызывающую сторону (
getCallingActivity()/ проверка package) для чувствительных операций импорта.
Ссылки
- https://developer.android.com/privacy-and-security/risks/path-traversal
- https://developer.android.com/reference/androidx/core/content/FileProvider
- https://developer.android.com/training/secure-file-sharing
- https://mas.owasp.org/MASTG/0x05h-Testing-Platform-Interaction/
- https://cwe.mitre.org/data/definitions/22.html
- https://cwe.mitre.org/data/definitions/264.html
