
pfSense CE 2.9.0-DEVELOPMENT - عالي - عن بُعد - RCE - limiter number dnctl
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-limiter-number
المقال: https://abraxaslabs.tech/research/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.
| المعرّف | لا يوجد 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. المختبر عبارة عن gadget بلغة 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-cast) قبل كل استدعاء لـ dnctl. تجاهل قيمة number المرسلة عبر POST عند التعديل، أو تحقّق من نطاقها مقابل معرّف dummynet الفعلي. عملية الإنشاء تستبدل القيم بالفعل؛ اجعل التعديل يفعل الشيء نفسه.
9363ac5b8651a1c7a333180425ce7719070f95f9shaper.inc delete_queue / GetNumberfirewall_shaper_vinterface.php