رده OWASP: MASVS-STORAGE: ذخیرهسازی
نمای کلی
آسیبپذیریهای پیمایش مسیر زمانی رخ میدهند که یک مهاجم بتواند بخشی از مسیری را که سپس به APIهای سیستم فایل منتقل میشود، بدون اعتبارسنجی کنترل کند. این میتواند منجر به عملیات غیرمجاز سیستم فایل شود. به عنوان مثال، یک مهاجم ممکن است با پیمایش خارج از دایرکتوری هدف، از کاراکترهای ویژهای مانند ../ برای تغییر غیرمنتظره هدف منبع استفاده کند.
تأثیر
تأثیر این آسیبپذیری بسته به نوع عملیات و محتوای فایل متفاوت است، اما بهطورکلی منجر به بازنویسی فایل (هنگام نوشتن فایلها)، نشت دادهها (هنگام خواندن فایلها) یا تغییر مجوزها (هنگام تغییر مجوزهای فایل یا دایرکتوری) میشود.
کاهشها
با استفاده از File.getCanonicalPath() مسیر را کانونیکال کنید و پیشوند را با دایرکتوری مورد انتظار مقایسه کنید:
کاتلین
@Throws(IllegalArgumentException::class)
fun saferOpenFile(path: String, expectedDir: String?): File {
val f = File(path)
val canonicalPath = f.canonicalPath
require(canonicalPath.startsWith(expectedDir!!))
return f
}
جاوا
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 اجرا نمیکند، و اطمینان از اینکه مجوزهای دایرکتوری به سرویس یا دستور مشخص شده محدود میشوند.