مقدمه
در میان تمامی آسیبپذیریهای معرفیشده در OWASP API Security Top 10 2023، آسیبپذیری Broken Object Level Authorization یا BOLA در رتبه نخست قرار گرفته است. دلیل این موضوع نیز بسیار ساده است؛ این آسیبپذیری مستقیماً به کنترل دسترسی کاربران مربوط میشود و در صورت وجود، مهاجم میتواند به دادههای سایر کاربران دسترسی پیدا کند.
بسیاری از نشتهای اطلاعاتی بزرگ در سالهای اخیر نه به دلیل ضعف رمزنگاری یا حملات پیچیده، بلکه به دلیل وجود نقص BOLA در APIها رخ دادهاند.
BOLA چیست؟
BOLA زمانی رخ میدهد که API هنگام دسترسی به یک شیء (Object) تنها وجود آن را بررسی کند اما مالکیت یا مجوز دسترسی کاربر به آن شیء را اعتبارسنجی نکند.
به بیان ساده:
سیستم بررسی میکند که سفارش شماره 1001 وجود دارد، اما بررسی نمیکند آیا این سفارش متعلق به کاربر فعلی است یا خیر.
مثال ساده
فرض کنید کاربر وارد حساب خود شده است و درخواست زیر را ارسال میکند:
GET /api/orders/1001
Authorization: Bearer eyJ...
پاسخ:
{
"id": 1001,
"customer": "Ali",
"amount": 1200
}
حال مهاجم شناسه را تغییر میدهد:
GET /api/orders/1002
Authorization: Bearer eyJ...
اگر API تنها وجود سفارش را بررسی کند، اطلاعات کاربر دیگری نمایش داده خواهد شد.
چرا BOLA بسیار خطرناک است؟
این آسیبپذیری معمولاً منجر به موارد زیر میشود:
- افشای اطلاعات کاربران
- مشاهده اطلاعات مالی
- دسترسی به پروندهها و اسناد محرمانه
- دسترسی به اطلاعات پزشکی
- دسترسی به دادههای مشتریان سازمان
در بسیاری از موارد مهاجم حتی نیازی به دور زدن احراز هویت ندارد و تنها با تغییر یک شناسه میتواند اطلاعات دیگران را مشاهده کند.
مثال واقعی در سامانههای سازمانی
فرض کنید API زیر برای مشاهده نتیجه آزمایش طراحی شده است:
GET /api/results/123456
اگر تنها شناسه قبض بررسی شود و مالکیت آن اعتبارسنجی نشود، هر فردی با حدس یا کشف شناسههای معتبر میتواند نتایج سایر کاربران را مشاهده کند.
تفاوت BOLA و Broken Authentication
بسیاری از توسعهدهندگان این دو را با یکدیگر اشتباه میگیرند.
Broken Authentication
مشکل در فرآیند احراز هویت است.
مثال:
- توکن قابل حدس
- JWT ناامن
- Session ضعیف
BOLA
کاربر احراز هویت شده است اما به دادهای دسترسی پیدا میکند که متعلق به او نیست.
نشانههای وجود BOLA
موارد زیر معمولاً هشداردهنده هستند:
- استفاده از شناسههای ترتیبی
- عدم بررسی مالکیت رکورد
- نبود Authorization Middleware
- عدم ثبت رویدادهای دسترسی
- نمایش دادهها صرفاً بر اساس ID
نمونه کد آسیبپذیر در Laravel
public function show($id)
{
return Order::findOrFail($id);
}
در این مثال هر کاربری میتواند سفارش هر شناسهای را مشاهده کند.
نمونه کد ایمن
public function show($id)
{
return auth()->user()
->orders()
->findOrFail($id);
}
اکنون فقط سفارشهای متعلق به کاربر فعلی قابل مشاهده هستند.
استفاده از Policy در Laravel
یکی از بهترین روشها استفاده از Policy است.
public function view(User $user, Order $order)
{
return $order->user_id === $user->id;
}
و در Controller:
$this->authorize('view', $order);
این روش احتمال بروز خطا را به شدت کاهش میدهد.
روشهای شناسایی BOLA
تست دستی
شناسههای مختلف را در درخواستها تغییر دهید.
مثال:
/api/orders/1001
/api/orders/1002
/api/orders/1003
اگر اطلاعات سایر کاربران نمایش داده شود، آسیبپذیری وجود دارد.
تست نفوذ API
ابزارهای زیر کمک میکنند:
- Burp Suite
- OWASP ZAP
- Postman
- Insomnia
روشهای جلوگیری از BOLA
1. اعتبارسنجی مالکیت شیء
همیشه مالکیت داده را بررسی کنید.
2. استفاده از Authorization Layer
تمام Endpointها باید دارای کنترل دسترسی باشند.
3. استفاده از UUID
به جای شناسههای ترتیبی:
1001
1002
1003
از:
7a5ef4d2-f67f-4eb6-9f09-2f00d2ea7c9a
استفاده کنید.
البته UUID به تنهایی کافی نیست و باید همراه با کنترل دسترسی استفاده شود.
4. ثبت رویدادهای امنیتی
تمام دسترسیهای غیرمجاز باید ثبت و مانیتور شوند.
5. تست امنیتی در CI/CD
قبل از انتشار نسخه جدید، تستهای خودکار امنیتی اجرا شوند.
چکلیست سریع توسعهدهندگان
- آیا مالکیت رکورد بررسی میشود؟
- آیا از Policy یا Authorization استفاده شده است؟
- آیا کاربران فقط دادههای خود را مشاهده میکنند؟
- آیا لاگ دسترسی ثبت میشود؟
- آیا تست امنیتی برای تغییر شناسه انجام شده است؟
جمعبندی
Broken Object Level Authorization خطرناکترین آسیبپذیری APIها محسوب میشود زیرا مستقیماً به دادههای کاربران دسترسی پیدا میکند. هر API که بر اساس شناسه اشیاء عمل میکند باید علاوه بر احراز هویت، مالکیت و مجوز دسترسی به آن شیء را نیز بررسی کند. استفاده از Policyها، کنترل دسترسی مبتنی بر نقش و تستهای امنیتی منظم میتواند تا حد زیادی از بروز این آسیبپذیری جلوگیری کند.







افزودن نظر