Обход пути

Категория OWASP: MASVS-STORAGE: Хранилище

Обзор

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

Влияние

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

Смягчения

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

Котлин

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

Ява

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, и обеспечение того, что разрешения каталога ограничены указанной службой или командой.
{% дословно %} {% дословно %} {% дословно %} {% дословно %}