Данные из сторонних источников используются в FileResolver
Класс
| ArbitraryDataSavedToFileIssue
Values from third-party controlled source may eventually flow into sink file resolver
Модуль
| Santaint (Marivanna)
Описание
В операционной системе Android приложение может получать данные из различных источников: пользовательский ввод, чтение бэкапа, Intents, данные других приложений и т.п.
В отдельных случаях эти данные могут быть использованы для записи в файл и/или для формирования файлового пути, что может привести к следующим проблемам:
- Перезапись произвольных файлов.
- Заполнение файлов произвольными данными с целью порчи или подмены данных, атаки на парсеры, которые впоследствии будут работать с этими файлами.
Пример источников данных: данные из getIntent()
внутри Activity, Service, ContentProvider, BroadcastReceiver.
Пример получателей данных: java/io/File
, java/nio/file/Files
, java/io/FileOutputStream
, java/.*InputStream
.
Пример получения содержимого файла из Intent и записи этих данных в файл без валидации содержимого:
private val fileContent = intent?.extras?.getString(KEY_FILE_CONTENT)
context.openFileOutput(fileName, Context.MODE_PRIVATE)
.use {
it.write(fileContent.toByteArray())
}
Проблема
Использование данных из сторонних источников без их валидации может привести к непредсказуемому поведению при работе с файлами.
Рекомендации
- Санитизировать и валидировать данные, получаемые в приложении из внешних источников, учитывая, что данные может послать злоумышленик или зловредное приложение.
- Никогда не использовать полученные извне данные для формирования файловых путей.
- При использовании форматированных файлов, необходимо предусмотреть, что данные могут содержать специальные символы или конструкции для изменения работы или зловредного использования применяемых парсеров.
- При использовании парсеров данных отключать в явном виде возможность подгрузки внешних зависимостей, исполнения кода и т.п.