Обход каталога

Категория OWASP: MASVS-STORAGE: Storage.

Обзор

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

Влияние

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

Предотвращение атак

Канонизируйте путь с помощью File.getCanonicalPath() и сравните префикс с ожидаемым каталогом:

Kotlin

@Throws(IllegalArgumentException::class)
fun saferOpenFile(path: String, expectedDir: String?): File {
    val f = File(path)
    val canonicalPath = f.canonicalPath
    require(canonicalPath.startsWith(expectedDir!!))
    return f
}

Java

public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {
  File f = new File(path);
  String canonicalPath = f.getCanonicalPath();
  if (!canonicalPath.startsWith(expectedDir)) {
    throw new IllegalArgumentException();
  }
  return f;
}

Ещё одна рекомендация – использовать валидацию, чтобы убедиться, что происходят только ожидаемые результаты. Примеры:

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