קטגוריית OWASP: MASVS-STORAGE: אחסון
סקירה כללית
פרצות אבטחה מסוג Path Traversal מתרחשות כשהתוקף יכול לשלוט בחלק מהנתיב שמועבר ל-APIs של מערכת קבצים בלי אימות. זה עלול להוביל לפעולות לא מורשות במערכת הקבצים. לדוגמה, תוקף יכול להשתמש בתווים מיוחדים כמו ../ כדי לשנות באופן לא צפוי את יעד המשאב, על ידי מעבר מחוץ לספרייה המטורגטת.
השפעה
ההשפעה משתנה בהתאם לפעולה ולתוכן הקובץ, אבל בדרך כלל היא גורמת לדריסת קובץ (כשכותבים קבצים), לדליפת נתונים (כשקוראים קבצים) או לשינויים בהרשאות (כשמשנים הרשאות של קובץ או של ספרייה).
אמצעי צמצום סיכונים
מפעילים קנוניזציה של הנתיב באמצעות 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, ומוודאים שהיקף ההרשאות של הספרייה מוגדר לשירות או לפקודה שצוינו.