
pfSense CE 2.9.0-DEVELOPMENT - عالي - عن بُعد - RCE - limiter number dnctl
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-limiter-number
الفئة: RCE الوصول: عن بُعد
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
تُصدر محددات Traffic Shaper حقلاً مخفياً number عند التحرير. تقوم عملية الإنشاء بالكتابة فوق هذا الرقم باستخدام dnpipe_find_nextnumber(). أما التحرير فلا يفعل ذلك. لا يتحقق validate_input أبداً من number. يتم دمج GetNumber() بدون علامات اقتباس في dnctl pipe|sched|queue delete. الأمر PHP mwexec هو /bin/sh -c. الصلاحية هي page-firewall-trafficshaper-limiter، وليس Diagnostics: Command.
| ID | لا يوجد CVE بعد |
| الفئة | RCE |
| الوصول | عن بُعد (WebGUI موثّق) |
| CWE | CWE-78 |
| CVSS | مرتفع: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| المنتج | pfSense CE |
| المتأثر | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) حقل number للمحدد |
| المصادقة | جلسة WebGUI مع page-firewall-trafficshaper-limiter |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
قمت بتثبيت الفرع العام الرئيسي 9363ac5. المختبر عبارة عن أداة PHP مثبّتة لـ ReadConfig / SetNumber / delete_queue. Loopback 127.0.0.1:18840.
| الطريقة | نقطة الوصول | الصلاحية |
|---|---|---|
إنشاء محدد، ثم POST save مع number من المهاجم، ثم حذف ذلك المحدد | mwexec("/sbin/dnctl pipe delete " . $this->GetNumber()) (shaper.inc:3820) | السلامة (مُثبتة مختبرياً): صدفة root. المختبر: edit-delete كتب الشاهد (edit-delete-exec=yes). الكتابة فوق الإنشاء ومسار apply-file لم يكتبا شيئاً. |
| نفس صدفة root | نظام ملفات المضيف | الاستطلاع (مُستنتج): config.xml، المفاتيح. |
صدفة root أو dnctl بأرقام المهاجم | dummynet | التوافر (مُستنتج): تعطيل المحدد / dummynet. |
مُثبت مختبرياً مقابل مُستنتج: الكتابة فوق الإنشاء (بدون شاهد)، ومسار apply-file (dnctl لملف، بدون شاهد)، وتنفيذ edit-delete (شاهد) مُثبتة مختبرياً. استطلاع نظام الملفات مُستنتج من root PHP-FPM.
يتطلب: جلسة WebGUI مع page-firewall-trafficshaper-limiter. CSRF على POST save. الحذف هو GET action=delete.
| السطح | المختبر |
|---|---|
| مسار الإنشاء | dnpipe_find_nextnumber() يكتب فوقه، create-overwrites=yes |
| مسار التطبيق | dnctl لـ /tmp/rules.limiter، اسم الملف غير متحكم به من المستخدم، apply-file=yes |
| مجموعة أحرف اسم المحدد | ^[a-zA-Z0-9_-]+$ |
| غير موثّق | مغلق |
| Diagnostics: Command | يبقى مغلقاً ما لم يُمنح أيضاً |
معاملات AQM في /tmp/rules.limiter هي لغة dummynet إضافية، وليست هذه البقايا.
cd lab
./run.sh
Loopback 127.0.0.1:18840. مشروع Compose pfsense-limiter-number. وسم الصورة pfsense-limiter-number:2.9.0-dev. الشاهد PFSENSE-LIMITER-NUMBER-WITNESS. السطر الأخير:
SUCCESS PFSENSE-LIMITER-NUMBER create-overwrites=yes apply-file=yes edit-delete-exec=yes PFSENSE-LIMITER-NUMBER-WITNESS
حوّل GetNumber() إلى int قبل كل dnctl. تجاهل number القادم من POST عند التحرير، أو تحقق من نطاقه مقابل معرّف dummynet الحيّ. الإنشاء يكتب فوقه بالفعل؛ اجعل التحرير يفعل الشيء نفسه.
9363ac5b8651a1c7a333180425ce7719070f95f9shaper.inc delete_queue / GetNumberfirewall_shaper_vinterface.php