سلام بچهها، امیدوارم حالتون خوب باشه. امروز میخوایم یکی از آسیبپذیریهایی رو بررسی کنیم که در بسیاری از وباپلیکیشنهای مدرن دیده میشه و در صورت وجود میتونه Impact قابل توجهی داشته باشه. این آسیبپذیری Mass Assignment نام داره.
Mass Assignment چیست؟
اگر بخوام خیلی خلاصه توضیح بدم:
Mass Assignment زمانی رخ میدهد که مهاجم بتواند فیلدهای حساس سمت سرور را که نباید توسط کاربر قابل تغییر باشند، از طریق درخواست خود تغییر دهد.
اما این تعریف به تنهایی کافی نیست.
تعریف دقیقتر:
Mass Assignment زمانی رخ میدهد که برنامه دادههای ورودی کاربر را بدون محدودسازی مناسب به Object یا Model سمت سرور نگاشت (Map) کند. در چنین شرایطی، اگر Object یا Model دارای فیلدهای حساسی باشد که توسعهدهنده آنها را فیلتر نکرده باشد، مهاجم میتواند این فیلدها را در درخواست خود قرار داده و مقدار آنها را تغییر دهد.
برای مثال فیلدهایی مانند:
roleisAdminpermissionsverifiedownerId
چرا این آسیبپذیری رخ میدهد؟
در وباپلیکیشنهای مدرن، Frameworkها و ORMها قابلیتهایی را در اختیار توسعهدهندگان قرار میدهند که دادههای ارسالی کاربر را مستقیماً به Modelهای سمت سرور متصل میکنند. هدف این قابلیتها:
- کاهش حجم کدنویسی
- افزایش سرعت توسعه
- جلوگیری از نوشتن کدهای تکراری
استفاده از این قابلیتها ذاتاً مشکل امنیتی محسوب نمیشود. مشکل زمانی ایجاد میشود که توسعهدهنده مشخص نکند کدام فیلدها مجاز به تغییر هستند. در نتیجه هر فیلدی که در Model وجود داشته باشد ممکن است توسط دادههای ورودی کاربر مقداردهی شود.
یک مثال ساده
فرض کنید در سمت سرور Model زیر وجود دارد:
User
- username
- email
- isAdmin
کاربر از طریق فرم پروفایل فقط مجاز است نام کاربری و ایمیل خود را تغییر دهد. اما توسعهدهنده کل دادههای دریافتی را مستقیماً به Model متصل میکند. در نتیجه اگر کاربر فیلد حساس isAdmin را نیز به درخواست خود اضافه کند و برنامه آن را فیلتر نکند، مقدار این فیلد نیز تغییر خواهد کرد. در این حالت مهاجم موفق شده است فیلدی را که نباید در اختیار او باشد کنترل کند. این دقیقاً همان مفهوم Mass Assignment است.
Attack Surface
هنگام بررسی Mass Assignment باید تمامی Endpointهایی را که دادههای کاربر را دریافت کرده و در Object یا Model سمت سرور ذخیره یا بهروزرسانی میکنند بررسی کنیم.
نقاط مهم:
- Create Endpoints (POST)
- Update Endpoints (PUT)
- Partial Update Endpoints (PATCH)
- Profile Settings Endpoints
- Registration Endpoints
- User Management Endpoints
- Admin Management Endpoints
- هر API که دادههای کاربر را مستقیماً به Modelهای سمت سرور نگاشت میکند
چه چیزهایی را باید بررسی کنیم؟
فیلدهای اضافی را به Request Body اضافه کنید و رفتار برنامه را بررسی کنید.
فیلدهای حساس رایج:
roleisAdminpermissionsuserTypeverifiedbalancecreditstatusownerIdaccountType
همچنین باید فیلدهای موجود در Responseها و Endpointهای دیگر را با فیلدهای قابل ارسال مقایسه کنید. بسیاری از موارد Mass Assignment از همین طریق کشف میشوند.
Impact
در صورت موفقیت، مهاجم ممکن است بتواند:
- سطح دسترسی خود را افزایش دهد (Privilege Escalation)
- به قابلیتهایی دسترسی پیدا کند که نباید در اختیار او باشند
- محدودیتهای منطقی برنامه را دور بزند (Business Logic Bypass)
- فیلدهای حساس سمت سرور را تغییر دهد
- به منابع سایر کاربران دسترسی پیدا کند یا روی آنها تأثیر بگذارد
Mitigation
برای جلوگیری از Mass Assignment:
- از Allowlist (Whitelist) برای Model Binding استفاده کنید.
- فقط فیلدهای مجاز را به Model نگاشت کنید.
- هرگز به فیلدهای حساس کنترلشده توسط کاربر اعتماد نکنید.
- مجوزها و سطح دسترسی را در سمت سرور اعتبارسنجی کنید.
- از تغییر مستقیم فیلدهای حساس مانند
role،isAdminوpermissionsجلوگیری کنید.
Mass Assignment Checklist
- پیدا کردن Endpointهای Create (POST)
- پیدا کردن Endpointهای Update (PUT/PATCH)
- شناسایی منابع حساس (User، Profile، Team، Billing و ...)
- استخراج فیلدهای موجود در Requestها (A)
- استخراج فیلدهای موجود در Responseها و Endpointهای دیگر (B)
- مقایسه A و B
- شناسایی فیلدهای مخفی
- اضافه کردن فیلدهای کشفشده به Requestها
- بررسی پذیرش داده توسط سرور
- بررسی ذخیره شدن داده
- تست فیلدهای حساس رایج
- بررسی Impact نهایی
جمعبندی
Mass Assignment یکی از آسیبپذیریهایی است که معمولاً به دلیل راحتی توسعه و نبود محدودسازی مناسب روی Model Binding ایجاد میشود. هر Endpointی که دادههای کاربر را دریافت کرده و در سمت سرور ذخیره یا بهروزرسانی میکند میتواند یک نقطه مناسب برای بررسی این آسیبپذیری باشد. به همین دلیل هنگام تست APIها همیشه فیلدهای قابل مشاهده در Requestها، Responseها و سایر Endpointها را با یکدیگر مقایسه کنید؛ زیرا بسیاری از موارد Mass Assignment دقیقاً از همین اختلافها کشف میشوند.