
pfSense CE 2.9.0-DEVELOPMENT - عالي - عن بُعد - RCE - QinQ parent-if ifconfig
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-qinq-parent-if
الفئة: RCE الوصول: عن بُعد
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
يقوم تعديل QinQ بتخزين اسم الواجهة الأب دون التحقق من does_interface_exist. بينما يرفض تعديل VLAN بالفعل واجهة أب ليست واجهة حية. لا يعيد Form_Select التحقق من POST. تُنشئ عمليات write_config حتى عندما يعود interface_qinq_configure مبكرًا. ثم تُدرج إضافة/إزالة الأعضاء قيمة vlanif المخزنة في ifconfig غير المُهرَّب. أمر PHP exec هو /bin/sh -c. خدمة WebGUI PHP-FPM تعمل بصلاحيات root. الصلاحية هي page-interfaces-qinq-edit، وليس 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) تعديل QinQ |
| المصادقة | جلسة WebGUI بصلاحية page-interfaces-qinq-edit |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
ثبّتُّ الفرع العام master عند 9363ac5. المختبر عبارة عن gadget بلغة PHP يحاكي أسطر vlan_interface / interface_qinq_configure / exec الخاصة بالأعضاء من النسخة المثبّتة، مع HTTP على واجهة loopback عند 127.0.0.1:18810.
| الطريقة | نقطة الوصول | الصلاحية |
|---|---|---|
| POST لإنشاء QinQ بواجهة أب ليست واجهة حية، ثم POST لتعديل بإضافة عضو | interface_qinq2_configure exec ifconfig vlan create ... (interfaces.inc:620) | السلامة (مُثبَت مختبريًا): صدفة root عبر /bin/sh -c. المختبر: إضافة عضو qinq2 كتبت الشاهد (member-sink=yes). |
نفس vlanif المخزنة، POST لتعديل بإزالة عضو | exec("/sbin/ifconfig {$parent}.{$tag} destroy") (interfaces_qinq_edit.php:212) | السلامة (مُثبَت مختبريًا): نفس exec بصلاحيات root. لا يوجد حد IF_NAMESIZE في Destroy. |
| نفس صدفة root | نظام ملفات المضيف | الاستطلاع (مُستنتَج): config.xml، المفاتيح، مستأجرون آخرون. لا تطبع هذه الصفحة مخرجات exec. |
صدفة root أو ifconfig معطوب | أجهزة vlan | التوافر (مُستنتَج): إنشاء/تدمير أجهزة vlan؛ مستوى البيانات معرّض للخطر. |
مُثبَت مختبريًا مقابل مُستنتَج: رفض VLAN، والإنشاء فقط دون exec، وحجب IF_NAMESIZE عند الطول 16، وشاهد إضافة عضو qinq2 كلها مُثبَتة مختبريًا. استطلاع نظام الملفات وتعطيل مستوى البيانات مُستنتَجان من PHP-FPM بصلاحيات root.
يتطلب: جلسة WebGUI بصلاحية page-interfaces-qinq-edit. رمز CSRF. طلبا POST (إنشاء، ثم تعديل عضو). المدير الافتراضي يملك الصفحة. يمكن منح مستخدم محدود هذه الصفحة فقط.
| السطح | المختبر |
|---|---|
| التحقق من وجود الواجهة الأب في VLAN | vlan-rejected=yes |
| QinQ إنشاء فقط (الواجهة الأب مفقودة) | يخزّن الإعداد، create-no-exec=yes |
| طول اسم qinq2 يساوي 16 | if-namesize-block=yes قبل exec |
| بدون مصادقة / CSRF بدون رمز | guiconfig + CSRF-magic |
تعبير نمطي لأسماء GIF/GRE، أعضاء LAGG does_interface_exist + escapeshellarg | صفحات أخرى |
| حذف قائمة QinQ لواجهة أب لم تُنشأ قط | does_interface_exist($vlanif) |
| Diagnostics: Command | يبقى مغلقًا ما لم يُمنح أيضًا |
لا Diagnostics: Command. لا وصول بدون مصادقة. الفئة التاريخية هي CVE-2023-42326 GIF/GRE، صفحة مختلفة.
cd lab
./run.sh
loopback 127.0.0.1:18810. مشروع Compose باسم pfsense-qinq-parent-if. وسم الصورة pfsense-qinq-parent-if:2.9.0-dev. الشاهد PFSENSE-QINQ-PARENT-IF-WITNESS. السطر الأخير:
SUCCESS PFSENSE-QINQ-PARENT-IF vlan-rejected=yes create-no-exec=yes member-sink=yes if-namesize-block=yes PFSENSE-QINQ-PARENT-IF-WITNESS
تعديل QinQ: ارفض واجهة أب ليست واجهة حية، تمامًا كما في تعديل VLAN. التحقق الصحيح لأعضاء tags موجود بالفعل؛ ومع ذلك يجب escapeshellarg لقيمة vlanif المخزنة قبل كل ifconfig. حدّد تدمير حذف الأعضاء بنفس طريقة تحديد interface_qinq2_configure لـ IF_NAMESIZE.
9363ac5b8651a1c7a333180425ce7719070f95f9interfaces_qinq_edit.phpinterfaces.inc interface_qinq2_configureinterfaces_vlan_edit.php