
Cacti 1.2.22 حقن أوامر بدون مصادقة
| الحقل | التفاصيل |
|---|
| المنتج | Cacti |
| الإصدار المتأثر | 1.2.22 |
| الثغرة | حقن أوامر نظام تشغيل غير مصادق عليه |
| CVE | CVE-2022-46169 |
| CWE | CWE-77 — حقن الأوامر |
| الخطورة | حرجة |
| CVSS v3.1 | 9.8 |
| ناقل الهجوم | الشبكة |
| المصادقة | لا شيء |
| تفاعل المستخدم | لا شيء |
| التأثير | السرية / السلامة / التوفر |
| الإصدار المُصلَح | 1.2.23 |
| المكوّن المعرَّض للخطر | remote_agent.php |
| مكوّن إضافي | lib/functions.php |
| الإجراء الرئيسي المعرَّض للخطر | polldata |
ناقل CVSS المنشور هو:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
يصنّف الاستشارة الرسمية الخطورة عند 9.8 حرجة. (GitHub)
في الواقع هناك ثغرتان مترابطتان معًا.
المرحلة 1 — تجاوز التفويض
يقبل remote_agent.php في Cacti الطلبات دون مصادقة عادية، لكنه يحاول تحديد ما إذا كان الطالب هو مُلقِّم استطلاع (poller) مصرحًا به.
مسار التفويض يعمل فعليًا على النحو التالي:
HTTP request
│
▼
remote_agent.php
│
▼
remote_client_authorized()
│
▼
get_client_addr()
│
▼
gethostbyaddr()
│
▼
مقارنة اسم المضيف في جدول poller
المشكلة تكمن في get_client_addr().
في الإصدار 1.2.22، يفحص هذا الدالة متغيرات خادم متعددة مشتقة من HTTP، بما في ذلك ترويسات عنوان IP المُمرَّر من العميل. يوضح الاستشارة أن قيم HTTP_* التي يتحكم فيها المهاجم يمكن أن تؤثر على عنوان IP الذي تُرجعه هذه الدالة. (GitHub)
هذا يعني أن التطبيق يمكن خداعه ليعتقد أن:
المهاجم
↓
"عنوان IP الخاص بي هو خادم Cacti"
↓
gethostbyaddr()
↓
اسم مضيف خادم Cacti
↓
يطابق جدول poller
↓
مصرح به
لذا لا يحتاج المهاجم إلى حساب Cacti شرعي.
بعد تجاوز فحص التفويض، فإن وظيفة النقطة الطرفية المثيرة للاهتمام هي إجراء polldata.
مسار التنفيذ ذو الصلة هو تقريبًا:
remote_agent.php
│
▼
polldata
│
▼
poll_for_data()
│
├── host_id
├── local_data_ids
└── poller_id
│
▼
البحث في poller_item
│
▼
POLLER_ACTION_SCRIPT_PHP
│
▼
proc_open()
│
▼
تنفيذ أوامر نظام التشغيل
الخطأ المهم هو التعامل مع poller_id.
يسترجعه التطبيق باستخدام:
get_nfilter_request_var()
بدلاً من فرض كونه عددًا صحيحًا.
تلك القيمة التي يتحكم فيها المهاجم تصبح في النهاية جزءًا من أمر يُمرَّر إلى proc_open() في PHP. يحدد الاستشارة الرسمية هذا صراحةً كأساس لحقن الأوامر. (GitHub)
من الناحية المفاهيمية:
إدخال يتحكم فيه المهاجم
↓
poller_id
↓
سلسلة نصية مدمجة
↓
proc_open()
↓
أمر نظام التشغيل
هذا هو الجزء الحرج من الثغرة.
الشيء المثير للاهتمام في تحليل PoC الخاص بك هو أن أيًا من الثغرتين بمفردها ليست القصة الكاملة.
إنها سلسلة ثغرات:
┌──────────────────────────┐
│ مهاجم غير مصادق عليه │
└────────────┬─────────────┘
│
▼
remote_agent.php
│
▼
تجاوز التفويض
عبر منطق عنوان IP للعميل
│
▼
polldata
│
▼
البحث في poller_item
│
▼
POLLER_ACTION_SCRIPT_PHP
│
▼
إدخال المهاجم
→ poller_id
│
▼
proc_open()
│
▼
تنفيذ الأوامر
│
▼
RCE
هذا تمييز مهم جدًا يجب توضيحه في تقريرك:
CVE-2022-46169 ليست ببساطة "معامل سيئ في remote_agent.php." إنها سلسلة من تجاوز التفويض + حقن الأوامر.
يؤكد الاستشارة الرسمية أن شرط التنفيذ المعرَّض للخطر يتطلب poller_item يكون إجراءه POLLER_ACTION_SCRIPT_PHP. (GitHub)
يجب أن يوثّق PoC الخاص بك هذا صراحةً لأنه تفصيل تحليلي مهم.
يحتاج الهدف إلى poller_item مناسب مُهيأ بـ:
POLLER_ACTION_SCRIPT_PHP
يشير استشارة Cacti إلى أن هذا شائع في بيئات الإنتاج لأن القوالب المحددة مسبقًا مثل Device - Uptime و Device - Polling Time يمكن أن تنشئ هذه الإدخالات. (GitHub)
لذا لا تكتب:
"كل تثبيت Cacti 1.2.22 قابل للاستغلال تلقائيًا."
البيان الأكثر دقة تقنيًا هو:
Cacti 1.2.22 معرَّض للخطر، ويعتمد نجاح تنفيذ الأوامر على وجود تكوين
poller_itemمناسب.
host_id و local_data_idلا تنفذ poll_for_data() ببساطة poller_id المُقدَّم.
تستعلم أولاً عن poller_item باستخدام قيم تتوافق مع:
host_id
local_data_id
ثم تفحص إجراء العنصر الناتج.
الشرط المعرَّض للخطر هو فعليًا:
host_id
+
local_data_id
↓
poller_item
↓
action == POLLER_ACTION_SCRIPT_PHP
↓
مسار تنفيذ معرَّض للخطر
يشير الاستشارة الأصلي إلى أن هذه المعرّفات يمكن اكتشافها لأن الإدخالات ذات الصلة موجودة في قاعدة بيانات التطبيق، وأن الإدخالات المناسبة من المرجح أن تكون موجودة في التثبيتات الإنتاجية. (GitHub)
بالنسبة إلى PoC عام، سأوضح هذا المتطلب المسبق صراحةً بدلاً من إخفائه.
لشيء تنشره، أوصي بجعل PoC يوضح تنفيذ الأوامر دون منح القراء حمولة ريفيرس شل جاهزة للاستخدام كسلاح.
على سبيل المثال، نظّم عرضك على النحو التالي:
1. انشر Cacti 1.2.22 في جهاز افتراضي معزول
2. هيئ poller_item باستخدام POLLER_ACTION_SCRIPT_PHP
3. تأكد من إمكانية الوصول إلى remote_agent.php
4. وضح التأثير على قرار التفويض
5. وصل إلى مسار تنفيذ polldata
6. استخدم علامة تنفيذ أوامر غير ضارة
7. التقط الأدلة الناتجة من التطبيق/السجلات
8. قم بالترقية إلى 1.2.23
9. أعد الاختبار
10. وضح أن الثغرة لم تعد قابلة للاستغلال
يمنحك ذلك عرضًا شرعيًا للثغرة دون تحويل التقرير إلى سلاح RCE جاهز للاستخدام عبر الإنترنت.
يمكنك تقسيم الكود المعرَّض للخطر إلى ثلاث مناطق.
remote_agent.phpمسؤول عن كشف وظيفة الوكيل البعيد وتوجيه الإجراء المطلوب.
remote_agent.php
│
└── action = polldata
│
▼
poll_for_data()
lib/functions.phpيحتوي على get_client_addr().
التصميم الإشكالي هو الثقة في القيم المشتقة من HTTP عند تحديد عنوان الشبكة الفعلي للطالب.
يسرد الاستشارة الرسمي متغيرات متعددة متعلقة بـ HTTP يتم فحصها قبل الرجوع إلى العنوان البعيد الفعلي. (GitHub)
proc_open()الحوض الخطير النهائي هو بناء أمر PHP المنفذ عبر proc_open().
يحدد الاستشارة التدفق المعرَّض للخطر على النحو التالي:
poller_id
↓
get_nfilter_request_var()
↓
بناء الأمر
↓
proc_open()
(GitHub)
يحدد استشارة Cacti تغييرين مهمين للعلاج.
أولاً، يجب معاملة poller_id كعدد صحيح:
get_nfilter_request_var()
↓
get_filter_request_var()
ثانيًا، يجب أيضًا تهريب القيمة من القشرة (shell-escaped) قبل دمجها في الأمر:
escapeshellarg($poller_id)
يوصي الاستشارة تحديدًا بكلا الإجراءين. (GitHub)
جانب التفويض يحتاج أيضًا إلى التوقف عن السماح للمهاجم بالتأثير بشكل تعسفي على عنوان IP للعميل المستخدم للتفويض. (GitHub)
Cacti 1.2.22
│
├── معرَّض للخطر
├── تجاوز التفويض
├── حقن الأوامر
└── احتمالية RCE غير مصادق عليه
Cacti 1.2.23
│
└── تم تصحيح CVE-2022-46169
يسرد استشارة البائع 1.2.22 كإصدار متأثر و 1.2.23 كإصدار 1.2.x المُصلَح. (GitHub)
يصف استشارة أمان أمازون المشكلة بشكل مستقل بأنها تسمح لمهاجم غير مصادق عليه بتنفيذ أوامر عشوائية ويمنحها درجة CVSS 9.8. (AWS Training and Certification)
سأستخدم شيئًا مثل:
CVE-2022-46169 — حقن أوامر غير مصادق عليه / RCE في Cacti 1.2.22
أو بشكل أكثر تقنية:
CVE-2022-46169: تحليل سلسلة تجاوز التفويض وحقن الأوامر في الوكيل البعيد لـ Cacti 1.2.22
ويمكن أن يقول ملخص الثغرة الخاص بك:
يحتوي Cacti 1.2.22 على سلسلة ثغرات حرجة في وظيفة الوكيل البعيد. يمكن للمهاجم التلاعب بمنطق تحديد عنوان العميل لتجاوز فحص تفويض الوكيل البعيد. بمجرد الوصول إلى وظيفة
polldata، يسمح التحقق غير الكافي من معاملpoller_idبوصول البيانات التي يتحكم فيها المهاجم إلى أمر يُنفذ عبرproc_open(). في التكوينات التي تحتوي على عنصر poller من نوعPOLLER_ACTION_SCRIPT_PHP، يمكن أن يؤدي ذلك إلى تنفيذ أوامر عن بُعد غير مصادق عليه. تم إصلاح المشكلة في Cacti 1.2.23. (GitHub)
تصحيح مهم واحد لبحثك: لا تخلط بين هذا و CVE-2023-39362. تلك الثغرة اللاحقة في Cacti RCE تؤثر على 1.2.24 وتم إصلاحها في 1.2.25، لذا فهي ليست الثغرة التي تريدها لـ PoC على 1.2.22. (NVD)