﻿# 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](https://owasp.org/Top10/A01_2021-Broken_Access_Control/)

Вызов небезопасной функции [`createTempFile`](https://docs.oracle.com/javase/8/docs/api/java/io/File.html#createTempFile-java.lang.String-java.lang.String-) из класса `java.io.File` считается заведомо небезопасным, если выполняется совместно с вызовом методов `mkdir` или `mkdirs`:

```cpp
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`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempDirectory-java.nio.file.Path-java.lang.String-java.nio.file.attribute.FileAttribute...-) из класса `java.nio.file.Files`:

```cpp
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);
  }
}
```