Path traversal
Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Kategori OWASP: MASVS-STORAGE: Storage
Ringkasan
Kerentanan path traversal terjadi saat penyerang dapat mengontrol bagian jalur yang kemudian diteruskan ke API sistem file tanpa validasi. Hal ini dapat menyebabkan operasi sistem file tanpa izin. Misalnya, penyerang dapat menggunakan karakter khusus seperti ../
untuk mengubah target resource secara tidak terduga dengan melintas ke luar direktori yang ditargetkan.
Dampak
Dampak dapat bervariasi, bergantung pada operasi dan konten file, tetapi umumnya menyebabkan file ditimpa (saat menulis file), kebocoran data (saat membaca file), atau izin berubah (saat mengubah izin file/direktori).
Mitigasi
Melakukan kanonikalisasi jalur menggunakan File.getCanonicalPath()
dan membandingkan awalan dengan direktori yang diharapkan:
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;
}
Praktik terbaik lainnya adalah menggunakan validasi untuk memastikan bahwa hanya hasil yang diharapkan yang akan terjadi. Contohnya mencakup:
- Memeriksa apakah file sudah ada atau belum untuk mencegah timpaan yang tidak disengaja.
- Memeriksa apakah file yang ditargetkan adalah target yang diharapkan atau bukan untuk mencegah kebocoran data atau mengubah izin secara tidak benar.
- Memeriksa apakah direktori operasi saat ini sudah sama persis dengan direktori yang diharapkan dalam nilai yang ditampilkan dari jalur kanonis.
- Memastikan sistem izin untuk operasi tersebut sudah secara eksplisit dicakup, seperti memeriksa bahwa sistem tidak menjalankan layanan sebagai root dan memastikan izin direktori disertakan ke layanan atau perintah yang ditentukan.
Direkomendasikan untuk Anda
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2023-12-14 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2023-12-14 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."]]