
إثباتات مفهوم لاستغلال ثغرات مجموعة Wazuh CVE-2026-25769 وCVE-2026-25770، توضح تنفيذ التعليمات البرمجية عن بُعد ورفع الامتيازات عبر إلغاء التسلسل غير الآمن واستبدال الملفات.
تحذير: يحتوي هذا المستودع على معلومات ورمز متعلق بثغرات أمنية. استخدمه فقط للأغراض التعليمية أو في بيئات مصرح بها.
تم تحديد ثغرتين حرجتين في إعداد مجموعة Wazuh (الإصدارات ≥ 4.0.0). تؤثر هذه العيوب على النشرات التي تستخدم عقدًا متعددة لقابلية التوسع الأفقي، وموازنة التحميل، والتوافر العالي. يسمح هذا الإعداد بإدارة عدة وكلاء دون التأثير على خادم Wazuh.
يسمح بالاتصال بين العقدة الرئيسية والعاملة عبر طلب DAPi. ترسل العقدة العاملة كائنًا باستخدام وحدة LocalClient الخاصة بها؛ تقبل العقدة الرئيسية الرسالة وتقوم بإلغاء تسلسل الكائن باستخدام الدالة الضعيفة as_wazuh_object()، مما يسمح بتنفيذ أوامر على العقدة الرئيسية.
تكمل هذه الثغرة السابقة، مما يسمح بتنفيذ الأوامر باستخدام وسمي <command> و <localfile>. يمكن للمهاجم تنفيذ أوامر في كل مرة يتم فيها تحميل ملف الإعداد /var/ossec/etc/ossec.conf.
كلاهما يسمح بـ [تأثير عام: تصعيد الامتيازات، تنفيذ عن بُعد، إلخ.] في البيئات التي تستخدم وظيفة المجموعة.
مدير Wazuh ≥ 4.0.0 (حتى الإصدار المُصحح X.Y.Z)
جميع العقد ذات الدور master أو worker التي لديها اتصال بين العقد مفعّلًا.
يُستخدم إعداد المجموعة في النشرات التي تحتوي على عدد كبير من الوكلاء. يسمح بـ:
التوسع الأفقي: إضافة المزيد من العقد العاملة لتوزيع الحمل.
التوافر العالي: إذا فشلت عقدة عاملة، تستمر العقد الأخرى في العمل حتى تتم استعادة العقدة.
موازنة التحميل: يتم توزيع الوكلاء بين العقد العاملة.
هذه البنية، إذا لم تكن مؤمّنة بشكل مناسب، يمكن أن تعرّض لأسطح هجوم مثل تلك الموثقة هنا.
تستدعي العقدة الرئيسية هذه الدالة، التي تسمح بإنشاء عملية فرعية تنفذ أوامر بشكل تعسفي.
def as_wazuh_object(dct: Dict):
try:
if '__callable__' in dct:
encoded_callable = dct['__callable__']
funcname = encoded_callable['__name__'] #getoutput
if '__wazuh__' in encoded_callable:
# Encoded Wazuh instance method.
wazuh = Wazuh()
return getattr(wazuh, funcname)
else:
# Encoded function or static method.
qualname = encoded_callable['__qualname__'].split('.') # getoutput
classname = qualname[0] if len(qualname) > 1 else None
module_path = encoded_callable['__module__'] # subprocess
module = import_module(module_path) # ARBITRARY IMPORT
if classname is None:
return getattr(module, funcname) # RETURNS ARBITRARY FUNCTION
else:
return getattr(getattr(module, classname), funcname)
يقوم بروتوكول مجموعة Wazuh (TCP/1516) بمزامنة الملفات بين العقد باستخدام العملية. تعمل هذه العملية كمستخدم غير مميز، وتقبل عناوين نسبية.
"""Create a file descriptor to store the incoming file.
Parameters
----------
data : bytes
Relative path to the file.
Returns
-------
bytes
Result.
bytes
Response message.
"""
# VULNERABLE LINE: No validation of 'data', no checking for '../', direct file open.
self.in_file[data] = {'fd': open(common.WAZUH_PATH + data.decode(), 'wb'), 'checksum': hashlib.sha256()}
return b"ok ", b"Ready to receive new file"
باستخدام هذا الإعداد، يمكن للمهاجم الكتابة فوق دليل الإعداد والوصول إلى تنفيذ الأوامر.
يمكن للمهاجم:
التأثير على السرية والنزاهة والتوافر وتصعيد الامتيازات.
المساس بنزاهة البنية التحتية المراقبة بأكملها.
تم تطوير إثباتات المفهوم الأصلية بواسطة vikman90 وكانت بمثابة الأساس لهذا التحليل. فيما يلي مثال على الاستغلال:
# 1. init docker compose
docker compose up -d
# 2. wait init all clusters
# 3. Verify cluster is connected
docker exec poc-master /var/ossec/bin/cluster_control -l
# Expected output should show worker01 connected:
# worker01 172.28.0.11 active
# 4. Execute exploit from worker
docker exec poc-worker /var/ossec/framework/python/bin/python3 /scripts/poc.py
# 5. Verify RCE on master
docker exec poc-master cat /var/ossec/etc/ossec.conf