Kategoria OWASP: MASVS-STORAGE: Storage
Omówienie
W przypadku podatności na przemierzanie ścieżki 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 spowodować nieautoryzowane operacje na systemie plików. Na przykład atakujący może użyć znaków specjalnych, takich jak ../
, aby nieoczekiwanie zmienić docel zasobu, przechodząc poza docelowy katalog.
Wpływ
Wpływ różni się w zależności od operacji i zawartości pliku, ale zwykle prowadzi do zastąpienia pliku (podczas zapisywania plików), wycieku danych (podczas odczytu plików) lub zmiany uprawnień (podczas zmiany uprawnień pliku lub katalogu).
Środki zaradcze
Utwórz ścieżkę kanoniczną za pomocą 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 stosowanie weryfikacji, która daje pewność, że uzyskasz tylko oczekiwane rezultaty. 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łowej zmianie uprawnień.
- Sprawdzanie, czy bieżący katalog operacji jest dokładnie taki, jak oczekiwano w wartości zwracanej z ścieżki kanonicznej.
- Upewnij się, że system uprawnień jest wyraźnie ograniczony do operacji, na przykład sprawdzając, czy nie uruchamia usług jako roota, i upewniając się, że uprawnienia katalogu są ograniczone do określonej usługi lub polecenia.