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

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

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

- A1:2021 - Broken Access Control

Вызов небезопасной функции `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 как критические и относятся к типу: Ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности (шифрования, разграничения доступа и пр.).

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

CWE-377 CWE-379