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

Данные из сторонних источников используются в 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())
    }

Проблема

Использование данных из сторонних источников без их валидации может привести к непредсказуемому поведению при работе с файлами.

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

  • Санитизировать и валидировать данные, получаемые в приложении из внешних источников, учитывая, что данные может послать злоумышленик или зловредное приложение.
  • Никогда не использовать полученные извне данные для формирования файловых путей.
  • При использовании форматированных файлов, необходимо предусмотреть, что данные могут содержать специальные символы или конструкции для изменения работы или зловредного использования применяемых парсеров.
  • При использовании парсеров данных отключать в явном виде возможность подгрузки внешних зависимостей, исполнения кода и т.п.

Ссылки

  1. Path traversal

  2. Описание Intent

К началу