Truyền tải qua đường dẫn
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Danh mục OWASP: MASVS-STORAGE: Bộ nhớ
Tổng quan
Lỗ hổng bảo mật truyền tải qua đường dẫn xảy ra khi kẻ tấn công có thể kiểm soát một phần đường dẫn, phần này sau đó được truyền đến các API hệ thống tệp mà không cần xác thực. Điều này có thể dẫn đến các hoạt động trái phép đối với hệ thống tệp. Ví dụ: kẻ tấn công có thể sử dụng các ký tự đặc biệt như ../
để thay đổi đột ngột mục tiêu tài nguyên, bằng cách truyền tải bên ngoài thư mục mục tiêu.
Mức độ tác động
Mức độ tác động sẽ thay đổi tuỳ theo từng hoạt động và nội dung tệp, nhưng thường dẫn đến việc ghi đè tệp (khi ghi tệp), rò rỉ dữ liệu (khi đọc tệp) hoặc thay đổi quyền (khi thay đổi quyền đối với tệp/thư mục).
Giải pháp giảm thiểu
Chuẩn hoá đường dẫn bằng cách sử dụng File.getCanonicalPath()
và so sánh tiền tố với thư mục dự kiến:
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;
}
Một phương pháp hiệu quả khác là sử dụng tính năng xác thực để đảm bảo chỉ xảy ra kết quả dự kiến. Một số ví dụ bao gồm:
- Kiểm tra xem tệp đã tồn tại hay chưa để ngăn việc vô tình ghi đè.
- Kiểm tra xem tệp mục tiêu có phải là mục tiêu dự kiến hay không, nhằm ngăn chặn rò rỉ dữ liệu hoặc thay đổi nhầm các quyền.
- Kiểm tra xem thư mục hiện tại của hoạt động có hoàn toàn như dự kiến trong giá trị trả về từ đường dẫn chuẩn hoá hay không.
- Đảm bảo hệ thống quyền truy cập có phạm vi rõ ràng chỉ dành cho hoạt động đó, chẳng hạn như kiểm tra để chắc chắn hoạt động đó không chạy các dịch vụ ở cấp độ gốc, đồng thời đảm bảo rằng các quyền đối với thư mục cũng có phạm vi chỉ dành cho dịch vụ hoặc lệnh được chỉ định.
Đề xuất cho bạn
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2023-12-14 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 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."]]