פרצת אבטחה מסוג Path Traversal
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
קטגוריה ב-OWASP: MASVS-STORAGE: אחסון
סקירה כללית
נקודות חולשה של Path Traversal מתרחשות כשתוקף יכול לשלוט בחלק מהנתיב שמועבר לאחר מכן לממשקי ה-API של מערכת הקבצים ללא אימות. כתוצאה מכך, יכולות להתבצע פעולות לא מורשות במערכת הקבצים. לדוגמה, תוקף יכול להשתמש בתווים מיוחדים כמו ../
כדי לשנות באופן בלתי צפוי את יעד המשאב, על ידי יציאה מהספרייה המטורגטת.
השפעה
ההשפעה משתנה בהתאם לפעולה ולתוכן הקובץ, אבל בדרך כלל היא מובילה למחיקה של קובץ (כשכותבים קבצים), לדליפת נתונים (כשקוראים קבצים) או לשינוי הרשאות (כשמשנים את ההרשאות של קבצים או תיקיות).
פעולות מיטיגציה
מגדירים את הנתיב כגרסה הרשמית (הקנונית) באמצעות File.getCanonicalPath()
ומשווים את הקידומת לספרייה הצפויה:
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;
}
שיטה מומלצת נוספת היא להשתמש באימות כדי לוודא שמתקבלים רק תוצאות צפויות. דוגמאות לכך:
- בדיקה אם הקובץ כבר קיים כדי למנוע מחיקה בטעות.
- בדיקה אם הקובץ המטורגט הוא היעד הצפוי כדי למנוע דליפת נתונים או שינוי שגוי של הרשאות.
- בדיקה אם הספרייה הנוכחית של הפעולה היא בדיוק כצפוי בערך המוחזר מהנתיב הקנוני.
- מוודאים שמערכת ההרשאות מוגדרת במפורש להיקף הפעולה, למשל, מוודאים שהיא לא מפעילה שירותים בתור root ומוודאים שההרשאות של הספרייה מוגדרות להיקף השירות או הפקודה שצוינו.
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-26 (שעון UTC).
[null,null,["עדכון אחרון: 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."]]