Przemierzanie ścieżki
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
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.
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-07-26 UTC.
[null,null,["Ostatnia aktualizacja: 2025-07-26 UTC."],[],[],null,["# Path traversal\n\n\u003cbr /\u003e\n\n**OWASP category:** [MASVS-STORAGE: Storage](https://mas.owasp.org/MASVS/05-MASVS-STORAGE)\n\nOverview\n--------\n\nPath traversal vulnerabilities occur when an attacker can control part of the\npath that is then passed to the file system APIs without validation. This can\nlead to unauthorized file system operations. For example, an attacker might use\nspecial characters such as `../` to unexpectedly change the resource target, by\ntraversing outside of the targeted directory.\n\nImpact\n------\n\nThe impact varies depending on the operation and file content, but generally\nleads to a file overwrite (when writing files), data leak (when reading files),\nor permission changes (when changing file or directory permissions).\n\nMitigations\n-----------\n\nCanonicalize the path using [`File.getCanonicalPath()`](/reference/java/io/File#getCanonicalPath()) and compare the\nprefix with the expected directory: \n\n### Kotlin\n\n @Throws(IllegalArgumentException::class)\n fun saferOpenFile(path: String, expectedDir: String?): File {\n val f = File(path)\n val canonicalPath = f.canonicalPath\n require(canonicalPath.startsWith(expectedDir!!))\n return f\n }\n\n### Java\n\n public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {\n File f = new File(path);\n String canonicalPath = f.getCanonicalPath();\n if (!canonicalPath.startsWith(expectedDir)) {\n throw new IllegalArgumentException();\n }\n return f;\n }\n\nAn additional best practice is to use validation to ensure only expected\noutcomes occur. Examples include the following:\n\n- Checking if the file already exists to prevent an accidental overwrite.\n- Checking if the targeted file is an expected target to prevent leaking data or incorrectly changing permissions.\n- Checking if the current directory of the operation is exactly as expected in the return value from the canonical path.\n- Ensuring a permissions system is explicitly scoped to the operation, such as checking that it isn't running services as root, and ensuring that the directory permissions are scoped to the service or command specified."]]