PVS-Studio.com logo
>
>
>
V5329. OWASP. Using non-atomic file cre…


V5329. OWASP. Using non-atomic file creation is not recommended because an attacker might intercept file ownership.

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

Уязвимости такого типа относятся к категории рисков OWASP Top 10 Application Security Risks 2021:

Вызов небезопасной функции createTempFile из класса java.io.File считается заведомо небезопасным, если выполняется совместно с вызовом методов mkdir или mkdirs:

public File createTemporaryDirectory() {
  File dir = new File(baseDirFactory.create(),
                      CollectionUtils.join("/", path));
  GFileUtils.mkdirs(dir);
  try {
      File tmpDir = File.createTempFile("gradle", 
                                        "projectDir", 
                                        dir);
      tmpDir.delete();
      tmpDir.mkdir();
      return tmpDir;
  } catch (IOException e) {
      throw new UncheckedIOException(e);
  }
}

Создание временных файлов неатомарным способом может привести к состоянию гонки в поведении приложения. Из-за этого третья сторона может создать этот файл между тем, когда приложение выбирает его имя, и тем, когда оно его создает. В такой ситуации приложение будет использовать файл, который по-настоящему не контролирует.

Атакующий может получить доступ и контроль над временным файлом уязвимого приложения, а также поменять его таким образом, чтобы изменить логику работы приложения.

Безопасной в таком случае является реализация создания временного файла методом createTempDirectory из класса java.nio.file.Files:

public File createTemporaryDirectory() {
  try {
      File dir = new File(baseDirFactory.create(),
                          CollectionUtils.join("/", path));
      GFileUtils.mkdirs(dir);

      Path tempDir = Files.createTempDirectory(dir.toPath(), 
                                               "gradle");
      return tempDir.toFile();
  } catch (IOException e) {
      throw new UncheckedIOException(e);
  }
}

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности (шифрования, разграничения доступа и пр.).

Данная диагностика классифицируется как: