پیمودن مسیر

دسته 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;
}

بهترین روش دیگر استفاده از اعتبارسنجی برای اطمینان از وقوع تنها نتایج مورد انتظار است. به عنوان مثال می توان به موارد زیر اشاره کرد:

  • بررسی اینکه آیا فایل از قبل وجود دارد تا از بازنویسی تصادفی جلوگیری شود.
  • بررسی اینکه آیا فایل مورد نظر هدف مورد انتظاری است برای جلوگیری از نشت داده ها یا تغییر نادرست مجوزها.
  • بررسی اینکه آیا دایرکتوری فعلی عملیات دقیقاً مطابق با مقدار بازگشتی از مسیر متعارف است یا خیر.
  • اطمینان از اینکه یک سیستم مجوزها به طور صریح در محدوده عملیات قرار دارد، مانند بررسی اینکه سرویس‌ها را به‌عنوان روت اجرا نمی‌کند، و اطمینان از اینکه مجوزهای دایرکتوری به سرویس یا فرمان مشخص‌شده اختصاص دارد.
،

دسته 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;
}

بهترین روش دیگر استفاده از اعتبارسنجی برای اطمینان از وقوع تنها نتایج مورد انتظار است. به عنوان مثال می توان به موارد زیر اشاره کرد:

  • بررسی اینکه آیا فایل از قبل وجود دارد تا از بازنویسی تصادفی جلوگیری شود.
  • بررسی اینکه آیا فایل مورد نظر هدف مورد انتظاری است برای جلوگیری از نشت داده ها یا تغییر نادرست مجوزها.
  • بررسی اینکه آیا دایرکتوری فعلی عملیات دقیقاً مطابق با مقدار بازگشتی از مسیر متعارف است یا خیر.
  • اطمینان از اینکه یک سیستم مجوزها به طور صریح در محدوده عملیات قرار دارد، مانند بررسی اینکه سرویس‌ها را به‌عنوان روت اجرا نمی‌کند، و اطمینان از اینکه مجوزهای دایرکتوری به سرویس یا فرمان مشخص‌شده اختصاص دارد.