
ثغرة BOLA/IDOR في osTicket ajax.tickets.php | الإفصاح المسؤول
ajax.tickets.phpانتهاك تفويض المستوى الكائن (BOLA): مرجع غير مباشر غير آمن للكائن (IDOR)
include/ajax.tickets.php← دالةviewField()
تم الإبلاغ بواسطة @JF0x0r · 27 مارس 2026
الحالة: تم الإصلاح - تم إصدار التصحيح في osTicket v1.17.8 / v1.18.4
| الحقل | التفاصيل |
|---|---|
| الثغرة | BOLA / IDOR (انتهاك تفويض المستوى الكائن) |
| الهدف | osTicket v1.18-git - commit 2570d69 |
| المكون | include/ajax.tickets.php |
| الدالة | viewField() - الأسطر 805–806 |
| نقطة النهاية | GET /scp/ajax.php/tickets/{ticket_id}/field/{field_id}/view |
| درجة CVSS 4.0 | 8.2 عالية - AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N |
| CWE | CWE-862 (فقدان التفويض)، CWE-639 (تجاوز التفويض عبر مفتاح يتحكم به المستخدم) |
| الحالة | ✅ تم الإصلاح — تم التصحيح في osTicket v1.17.8 و v1.18.4 |
أنا خوان فيليبي أوز (@JF0x0r)، باحث أمني شغوف بأمان المصادر المفتوحة. لا أفعل هذا من أجل المكافآت، بل أفعله لأنني أعتقد أن الأدوات التي يعتمد عليها الناس يجب أن تكون آمنة. عندما أجد شيئًا، أبلغ عنه بمسؤولية، وأوثقه بشكل صحيح، ثم أشاركه علنًا بمجرد إصلاحه.
أثناء إجراء مراجعة يدوية للكود للنظام الفرعي AJAX في osTicket، لاحظت شيئًا غير طبيعي في ajax.tickets.php. تتعامل دالة viewField() مع الطلبات لعرض بيانات حقول التذاكر - وهي تسترد كائن التذكرة وتتحقق من وجود الحقل. لكنها لا تتحقق أبدًا مما إذا كان الوكيل الطالب لديه الإذن بالوصول إلى تلك التذكرة.
لا يوجد checkStaffPerm(). لا يوجد التحقق من القسم. لا شيء.
هذا يعني أن أي وكيل موثّق، حتى لو كان مقيدًا بشكل صارم بقسم واحد، يمكنه قراءة حقول التذاكر من أي قسم آخر في النظام، فقط من خلال معرفة أو تخمين ticket_id و field_id. هذه أعداد صحيحة متسلسلة. من السهل تعدادها.
ما يجعل هذا واضحًا بشكل خاص هو المقارنة مع editField()، الدالة الشقيقة التي توجد فوقها مباشرة في نفس الملف. تقوم editField() بشكل صحيح باستدعاء $ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT) وتعيد HTTP 403 عند المخالفة. كان التصحيح مطبقًا بالفعل على عمليات الكتابة — ولكن لم يتم تطبيقه أبدًا على عمليات القراءة.
سجلت عرضًا توضيحيًا كاملاً للاستغلال من البداية إلى النهاية في بيئة مختبرية خاضعة للتحكم:
يسير الفيديو من خلال:
agent_a الموثّق مع وصول مقصور على Dept-A فقطيقوم سكربت exploit.py في هذا المستودع بأتمتة السلسلة الكاملة (المصادقة ← التعداد ← الوصول غير المصرح به إلى الحقل) وتم استخدامه أثناء التقييم لتأكيد أن المشكلة تتجاوز الاختبارات اليدوية.
ticket_id / field_id تجعل الكشط الجماعي تافهًاإدراج سطر واحد في viewField()، مباشرة بعد استرداد كائن التذكرة - يعكس تمامًا ما تفعله editField() بالفعل بشكل صحيح. التفاصيل التقنية الكاملة، والفرق، وتفصيل CVSS موجودة في التقرير المرفق.
📄 BOLA_IDOR_osTicket_Report_v2.pdf
أكد osTicket التقرير وقام بتنفيذ التخفيف عن طريق إضافة $ticket->checkStaffPerm($thisstaff) قبل حل/عرض الحقل المطلوب - مما يعكس التحقق الموجود بالفعل في editField(). يجب أن يكون للموظفين الآن وصول إلى التذكرة الأصلية قبل عرض بيانات الحقل.
يوصي osTicket بفترة ترقية قصيرة قبل مشاركة خطوات الاستغلال الكاملة علنًا. يتبع هذا المستودع هذه التوجيهات - انظر الجدول الزمني للإفصاح أدناه.
.
├── README.md # هذا الملف
├── BOLA_IDOR_osTicket_Report_v2.pdf # تقرير الإفصاح التقني الكامل
├── exploit.py # سكربت أتمتة إثبات المفهوم
└── PoC_osTicket.mov # نسخة محلية من فيديو العرض التوضيحي
أبلغت عن هذا بشكل خاص إلى فريق أمان osTicket قبل نشر أي شيء. تم جعل هذا المستودع عامًا فقط بعد انتهاء فترة الإفصاح المسؤول، والآن بعد أن تم إصدار التصحيح الرسمي، تتوفر الكتابة الكاملة. إذا كنت أحد القائمين على osTicket ولديك أسئلة، فلا تتردد في التواصل مباشرة عبر GitHub.
تم العثور عليه بواسطة @JF0x0r · أمان المصادر المفتوحة مهم.
| التفاصيل | المرجع |
|---|
| commit التصحيح | d590a9770d25159fb7741681f36e23a35f1fb5e9 |
| تم الإصلاح في | v1.17.8 · v1.18.4 |
| التنزيلات الرسمية | osticket.com/download |
| نوع الإصدار | إصدار أمني معجل |
| شكر وتقدير | خوان فيليبي أوز (@JF0x0r) |
| التاريخ | الحدث |
|---|
| 27 مارس 2026 | تم اكتشاف الثغرة وتوثيقها |
| 27 مارس 2026 | تم إرسال التقرير إلى [email protected] |
| 17 يونيو 2026 | أكد osTicket المشكلة وشارك تصحيح التخفيف للتحقق |
| 17 يونيو 2026 | أصدر osTicket v1.17.8 و v1.18.4 يحتويان على الإصلاح (commit d590a9770d25159fb7741681f36e23a35f1fb5e9) |
| — | تعيين CVE معلق عبر GitHub CNA |