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 编辑已经会拒绝不是活动 iface 的父接口。Form_Select 不会重新验证 POST。即使 interface_qinq_configure 提前返回,创建操作仍会执行 write_config。随后添加/移除成员会将存储的 vlanif 插入到未转义的 ifconfig 中。PHP exec 是 /bin/sh -c。WebGUI PHP-FPM 以 root 运行。所需权限是 page-interfaces-qinq-edit,而不是 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) QinQ 编辑 |
| 认证 | 具有 page-interfaces-qinq-edit 的 WebGUI 会话 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
我固定了公共 master 9363ac5。该实验环境是一个 PHP gadget,由固定版本中的 vlan_interface / interface_qinq_configure / 成员 exec 行组成,HTTP 回环监听在 127.0.0.1:18810。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
| POST QinQ 创建,父接口不是活动 iface,然后 POST 编辑添加成员 | interface_qinq2_configure exec ifconfig vlan create ... (interfaces.inc:620) | 完整性(实验环境已证明): 通过 /bin/sh -c 获得 root shell。实验环境:添加成员 qinq2 写入了见证(member-sink=yes)。 |
相同的已存储 vlanif,POST 编辑移除成员 | exec("/sbin/ifconfig {$parent}.{$tag} destroy") (interfaces_qinq_edit.php:212) | 完整性(实验环境已证明): 相同的 root exec。Destroy 没有 IF_NAMESIZE 上限。 |
| 相同的 root shell | 主机文件系统 | 侦察(推断): config.xml、密钥、其他租户。此页面不会打印 exec 输出。 |
Root shell 或破坏 ifconfig | vlan 设备 | 可用性(推断): 创建/销毁 vlan 设备;数据平面会受到影响。 |
实验环境已证明 vs 推断: VLAN 拒绝、仅创建不执行 exec、长度 16 时的 IF_NAMESIZE 阻断,以及添加成员 qinq2 见证均为实验环境已证明。文件系统侦察和数据平面中断是根据 root PHP-FPM 推断的。
要求: 具有 page-interfaces-qinq-edit 的 WebGUI 会话。CSRF token。两次 POST(创建,然后成员编辑)。默认 admin 拥有该页面。受限用户可以被仅授予此页面。
| 攻击面 | 实验环境 |
|---|---|
| VLAN 父接口存在性检查 | vlan-rejected=yes |
| QinQ 仅创建(父接口缺失) | 存储配置,create-no-exec=yes |
| qinq2 名称长度 16 | exec 前 if-namesize-block=yes |
| 未认证 / 无 token 的 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
回环 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 编辑相同。成员 tag 的整数检查已经存在;在每次 ifconfig 之前仍应对存储的 vlanif 使用 escapeshellarg。成员删除 destroy 应像 interface_qinq2_configure 限制 IF_NAMESIZE 那样进行限制。
9363ac5b8651a1c7a333180425ce7719070f95f9interfaces_qinq_edit.phpinterfaces.inc interface_qinq2_configureinterfaces_vlan_edit.php