Skip to content

fix: prevent path traversal vulnerability in object handlers#2

Open
Amahdip wants to merge 1 commit into
mysamimi:mainfrom
Amahdip:fix-path-traversal
Open

fix: prevent path traversal vulnerability in object handlers#2
Amahdip wants to merge 1 commit into
mysamimi:mainfrom
Amahdip:fix-path-traversal

Conversation

@Amahdip

@Amahdip Amahdip commented Jun 9, 2026

Copy link
Copy Markdown

Description

This PR addresses a critical Path Traversal (Directory Traversal) vulnerability in the S3 object handlers (get_object, head_object, put_object, delete_object).

The Issue:
Previously, the code used storage.join(key.trim_start_matches('/')). If a client sent a malicious key containing traversal segments (e.g., ../../etc/passwd), the resulting PathBuf could escape the intended bucket storage directory. This allowed unauthorized arbitrary file read, overwrite, and deletion on the host filesystem.

The Fix:

  • Introduced a safe_join helper function that lexically parses the requested key using std::path::Component.
  • The helper explicitly rejects ParentDir (..) and Windows Prefix (e.g., C:) components.
  • It safely ignores RootDir (/) and CurDir (.), and correctly appends Normal components to the base storage path.
  • If a traversal is detected, the handlers now safely return a 403 Access Denied response.
  • Added comprehensive unit tests to ensure that safe_join behaves securely under various edge cases.

توضیحات فارسی

این PR یک آسیب‌پذیری امنیتی خطرناک از نوع Path Traversal (پیمایش پوشه‌ها) را در هندلرهای مربوط به فایل‌ها (شامل get_object، head_object، put_object و delete_object) برطرف می‌کند.

مشکل چه بود؟
پیش از این، در کدها از دستور storage.join(key.trim_start_matches('/')) استفاده می‌شد. اگر یک کلاینت، کلید مخربی حاوی کاراکترهای بازگشتی (مثلاً ../../etc/passwd) ارسال می‌کرد، مسیر نهایی می‌توانست از پوشه اصلی باکت خارج شود. این موضوع اجازه می‌داد تا هر فایلی در کل سیستم‌عامل سرور بدون دسترسی مجاز خوانده، بازنویسی و یا حذف شود.

راه حل اعمال شده:

  • یک تابع کمکی به نام safe_join اضافه شد که کلید درخواستی را با استفاده از کتابخانه پایه std::path::Component به صورت امن تحلیل می‌کند.
  • این تابع صراحتاً اجزای ParentDir (یعنی ..) و پیشوندهای ویندوزی (مثل C:) را کاملاً مسدود می‌کند.
  • اجزای خنثی مثل RootDir (/) و CurDir (.) را به درستی نادیده می‌گیرد و فقط مسیرهای معتبر را به مسیر اصلی باکت متصل می‌کند.
  • در صورتی که تلاش برای پیمایش غیرمجاز تشخیص داده شود، هندلرها خطای امنیتی 403 Access Denied را برمی‌گردانند.
  • مجموعه‌ای از Unit Testها اضافه شد تا اطمینان حاصل شود که تابع safe_join در شرایط مختلف و در برابر ورودی‌های عجیب، به درستی و با امنیت کامل کار می‌کند.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant