Kategoria OWASP: MASVS-STORAGE: Storage
Przegląd
Luki w zabezpieczeniach typu path traversal występują, gdy atakujący może kontrolować część ścieżki, która jest następnie przekazywana do interfejsów API systemu plików bez weryfikacji. Może to prowadzić do nieautoryzowanych operacji w systemie plików. Na przykład atakujący może użyć znaków specjalnych, takich jak ../, aby nieoczekiwanie zmienić zasób docelowy, przechodząc poza docelowy katalog.
Wpływ
Wpływ zależy od operacji i zawartości pliku, ale zwykle prowadzi do nadpisania pliku (podczas zapisywania plików), wycieku danych (podczas odczytywania plików) lub zmiany uprawnień (podczas zmiany uprawnień do pliku lub katalogu).
Środki ograniczające ryzyko
Utwórz ścieżkę kanoniczną za pomocą funkcji File.getCanonicalPath() i porównaj prefiks z oczekiwanym katalogiem:
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;
}
Dodatkową sprawdzoną metodą jest używanie weryfikacji, aby mieć pewność, że występują tylko oczekiwane wyniki. Przykłady:
- Sprawdzanie, czy plik już istnieje, aby zapobiec przypadkowemu zastąpieniu.
- Sprawdzanie, czy docelowy plik jest oczekiwanym celem, aby zapobiec wyciekowi danych lub nieprawidłowemu zmienianiu uprawnień.
- Sprawdzanie, czy bieżący katalog operacji jest dokładnie taki, jak oczekiwano, w wartości zwracanej ze ścieżki kanonicznej.
- Zapewnienie, że system uprawnień jest wyraźnie ograniczony do operacji, np. sprawdzenie, czy nie uruchamia usług jako root, oraz zapewnienie, że uprawnienia do katalogu są ograniczone do określonej usługi lub polecenia.