The Tutor LMS – eLearning and online course solution plugin for WordPress is vulnerable to unauthorized private course enrollment in all versions up to, and including, 3.9.7. This is due to missing post_status validation in the `enroll_now()` and `course_enrollment()` functions. Both enrollment endpoints verify the nonce, user authentication, and whether the course is purchasable, but fail to check if the course has a `private` post_status. This makes it possible for authenticated attackers with Subscriber-level access or above to enroll in private courses by sending a crafted POST request with the target course ID. The enrollment record is created in the database and the private course title and enrollment status are exposed in the subscriber's dashboard, though WordPress core access control prevents the subscriber from viewing the actual course content (returns 404). Enrollment in private courses should be restricted to users with the `read_private_posts` capability.
Tutor LMS plugin versions up to 3.9.7 contain an authorization bypass vulnerability allowing authenticated subscribers to enroll in private courses. While WordPress core prevents content access, the vulnerability exposes private course metadata and creates unauthorized enrollment records. This affects educational institutions and organizations using Tutor LMS for restricted course delivery in Saudi Arabia.
IMMEDIATE ACTIONS:
1. Audit all Tutor LMS installations to identify private courses and current enrollments
2. Review enrollment logs for unauthorized access to private courses
3. Disable course enrollment functionality if not immediately patchable
COMPENSATING CONTROLS (until patch available):
1. Implement WordPress role-based access control: restrict Subscriber role capabilities
2. Add custom code to validate post_status in enrollment functions before processing
3. Deploy Web Application Firewall (WAF) rules to block POST requests to enrollment endpoints from non-privileged users
4. Implement database-level triggers to flag unauthorized private course enrollments
5. Use WordPress security plugins to add additional capability checks
DETECTION RULES:
1. Monitor wp_postmeta table for enrollment records where post_status='private'
2. Alert on POST requests to /wp-admin/admin-ajax.php with actions 'enroll_now' or 'course_enrollment' from Subscriber-level users
3. Track database INSERT operations on course enrollment tables with private course IDs
4. Monitor WordPress audit logs for enrollment activity on courses with private status
PATCHING GUIDANCE:
1. Contact Tutor LMS support for security patch timeline
2. Prepare staging environment for immediate patching once available
3. Implement change management process for plugin updates
4. Test thoroughly before production deployment
الإجراءات الفورية:
1. تدقيق جميع تثبيتات Tutor LMS لتحديد الدورات الخاصة والتسجيلات الحالية
2. مراجعة سجلات التسجيل للوصول غير المصرح به إلى الدورات الخاصة
3. تعطيل وظيفة التسجيل في الدورات إذا لم يكن من الممكن إصلاحها فوراً
الضوابط التعويضية (حتى توفر الإصلاح):
1. تنفيذ التحكم في الوصول القائم على الأدوار في WordPress: تقييد قدرات دور المشترك
2. إضافة رمز مخصص للتحقق من post_status في وظائف التسجيل قبل المعالجة
3. نشر قواعد جدار الحماية لتطبيقات الويب (WAF) لحظر طلبات POST لنقاط نهاية التسجيل من المستخدمين غير المميزين
4. تنفيذ محفزات على مستوى قاعدة البيانات لتحديد التسجيلات غير المصرح بها في الدورات الخاصة
5. استخدام مكونات أمان WordPress لإضافة فحوصات قدرة إضافية
قواعد الكشف:
1. مراقبة جدول wp_postmeta للبحث عن سجلات التسجيل حيث post_status='private'
2. تنبيه على طلبات POST إلى /wp-admin/admin-ajax.php مع إجراءات 'enroll_now' أو 'course_enrollment' من مستخدمي مستوى المشترك
3. تتبع عمليات INSERT في قاعدة البيانات على جداول التسجيل في الدورات برموز دورات خاصة
4. مراقبة سجلات تدقيق WordPress لنشاط التسجيل في الدورات ذات الحالة الخاصة
إرشادات الإصلاح:
1. الاتصال بدعم Tutor LMS لمعرفة الجدول الزمني لإصلاح الأمان
2. تحضير بيئة التجريب للإصلاح الفوري عند توفره
3. تنفيذ عملية إدارة التغيير لتحديثات المكون
4. الاختبار الشامل قبل نشر الإنتاج