安全严重性:中等。CWE 862 和 CWE 284。已在 Firefox 154 和 ESR 153.1 中修复。Bugzilla 2056558。
在 Fission 架构下,每个内容进程拥有一个 PipelineId 命名空间,即 wr::PipelineId 的高 32 位。WebRenderBridgeParent::AddPipelineIdForCompositable 在 GPU 进程中运行。它检查了根管线守卫以及自身集合中的成员资格,但从未检查该 PipelineId 命名空间是否属于发送进程。同一文件中的图像、字体和 blob 键路径已经强制实施了这一检查。被攻破的内容进程可以在另一个进程的命名空间中注册 PipelineId,并在共享管理器中覆盖该源的异步图像管线。
资源键路径所强制执行的 MatchesNamespace 检查在 PipelineId 路径和 RemovePipelineIdForCompositable 上缺失。AddAsyncImagePipeline 仅使用 MOZ_ASSERT 来保证唯一性,而 MOZ_ASSERT 在发布版本中是空操作。因此,共享的 AsyncImagePipelineManager 会静默覆盖受害者的管线,而不是拒绝重复项。

威胁模型是被攻破的内容进程。PoC 是一个由 XRE_IsContentProcess 保护的内容侧补丁。它伪造了 PipelineId 命名空间,并附带一个包含 WebGL 画布和跨源进程外 iframe 的测试页面。
apply poc.patch to mozilla-central and build
MOZ_POC_FORGE_WR_NAMESPACE=999999 ./mach run --temp-profile poc.html
在发布版本上观察到:
[POC-2056558] ACCEPTED cross-namespace PipelineId: sender-namespace=4 pipeline-namespace=999999 (should have been rejected)
跨源渲染混淆和跨标签页拒绝服务。这是 Fission 站点隔离的授权绕过,而非内存破坏。下游消费者具有空指针防护并采用引用计数,因此不会导致代码执行。
强制实施资源键路径所使用的相同命名空间所有权检查。
if (!MatchesNamespace(aPipelineId)) {
return IPC_FAIL(this, "PipelineId namespace does not belong to the sending process");
}
Abdulaziz Alasaiqah · https://azoz.my/writeups.html