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