
تعمق في ثغرة حقن SQL حرجة في Ormar ORM الخاص بلغة بايثون — إعادة الإنتاج، الإصلاح، والاختبارات
تحليل معمّق لثغرة حقن SQL حرجة (CVSS 9.8) في ORM غير متزامن بلغة Python، مع إعادة الإنتاج والتحليل والإصلاح.
Ormar هو ORM مصغّر غير متزامن شائع للغة Python، يُستخدم عادةً مع FastAPI وStarlette. الإصدارات 0.9.9 حتى 0.22.0 تحتوي على ثغرة حقن SQL في طريقتي التجميع min() وmax().
السبب الجذري هو خطأ "تنفيذ جزئي": بينما تتحقق sum() وavg() من أن معامل العمود يشير إلى حقل رقمي فعلي، تتخطى min() وmax() هذا الفحص تمامًا وتمرّر إدخال المستخدم مباشرةً إلى sqlalchemy.text() — وهو نقطة استقبال SQL خام.
يمكن للمهاجم حقن استعلام فرعي كمعامل "العمود":
# الاستخدام المتوقع
await Item.objects.max("price") # → SELECT max(price) FROM items
# حمولة الهجوم
await Item.objects.max("(SELECT password FROM users LIMIT 1)")
# → SELECT max((SELECT password FROM users LIMIT 1)) FROM items
# يُرجع كلمة مرور المسؤول!
| السمة | القيمة |
|---|---|
| معرف CVE | CVE-2026-26198 |
| درجة CVSS | 9.8 (حرجة) |
| CWE | CWE-89: حقن SQL |
| المتأثر | ormar 0.9.9 – 0.22.0 |
| تم الإصلاح في | ormar 0.23.0 |
| تاريخ النشر | 24 فبراير 2026 |
| هل يتطلب مصادقة؟ | لا — بدون مصادقة |
├── README.md ← أنت هنا
├── vulnerable_app.py ← تطبيق FastAPI مصغّر بالنمط القابل للاستغلال
├── exploit_demo.py ← إثبات مفهوم آمن يُظهر الحقن أثناء العمل
├── patched_app.py ← النسخة المُصلحة مع التحقق من الإدخال
├── test_vulnerability.py ← اختبارات تُثبت وجود الثغرة وفعالية الإصلاح
├── requirements.txt
└── analysis/
└── root_cause.md ← تحليل تفصيلي على مستوى الكود للسبب الجذري
git clone https://github.com/YOUR_USERNAME/CVE-2026-26198-analysis.git
cd CVE-2026-26198-analysis
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# تشغيل الاختبارات (لا حاجة لقاعدة بيانات خارجية — يستخدم SQLite)
python -m pytest test_vulnerability.py -v
# تشغيل العرض التوضيحي التفاعلي للاستغلال
python exploit_demo.py
يتحقق الإصلاح من أن معامل العمود يطابق حقلًا فعليًا في النموذج قبل وصوله إلى sqlalchemy.text(). يتم ذلك عبر نهج القائمة البيضاء: يُسمح فقط بأسماء الأعمدة الموجودة في تعريفات حقول النموذج.
راجع patched_app.py للتنفيذ وanalysis/root_cause.md للتحليل الكامل.
sum()/avg() كانتا مُتحقَّق منهما بينما min()/max() لم تكونا خلقت شعورًا زائفًا بالأمان.MIT