# 🔐 عرض توضيحي لكسر التحكم في الصلاحيات على مستوى الكائنات (BOLA)
## تحليل ثغرة CVE-2023-27524 وإصلاحها
---
## 📌 نظرة عامة على المشروع
يعرض هذا المشروع ثغرة واقعية من نوع **كسر التحكم في الصلاحيات على مستوى الكائنات (BOLA)** وكيفية معالجتها بشكل آمن باستخدام واجهة برمجة تطبيقات (API) مبنية على Flask.
الثغرة مصممة على غرار **CVE-2023-27524**، والتي تنطوي على ضوابط تفويض غير سليمة تسمح للمهاجمين بالوصول إلى كائنات غير مصرح بها أو التلاعب بها عن طريق تعديل معرّفات الكائنات (IDs) في طلبات API.
يتضمن هذا المستودع:
- ❌ vulnerable_api.py: نسخة هشّة من الـ API
- ✅ fixed_vulnerable_api.py: نسخة آمنة بعد الإصلاح تطبّق تحكمًا سليمًا في الصلاحيات على مستوى الكائنات
---
## ⚠️ ما هي BOLA؟
تحدث ثغرة **كسر التحكم في الصلاحيات على مستوى الكائنات (BOLA)** عندما:
- يكشف التطبيق معرّفات الكائنات (مثل `/profile?id=2`)
- يفشل في التحقق من أن المستخدم المصادق عليه مخوّل للوصول إلى ذلك الكائن
### 🔴 الأثر:
يمكن للمهاجمين:
- الوصول إلى البيانات الخاصة لمستخدمين آخرين
- تعديل أو حذف الموارد غير المصرح بها
- تنفيذ تصعيد صلاحيات أفقي
---
## 💥 التنفيذ الهشّ (غير الآمن)
### مثال (كود هشّ)
```python
@app.route('/profile')
def profile():
user_id = request.args.get("id")
return users.get(int(user_id))
```
### ❌ المشكلة:
* لا يوجد أي تحقق من المصادقة
* لا يوجد أي تحقق من ملكية الكائن
* المعرّف الذي يتحكم به المستخدم يصل مباشرةً إلى كائنات قاعدة البيانات
### 🔓 سيناريو الاستغلال:
```
/profile?id=1 → Alice data
/profile?id=2 → Bob data (unauthorized access)
```
---
## 🔒 التنفيذ الآمن بعد الإصلاح
### مثال (كود آمن)
```python
@app.route('/profile')
def profile():
requested_id = int(request.args.get("id", session["user_id"]))
# Object-level authorization check
if requested_id != session["user_id"]:
return "403 Forbidden - Access Denied", 403
return users.get(requested_id)
```
---
## ✅ الإصلاح الأمني المُطبَّق
يمنع هذا التنفيذ ثغرة BOLA عبر فرض:
✔ مصادقة تعتمد على الجلسات
✔ التحقق من ملكية الكائن
✔ عمليات التحقق من التفويض على جانب الخادم
✔ منع هجمات العبث بالمعرّفات
---
## 🧠 الدرس الأمني الأساسي
> لا تثق أبدًا بمعرّفات الكائنات التي يقدمها المستخدم دون التحقق من التفويض على جانب الخادم.
المصادقة وحدها ليست كافية — **يجب فرض التفويض على مستوى الكائن.**
---
## 📊 تدفق الهجوم مقابل التدفق الآمن
### ❌ التدفق الهشّ:
```
User → API Request (/profile?id=2) → Direct DB Access → Data Leak
```
### ✅ التدفق الآمن:
```
User → API Request → Session Check → Ownership Validation → Allowed/Denied
```
---
## 🧪 طريقة التشغيل
### 1. تثبيت الاعتماديات
```bash
pip install flask
```
### 2. تشغيل التطبيق
```bash
python fixed_vulnerable_api.py or vulnerable_api.py
```
### 3. الوصول إلى التطبيق
```
http://127.0.0.1:5000
```
---
## 📁 بنية المشروع
```
api-bola-demo/
│
├── vulnerable_api.py # insecure version
├── fixed_vulnerable_api.py # Fixed BOLA version
└── README.md
```