CVE-2022-46169
حقن أوامر بدون مصادقة
- تم النشر
- 05/12/2022
- محدث
- 21/10/2025
- تخصيص CNA
- GitHub_M
- الأدلة المرصودة
- 16/02/2023
CVSS الأساسي
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Hمرتفع · الثلاثين يومًا القادمة
- المئوية
- 100.0%
- تاريخ الموديل
- 21/09/2026
EPSS هو تقدير إحصائي، وليس يقينًا أو مقياسًا للتأثير. ادمجها مع CVSS وحالة KEV والتعرض وبيئتك.
CISA معروف باستغلاله
يظهر CVE هذا في كتالوج الثغرات الأمنية المعروفة بـ CISA.
ملخص
Cacti هي منصة مفتوحة المصدر توفر إطار عمل قويًا وقابلًا للتوسع لمراقبة التشغيل وإدارة الأعطال للمستخدمين. في الإصدارات المتأثرة، تسمح ثغرة حقن أوامر لمستخدم غير مصادق بتنفيذ كود عشوائي على خادم يشغّل Cacti، إذا تم تحديد مصدر بيانات معين لأي جهاز مراقَب. تقع الثغرة في ملف `remote_agent.php`. يمكن الوصول إلى هذا الملف دون مصادقة. تسترجع هذه الدالة عنوان IP الخاص بالعميل عبر `get_client_addr` وتحل هذا العنوان إلى اسم المضيف المقابل عبر `gethostbyaddr`. بعد ذلك، يتم التحقق من وجود إدخال داخل جدول `poller` يتوافق اسم مضيفه مع اسم المضيف الذي تم حله. إذا تم العثور على مثل هذا الإدخال، تُعيد الدالة `true` ويتم تفويض العميل. يمكن تجاوز هذا التفويض بسبب طريقة تنفيذ الدالة `get_client_addr`. الدالة معرّفة في الملف `lib/functions.php` وتفحص عدة متغيرات من `$_SERVER` لتحديد عنوان IP الخاص بالعميل. المتغيرات التي تبدأ بـ `HTTP_` يمكن ضبطها بشكل تعسفي من قبل المهاجم. وبما أنه يوجد إدخال افتراضي في جدول `poller` يحمل اسم مضيف الخادم الذي يشغّل Cacti، يمكن للمهاجم تجاوز المصادقة، على سبيل المثال عبر توفير الترويسة `Forwarded-For: <TARGETIP>`. بهذه الطريقة، تُعيد الدالة `get_client_addr` عنوان IP الخاص بالخادم الذي يشغّل Cacti. الاستدعاء التالي لـ `gethostbyaddr` سيحل عنوان IP هذا إلى اسم مضيف الخادم، والذي سيجتاز فحص اسم المضيف في `poller` بسبب الإدخال الافتراضي. بعد تجاوز تفويض ملف `remote_agent.php`، يمكن للمهاجم تشغيل إجراءات مختلفة. أحد هذه الإجراءات يُسمى `polldata`. الدالة المستدعاة `poll_for_data` تجلب بعض معاملات الطلب وتحمّل الإدخالات المقابلة من `poller_item` في قاعدة البيانات. إذا كانت `action` لأحد `poller_item` تساوي `POLLER_ACTION_SCRIPT_PHP`، تُستخدم الدالة `proc_open` لتنفيذ سكربت PHP. المعامل `$poller_id` الذي يتحكم به المهاجم يُستعاد عبر الدالة `get_nfilter_request_var`، والتي تسمح بسلاسل نصية عشوائية. يُدرج هذا المتغير لاحقًا في السلسلة النصية التي تُمرَّر إلى `proc_open`، مما يؤدي إلى ثغرة حقن أوامر. فعلى سبيل المثال، بتوفير `poller_id=;id` يتم تنفيذ الأمر `id`. للوصول إلى الاستدعاء الهش، يجب على المهاجم توفير `host_id` و`local_data_id`، حيث تكون `action` لـ `poller_item` المقابل مضبوطة على `POLLER_ACTION_SCRIPT_PHP`. يمكن بسهولة تخمين هذين المعرّفين (`host_id` و`local_data_id`) بطريقة القوة العمياء (bruteforce). الشرط الوحيد هو وجود `poller_item` بإجراء `POLLER_ACTION_SCRIPT_PHP`. وهذا أمر مرجّح جدًا في بيئة إنتاجية لأن هذا الإجراء يُضاف بواسطة بعض القوالب المعرّفة مسبقًا مثل `Device - Uptime` أو `Device - Polling Time`. تسمح ثغرة حقن الأوامر هذه لمستخدم غير مصادق بتنفيذ أوامر عشوائية إذا تم تكوين `poller_item` بنوع `action` يساوي `POLLER_ACTION_SCRIPT_PHP` (`2`). ينبغي منع تجاوز التفويض بعدم السماح للمهاجم بجعل `get_client_addr` (الملف `lib/functions.php`) يعيد عنوان IP عشوائيًا. يمكن تحقيق ذلك بعدم الاعتماد على متغيرات `HTTP_...` في `$_SERVER`. إذا كان يجب الإبقاء عليها لأسباب توافقية، فيجب على الأقل منع تزوير عنوان IP للخادم الذي يشغّل Cacti. تمت معالجة هذه الثغرة في فرعي الإصدارين 1.2.x و1.3.x، حيث كان الإصدار `1.2.23` أول إصدار يتضمن التصحيح.
الاستخدام المسؤول
استخدم معلومات الثغرات الأمنية فقط على الأنظمة التي تمتلكها أو المرخص لها باختبارها. يرتبط Kitploit ببيانات تعريف البحث العامة ولا يخزن أكواد الاستغلال أو الحمولات الضارة.