اجتياز المسار

فئة OWASP: MASVS-STORAGE: مساحة التخزين

نظرة عامة

تحدث ثغرات path traversal عندما يتمكّن أحد المهاجمين من التحكّم في جزء من المسار الذي يتم تمريره بعد ذلك إلى واجهات برمجة التطبيقات لنظام الملفات بدون التحقّق من صحته. ويمكن أن يؤدي ذلك إلى عمليات غير مصرّح بها في نظام الملفات. على سبيل المثال، قد يستخدم المهاجم أحرفًا خاصة، مثل ../، لتغيير هدف المورد بشكل غير متوقّع، وذلك من خلال الانتقال إلى خارج الدليل المستهدَف.

التأثير

يختلف التأثير حسب العملية ومحتوى الملف، ولكنّه يؤدي بشكل عام إلى استبدال الملف (عند كتابة الملفات)، أو تسرُّب البيانات (عند قراءة الملفات)، أو تغييرات في الأذونات (عند تغيير أذونات الملف أو الدليل).

إجراءات التخفيف

حدِّد عنوان URL الأساسي للمسار باستخدام 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;
}

من أفضل الممارسات الإضافية استخدام التحقّق من الصحة لضمان حدوث النتائج المتوقّعة فقط. تشمل الأمثلة ما يلي:

  • التحقّق مما إذا كان الملف متاحًا من قبل لتجنُّب استبداله عن طريق الخطأ
  • التحقّق مما إذا كان الملف المستهدَف هو هدف متوقّع لمنع تسريب البيانات أو تغيير الأذونات بشكل غير صحيح
  • التحقّق مما إذا كان الدليل الحالي للعملية مطابقًا تمامًا لما هو متوقّع في القيمة المعروضة من المسار الأساسي
  • التأكّد من أنّ نظام الأذونات يقتصر بشكل صريح على العملية، مثل التأكّد من أنّه لا يشغّل الخدمات كجذر، والتأكّد من أنّ أذونات الدليل تقتصر على الخدمة أو الأمر المحدّد.