
ماسح عالي الدقة لثغرة CVE-2026-41940 (تجاوز المصادقة في cPanel وWHM)
ماسح عالي الدقة لتجاوز المصادقة في cPanel/WHM المتتبع باسم CVE-2026-41940. يحدد المضيفات المعرّضة دون إنتاج السلبيات الكاذبة الشائعة في إثباتات المفهوم والكشوفات العامة، ودون تفعيل آليات قفل الحساب وقائمة السماح لعناوين IP الجذر التي تعيق الفحص الساذج.
تتضمن الأداة أيضًا سلسلة استغلال منفصلة اختيارية من العائلة نفسها لثغرة
اجتياز المسار في CalDAV على cpdavd (المنفذ 2079 نصي / 2080 TLS) —
CVE-2026-29205 —
تتيح لمهاجم عن بُعد قراءة ملفات عشوائية بصلاحيات root
بمجرد نجاح خطوة إعداد صغيرة عبر SMTP. يصلح cPanel 11.134.0.26 الخلل الأساسي
في عمر RAII، فأصبحت القراءة الآن تُنفَّذ بصلاحيات مالك الحساب غير المميز؛
الاجتياز نفسه ما يزال يصل إلى cpdavd لكنه لا يمكنه التصعيد إلى ما يتجاوز
ما يمكن لذلك الحساب قراءته أصلًا. سلسلة CalDAV مُقيَّدة خلف
--exploit وهي معطّلة افتراضيًا لأنها ترسل رسائل بريد إلكتروني حقيقية
وتقرأ ملفات من أهداف مؤكدة — انظر قسم
وضع الاستغلال (نشط).
معظم الكشوفات العامة لـ CVE-2026-41940 تتشارك ثلاث مشكلات. يعالج هذا الماسح كل واحدة منها.
يمكنك قراءة تدوينتنا حول تقنية الكشف هذه هنا: https://slcyber.io/research-center/high-fidelity-check-for-the-cpanel-authentication-bypass-cve-2026-41940/
تثبّت تهيئة Apache الخاصة بكل vhost في cPanel قاعدة ProxyPass تعيد توجيه
/___proxy_subdomain_whm إلى 127.0.0.1:2086 و/___proxy_subdomain_cpanel
إلى 127.0.0.1:2080 بغض النظر عن ترويسة Host في الطلب. تعمل
RewriteCond فقط على تقييد قاعدة إعادة الكتابة التي تربط النطاق الفرعي للإدارة
بمسار البروكسي؛ أما ProxyPass نفسها فهي غير مشروطة. الوصول إلى هذه المسارات على أي vhost
يخدمه Apache مُدار بواسطة cPanel يصل إلى نفس الخلفية المعرّضة مثل منافذ الإدارة.
الماسحات التي تفحص المنافذ 2082/2083/2086/2087 فقط ستبلغ أن المضيف غير معرّض عندما تكون هذه المنافذ محمية بجدار ناري، رغم أن الثغرة قابلة للوصول بالكامل عبر 443. يفحص هذا الماسح المنافذ 2087 و2083 ومساري البروكسي على 443 افتراضيًا.
يأتي cPanel مع cphulkd، الذي يقفل الحسابات بعد عدد صغير من محاولات كلمة
المرور الفاشلة، وauthorized_whm_root_ips، الذي يقيّد تسجيلات دخول الجذر
بقائمة مُهيأة من عناوين المصدر. الماسح الذي يستغل التجاوز بمحاولة حقن جلسة
لـ root سوف:
يتجنب هذا الماسح المشكلتين على جانب WHM بحقن expired=1 في حمولة الجلسة
تحت اسم مستخدم مولّد عشوائيًا. يُتحقق من حقن الجلسة بزيارة عنوان
cpsessXXXX الناتج ومطابقة msg_code:[expired_session] في نص الاستجابة،
وهو موجود فقط عند نجاح الحقن. لا يُستهدف أي حساب حقيقي، لذا لا يمكن قفل أي
حساب حقيقي، وتصبح قائمة سماح الجذر غير ذات صلة لأنه لا تُحاول أي عملية تسجيل
دخول كجذر.
يتطلب خفي cPanel (cpaneld، المنفذ 2083 ومسار /___proxy_subdomain_cpanel)
أن يطابق اسم المستخدم المُقدَّم حساب cPanel موجودًا على القرص
(-f /var/cpanel/users/$user). لن يرضي اسم المستخدم root هذا الفحص أبدًا
لأن root مستخدم نظام وليس مستخدم cPanel. الكشوفات التي تجرّب root فقط
تنتج سلبيات كاذبة على هذا السطح. يستخدم هذا الماسح قائمة كلمات قابلة للتهيئة
من أسماء مستخدمي cPanel الشائعة ضد سطح cPanel، ويعود إلى مسار اسم المستخدم
العشوائي على سطح WHM، الذي لا يخضع لمثل هذا القيد.
لكل هدف، ينفذ الماسح الخطوات التالية لكل سطح:
GET /login واقرأ ترويسة Set-Cookie إما لـ
whostmgrsession (WHM) أو cpsession (cPanel). تحتوي الكوكي على
مكوّن اسم جلسة مفصول بفواصل.GET / مع ترويسة Authorization: Basic التي قيمتها المفكوكة هي
<user>:\xff\nexpired=1. الجزء \nexpired=1 في النهاية هو حمولة حقن
الجلسة. تُعاد كوكي الجلسة من الخطوة 1 كما هي دون تعديل.Location من الاستجابة واستخرج رمز cpsessXXXX.GET /<cpsessXXXX>/ مع الكوكي الأصلية وابحث عن
msg_code:[expired_session] في النص. وجوده يثبت نجاح حقن الجلسة
وأن المضيف معرّض.في WHM (المنفذ 2087 ومسار /___proxy_subdomain_whm على 443)، يكون اسم
المستخدم u عشوائيًا متبوعًا بعشرة أحرف سداسية عشرية. في cPanel (المنفذ 2083
ومسار /___proxy_subdomain_cpanel على 443)، يجتاز الماسح قائمة كلمات
أسماء المستخدمين ويتوقف عند أول تطابق.
افتراضيًا، يفحص الماسح المنافذ 2087 و2083 و443 بهذا الترتيب ويتوقف فور تأكيد أي سطح لوجود الثغرة.
--exploit)CVE-2026-29205 — تحديث أمان cPanel/WHM WP2 بتاريخ 13 مايو 2026. أُصلح في cPanel 11.134.0.26. تتتبع النشرة الإرشادية نفس انحدار إسقاط الصلاحيات في
cpdavdالذي تسيء استخدامه سلسلة الاستغلال هذه.
الشرح الكامل للثغرة وسلسلة الاستغلال: https://slcyber.io/research-center/new-age-of-collisions-reading-arbitrary-files-pre-auth-as-root-in-cpanel-cve-2026-29205
cpdavd على المنفذين 2079 (HTTP نصي) و2080 (TLS) يثق في مسار
<principal>/<collection>/... الذي يبنيه عند تقديم موارد CalDAV/CardDAV.
من خلال صياغة طلب يرمّز مكوّن مساره إلى مقاطع .. وتوجيهه إلى مجلد maildir
الذي يرمّز اسمه على القرص أيضًا إلى اجتياز (x-attachment-1-y)، يمكن إجبار
cpdavd على قراءة أي ملف على القرص بصلاحيات root، بغض النظر عن الملكية أو
الأذونات — بما في ذلك /etc/shadow و/etc/passwd ومخازن البريد لكل مستخدم.
فشل الدفاع المتعمق الذي كان من المفترض أن يُسقط الصلاحيات إلى مالك الحساب قبل
القراءة بصمت: أُنشئ كائن Cpanel::AccessIds::ReducedPrivileges في سياق void،
لذا استعاد مدمّره صلاحيات root قبل تنفيذ القراءة. يربط cPanel 11.134.0.26
الكائن بمتغير معجمي my $privs فيبقى حيًا عبر سلسلة -f / stat / open /
read؛ لذلك على المضيفات المحدَّثة تُنفَّذ القراءة بصلاحيات مالك الحساب غير
المميز بدلاً من root.
يجب أن يكون المجلد المعرّض موجودًا على القرص قبل أن تنجح القراءة. ينشئ cPanel
تلقائيًا مجلدًا باسم .x-attachment-1-y للمستلم
<user>+x-attachment-1-y@<domain> في أول مرة يصل فيها بريد إلكتروني إلى ذلك
العنوان الفرعي. السلسلة إذن هي:
info وadmin
وwebmaster).<prefix>+x-attachment-1-y@<domain> إلى كل مرشح. يتم تتبع استجابات
RCPT TO المقبولة.GET لاجتياز المسار إلى cpdavd
على المنفذين 2080 (TLS) و2079 (نصي)، تحت بادئتي المجموعة /calendar/
و/addressbook/.النجاح يعيد بايتات الملف؛ ويسجّل الاكتشاف البريد الإلكتروني المستخدم والمجموعة وعدد البايتات وأول 200 بايت كمعاينة.
هذا الفحص معطّل ما لم يُمرَّر --exploit. عند تفعيله يتطلب مرحّل SMTP
صادر يعمل (انظر ملف الإعدادات أدناه) لأن خطوة إنشاء
المجلد لا يمكن تخطيها.
يعمل الاستغلال فقط ضد حسابات البريد الإلكتروني الافتراضية الحقيقية المكوّنة
ضمن ميزة Email Accounts في cPanel. عناوين الاستقبال الشامل لا تعمل — فالعنوان
الشامل يُوجَّه عبر موجّه system_aliases في Exim، ولا يصل أبدًا إلى
ناقل dovecot_virtual_delivery، وبالتالي لا يفعّل مسار
lda_mailbox_autocreate الذي ينتج مجلد .x-attachment-1-y/.
عندما تعرف مسبقًا بريدًا إلكترونيًا افتراضيًا صالحًا على الهدف، مرّره
مع --email:
python scanner.py --config scanner.ini --email [email protected] target.com
--email يتخطى تعداد SAN للشهادة وقائمة بادئات الرش بالكامل
ويرسل رسالة واحدة بالضبط إلى العنوان الذي زوّدته. يمكن تكراره
لاستهداف عدة حسابات معروفة. المسار الموجّه أكثر موثوقية بكثير من مسار الرش.
بدون --email، يلجأ الماسح إلى رش ~15 بادئة شائعة
(info، admin، webmaster، إلخ) لكل نطاق مستخرج من شهادة
TLS الخاصة بالمضيف. كان قياس Assetnote على عينة من 200 مضيف مكشوف عبر
cpdavd بمعدل إصابة ~10% للرش: النتيجة النظيفة من وضع الرش هي دليل ضعيف
على أن المضيف محدَّث، وإعادة التشغيل مع --email ضد حساب حقيقي هي الطريقة
الموثوقة الوحيدة للتأكيد.
يقرأ وضع الاستغلال ملف INI عبر --config:
python scanner.py --config scanner.ini --exploit example.com
انسخ scanner.ini.example إلى scanner.ini، واملأ بيانات اعتماد SMTP،
وضبط إعدادات CalDAV الافتراضية اختياريًا. scanner.ini موجود في .gitignore
لتبقى النسخة المعبأة محليًا. يمكن أيضًا توفير كلمة مرور SMTP عبر متغير البيئة
SCANNER_SMTP_PASSWORD، الذي له الأسبقية فقط عندما يكون حقل password
في الملف فارغًا.
pip install -r requirements.txt
يتطلب Python 3.8 أو أحدث.
هدف واحد:
python scanner.py example.com
أهداف متعددة عبر وسائط موضعية:
python scanner.py host-a.example.com host-b.example.com:2083
ملف أهداف، سطر واحد لكل هدف. الأسطر التي تبدأ بـ # تُتجاهل:
python scanner.py -f targets.txt
قراءة الأهداف من stdin:
cat targets.txt | python scanner.py
يمكن أن يكون الهدف اسم مضيف أو host:port. عندما يُحدَّد منفذ، يفحص الماسح
هذا المنفذ فقط؛ وإلا يفحص المنافذ 2087 و2083 و443.
-u, --users — أسماء مستخدمين مفصولة بفواصل لتجربتها على سطح cPanel.
الافتراضي هو قائمة مدمجة صغيرة.-U, --users-file — ملف يحتوي اسم مستخدم cPanel واحد في كل سطر.-p, --ports — منافذ مفصولة بفواصل لفحصها عندما لا يُحدَّد منفذ على
الهدف. الافتراضي 2087,2083,443.-t, --threads — خيوط لكل هدف تُستخدم لاجتياز قائمة أسماء المستخدمين ضد
سطح cPanel. الافتراضي 10.-c, --concurrency — عدد الأهداف المفحوصة بالتوازي. الافتراضي 20.-T, --timeout — مهلة زمنية لكل طلب بالثواني. الافتراضي 15.-o, --output — إلحاق الأهداف المعرّضة، سطر لكل هدف، بهذا الملف عند
اكتشافها.--json — كتابة سجل JSON Lines لكل هدف إلى هذا الملف.-q, --quiet — طباعة الأهداف المعرّضة فقط على stdout. لا تزال إخفاقات
الاتصال والأهداف النظيفة تُسجَّل في --json وتُحسب في الملخص.--no-progress — تعطيل شريط التقدم.يُكتب سطر واحد إلى stdout لكل اكتشاف، لذا فإن الهدف الذي يشغّل الفحصين سيُطبع مرتين:
[!] host cve-2026-41940 VULNERABLE (port 443)
[!] host caldav-traversal VULNERABLE via admin@host (read 1842b from /etc/passwd)
[+] host cve-2026-41940 NOT VULNERABLE
[?] host cve-2026-41940 CONNECTION FAILED
مخرجات --json هي سجل واحد لكل هدف مع مصفوفة findings:
{"target": "host", "status": "VULNERABLE", "findings": [
{"check": "cve-2026-41940", "status": "VULNERABLE", "detail": {"port": 443}},
{"check": "caldav-traversal", "status": "VULNERABLE",
"detail": {"email": "admin@host", "domain": "host", "collection": "calendar",
"file": "/etc/shadow", "bytes": 1218, "preview": "root:$6$..."}}
]}
status على المستوى الأعلى هو أسوأ حالة عبر جميع الاكتشافات.
يُكتب سطر ملخص بالإجماليات إلى stderr في النهاية. يُعرض شريط التقدم على stderr ويُكبت تلقائيًا عندما لا يكون stderr طرفية.
رمز الخروج هو 0 إذا كان أي هدف معرّضًا، و1 إذا كان كل هدف قابل للوصول
نظيفًا، و2 إذا تعذّر الوصول إلى أي هدف.
افحص قائمة أهداف، واكتب الإصابات إلى ملف، وابقَ هادئًا على stdout:
python scanner.py -f targets.txt -o vulnerable.txt -q
افحص بقائمة أسماء مستخدمين مخصصة على سطح cPanel، مع زيادة التوازي، ومخرجات JSON للمعالجة اللاحقة:
python scanner.py -f targets.txt -U cpanel-users.txt -c 100 --json results.jsonl
افحص مجموعة منافذ غير افتراضية:
python scanner.py -p 2083,2087,8443 -f targets.txt
شغّل سلسلة CalDAV من البداية إلى النهاية ضد هدف واحد مع الاحتياط بالرش عبر
البريد الإلكتروني (يتطلب scanner.ini معبأ):
python scanner.py --config scanner.ini --exploit example.com
استغلال موجّه ضد بريد إلكتروني افتراضي معروف — معدل إصابة أعلى بكثير من الرش:
python scanner.py --config scanner.ini --email [email protected] example.com
شغّل سلسلة CalDAV فقط ضد قائمة مضيفات cpdavd مؤكدة، مع تفريغ معاينات
/etc/passwd إلى JSON:
python scanner.py --config scanner.ini --caldav-only \
-f cpdavd-hosts.txt --json caldav-results.jsonl
الاستدعاء الافتراضي scanner.py <target> يشغّل كاشف CVE-2026-41940 فقط.
يرسل الطلبات اللازمة لتأكيد حقن الجلسة ولا شيء غير ذلك. لا يسجّل الدخول كمستخدم
حقيقي، ولا يستهدف حساب root، ولا يرقّي إلى شلّ، ولا يراكم أحداث كلمات مرور
فاشلة ضد أي حساب صالح على النظام المستهدف. العلامة التي يطابقها
(msg_code:[expired_session]) يولّدها التطبيق نفسه استجابةً لحقل الجلسة
المحقون expired=1، وهي نفس المؤشر الذي تستخدمه صفحة تسجيل دخول cPanel
الأصلية عند إعادة تشغيل جلسة منتهية بشكل مشروع.
تمرير --exploit (أو --caldav-only) يفتح سلسلة اجتياز المسار في CalDAV.
هذا لم يعد كاشفًا — إنه استغلال يعمل. عند التفعيل، سيقوم الماسح، لكل هدف
ينجح فيه تعداد النطاقات، بما يلي:
scanner.ini وإرسال رسالة
قصيرة واحدة لكل مستلم مرشح (عادة 10–15 لكل نطاق، و3 نطاقات لكل هدف)؛--read-file من كل هدف مؤكد.الملف الافتراضي هو /etc/shadow. القراءة الناجحة تعيد بايتات الملف؛ النص
الفارغ يشير إما إلى هدف غير قابل للوصول أو مضيف مطبَّق عليه إصلاح إسقاط
الصلاحيات (cPanel 11.134.0.26، my $privs = …). يقارن الكشف طول النص
المستلَم بالصفر، وليس Content-Length المُعلَن في الاستجابة (المشتق من
stat() على المسار الذي يختاره المهاجم، وسيكون معبأ حتى عندما يُرفض
open() اللاحق).
لاختبار إمكانية الوصول إلى الاجتياز بشكل مستقل عن إصلاح إسقاط الصلاحيات —
مثلًا عندما تريد معرفة ما إذا كان cpdavd قابلًا للوصول ومتطلب maildir
مستوفى على مضيف محدَّث — أعد التشغيل مع --read-file /etc/passwd.
/etc/passwd قابل للقراءة عالميًا لذا يعيد بايتات على المضيفين قبل التحديث
وبعده؛ الجمع بين الإشارتين (نص /etc/shadow موجود = قراءة جذر قبل التحديث؛
/etc/shadow فارغ + /etc/passwd موجود = الاجتياز قابل للوصول لكن إصلاح
إسقاط الصلاحيات مطبَّق) يصنّف المضيف بشكل لا لبس فيه.
تُكتب المحتويات ومعاينة من 200 بايت إلى مخرجات JSONL وتُطبع على stdout. يمكن أن يستغرق استغلال CalDAV لكل نطاق دقيقة أو أكثر — هذا هو سلم إعادة المحاولة بانتظار تسليم البريد، وليس تعليقًا.
شغّل --exploit فقط ضد أصول تملكها أو لديك إذن كتابي صريح لاختبارها.
يسجّل مرحّل SMTP المُهيأ وكل نظام بريد للمستلم حركة SMTP؛ وتُسجَّل قراءات
الملفات بواسطة cpdavd.
--exploit — تفعيل سلسلة اجتياز المسار في CalDAV. معطّل افتراضيًا؛
انظر وضع الاستغلال (نشط) للآثار الجانبية التي يفتحها
هذا العلم.--config — ملف INI يحتوي بيانات اعتماد مرحّل SMTP وإعدادات CalDAV
القابلة للضبط. انظر scanner.ini.example.--read-file — الملف المراد استخراجه عند نجاح سلسلة CalDAV.
يتجاوز القيمة في ملف الإعدادات. الافتراضي /etc/shadow — ملف للجذر فقط،
لذا القراءة الناجحة تفرّق بين ما قبل التحديث (يعيد محتوى shadow) وما بعده
(open مرفوض ونص الاستجابة فارغ ← يُبلَّغ NOT VULNERABLE). استخدم
--read-file /etc/passwd لاختبار إمكانية الوصول إلى الاجتياز دون التمييز
بين المضيف المحدَّث وغير المحدَّث.--caldav-only — تخطّي فحص 41940 وتشغيل سلسلة CalDAV فقط.
يستلزم --exploit. مفيد لإعادة تشغيل السلسلة ضد قائمة أهداف معروفة بأنها
قابلة للوصول عبر CalDAV.--email ADDR — حساب بريد إلكتروني افتراضي معروف على الهدف. يتخطى تعداد
SAN للشهادة وقائمة رش الكلمات؛ يرسل رسالة واحدة بالضبط إلى ADDR ويقرأ
مقابل ذلك principal. يمكن تكراره. يستلزم --exploit. انظر
الاستغلال الموجّه مقابل الاستغلال بالرش.-v, --verbose — إخراج تقدم لكل نطاق لسلسلة CalDAV
(قائمة SAN للشهادة، عدد الرش، سلم إعادة المحاولة).