Mass Assignment Vulnerability
Mass Assignment

سلام بچه‌ها، امیدوارم حالتون خوب باشه. امروز می‌خوایم یکی از آسیب‌پذیری‌هایی رو بررسی کنیم که در بسیاری از وب‌اپلیکیشن‌های مدرن دیده میشه و در صورت وجود می‌تونه Impact قابل توجهی داشته باشه. این آسیب‌پذیری Mass Assignment نام داره.

Mass Assignment چیست؟

اگر بخوام خیلی خلاصه توضیح بدم:

Mass Assignment زمانی رخ می‌دهد که مهاجم بتواند فیلدهای حساس سمت سرور را که نباید توسط کاربر قابل تغییر باشند، از طریق درخواست خود تغییر دهد.

اما این تعریف به تنهایی کافی نیست.

تعریف دقیق‌تر:

Mass Assignment زمانی رخ می‌دهد که برنامه داده‌های ورودی کاربر را بدون محدودسازی مناسب به Object یا Model سمت سرور نگاشت (Map) کند. در چنین شرایطی، اگر Object یا Model دارای فیلدهای حساسی باشد که توسعه‌دهنده آن‌ها را فیلتر نکرده باشد، مهاجم می‌تواند این فیلدها را در درخواست خود قرار داده و مقدار آن‌ها را تغییر دهد.

برای مثال فیلدهایی مانند:

چرا این آسیب‌پذیری رخ می‌دهد؟

در وب‌اپلیکیشن‌های مدرن، Frameworkها و ORMها قابلیت‌هایی را در اختیار توسعه‌دهندگان قرار می‌دهند که داده‌های ارسالی کاربر را مستقیماً به Modelهای سمت سرور متصل می‌کنند. هدف این قابلیت‌ها:

استفاده از این قابلیت‌ها ذاتاً مشکل امنیتی محسوب نمی‌شود. مشکل زمانی ایجاد می‌شود که توسعه‌دهنده مشخص نکند کدام فیلدها مجاز به تغییر هستند. در نتیجه هر فیلدی که در Model وجود داشته باشد ممکن است توسط داده‌های ورودی کاربر مقداردهی شود.

یک مثال ساده

فرض کنید در سمت سرور Model زیر وجود دارد:

User
- username
- email
- isAdmin

کاربر از طریق فرم پروفایل فقط مجاز است نام کاربری و ایمیل خود را تغییر دهد. اما توسعه‌دهنده کل داده‌های دریافتی را مستقیماً به Model متصل می‌کند. در نتیجه اگر کاربر فیلد حساس isAdmin را نیز به درخواست خود اضافه کند و برنامه آن را فیلتر نکند، مقدار این فیلد نیز تغییر خواهد کرد. در این حالت مهاجم موفق شده است فیلدی را که نباید در اختیار او باشد کنترل کند. این دقیقاً همان مفهوم Mass Assignment است.

Attack Surface

هنگام بررسی Mass Assignment باید تمامی Endpointهایی را که داده‌های کاربر را دریافت کرده و در Object یا Model سمت سرور ذخیره یا به‌روزرسانی می‌کنند بررسی کنیم.

Mass Assignment Vulnerability

نقاط مهم:

چه چیزهایی را باید بررسی کنیم؟

فیلدهای اضافی را به Request Body اضافه کنید و رفتار برنامه را بررسی کنید.

فیلدهای حساس رایج:

همچنین باید فیلدهای موجود در Responseها و Endpointهای دیگر را با فیلدهای قابل ارسال مقایسه کنید. بسیاری از موارد Mass Assignment از همین طریق کشف می‌شوند.

Impact

در صورت موفقیت، مهاجم ممکن است بتواند:

Mitigation

برای جلوگیری از Mass Assignment:

Mass Assignment Checklist

  1. پیدا کردن Endpointهای Create (POST)
  2. پیدا کردن Endpointهای Update (PUT/PATCH)
  3. شناسایی منابع حساس (User، Profile، Team، Billing و ...)
  4. استخراج فیلدهای موجود در Requestها (A)
  5. استخراج فیلدهای موجود در Responseها و Endpointهای دیگر (B)
  6. مقایسه A و B
  7. شناسایی فیلدهای مخفی
  8. اضافه کردن فیلدهای کشف‌شده به Requestها
  9. بررسی پذیرش داده توسط سرور
  10. بررسی ذخیره شدن داده
  11. تست فیلدهای حساس رایج
  12. بررسی Impact نهایی

جمع‌بندی

Mass Assignment یکی از آسیب‌پذیری‌هایی است که معمولاً به دلیل راحتی توسعه و نبود محدودسازی مناسب روی Model Binding ایجاد می‌شود. هر Endpointی که داده‌های کاربر را دریافت کرده و در سمت سرور ذخیره یا به‌روزرسانی می‌کند می‌تواند یک نقطه مناسب برای بررسی این آسیب‌پذیری باشد. به همین دلیل هنگام تست APIها همیشه فیلدهای قابل مشاهده در Requestها، Responseها و سایر Endpointها را با یکدیگر مقایسه کنید؛ زیرا بسیاری از موارد Mass Assignment دقیقاً از همین اختلاف‌ها کشف می‌شوند.