اجتياز المسار
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
فئة OWASP: MASVS-STORAGE: مساحة التخزين
نظرة عامة
تحدث ثغرات اجتياز المسار عندما يتمكن المهاجم من التحكم في جزء من المسار
الذي يتم تمريره بعد ذلك إلى واجهات برمجة تطبيقات نظام الملفات بدون التحقق من الصحة. ويمكن أن يؤدي ذلك
إلى عمليات غير مصرَّح بها في نظام الملفات. على سبيل المثال، قد يستخدم المهاجم رموزًا خاصة مثل ../
لتغيير استهداف المورد بشكل غير متوقع، وذلك من خلال اجتيازه خارج الدليل المستهدف.
التأثير
ويختلف التأثير بناءً على العملية ومحتوى الملف، ولكنه يؤدي عمومًا إلى استبدال الملف (عند كتابة الملفات) أو تسرُّب البيانات (عند قراءة الملفات) أو تغييرات الأذونات (عند تغيير أذونات الملف أو الدليل).
إجراءات التخفيف
حدِّد عنوان 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;
}
ومن أفضل الممارسات الإضافية استخدام عمليات التحقّق لضمان حدوث النتيجة المرجوة فقط. تشمل الأمثلة ما يلي:
- التحقّق مما إذا كان الملف متوفّرًا من قبل لمنع استبداله عن طريق الخطأ
- التحقّق مما إذا كان الملف المستهدَف هو هدف متوقّع لمنع تسرُّب البيانات أو
تغيير الأذونات بشكلٍ غير صحيح
- التحقق مما إذا كان الدليل الحالي للعملية كما هو متوقع في القيمة المعروضة من المسار الأساسي
- التأكّد من أنّ نظام الأذونات محدود النطاق صراحةً للعملية، مثل
التحقّق من عدم تشغيل الخدمات بصفتها الجذر، والتأكّد من أنّ أذونات directory
محدودة النطاق للخدمة أو الأمر المحدّد
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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."]]