Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-14321 — 概念验证,通过WebRTC编码转换演示Firefox的RTCEncodedFrameBase中的释放后使用漏洞,可实现堆破坏和潜在的远程代码执行。 | Kitploit
工具/GitHubGitHub/h3raklez/cve-2025-14321
漏洞分析漏洞利用Web应用程序漏洞利用CTF论文与研究学习与教育二进制利用
GitHubh3raklez/cve-2025-14321

CVE-2025-14321

概念验证,通过WebRTC编码转换演示Firefox的RTCEncodedFrameBase中的释放后使用漏洞,可实现堆破坏和潜在的远程代码执行。

查看仓库
26个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-14321 概念验证

描述

针对 Firefox 中 RTCEncodedFrameBase 组件的释放后使用 (UAF) 漏洞的概念验证 (PoC),该漏洞可通过 WebRTC 编码转换 API 利用。

CVE-2025-14321: RTCEncodedFrameBase 的析构函数在释放帧的本机内存时未调用 DetachArrayBuffer()。因此,JavaScript 的 ArrayBuffer 仍保留指向已释放内存的指针(悬挂指针),允许对 Firefox 内容进程堆进行任意读写。

此 PoC 已在 Mozilla Firefox 145.0.1 和 Windows 10 上测试通过。

根本原因

Firefox 通过 NewArrayBufferWithUserOwnedContents() 将编码后的视频/音频帧暴露为 JavaScript 的 ArrayBuffer。当本机 (C++) 帧被销毁时,ArrayBuffer 的后备内存被释放,但 JavaScript 中的 ArrayBuffer 未被分离(detach)。这违反了所有权不变性,导致悬挂指针。

漏洞代码 (dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp):

root@kitploit:~
// ❌ 析构函数未分离 ArrayBuffer
RTCEncodedFrameBase::~RTCEncodedFrameBase() = default;

修补后的代码:

root@kitploit:~
// ✅ 在释放本机内存前分离 ArrayBuffer
RTCEncodedFrameBase::~RTCEncodedFrameBase() {
  DetachData();
}

受影响版本

  • Firefox < 146
  • Firefox ESR < 140.6

获得的基本操作

  • READ: new Uint8Array(buf) 读取已重新分配给堆上其他对象的内存数据
  • WRITE: new Uint8Array(buf).fill(0x41) 破坏堆中相邻的对象(虚函数表、DOM 结构等)

这些基本操作足以证明漏洞存在。结合进一步的堆布局 (heap shaping),可能升级为远程代码执行 (RCE)。

先决条件

Firefox 配置 (about:config)

root@kitploit:~
media.peerconnection.scripttransform.enabled = true
media.peerconnection.ice.loopback             = true
media.peerconnection.ice.no_host              = false
media.peerconnection.ice.relay_only           = false
media.peerconnection.ice.proxy_only           = false

⚠ 修改偏好设置后重启 Firefox。

摄像头权限(可选)

PoC 尝试通过 getUserMedia() 请求摄像头访问。如果 ICE 偏好设置正确配置,这不是必需的。其作用是促使 Firefox 进入 RFC IP 处理模式 1,从而在偏好设置本身不足以生成 ICE 主机候选者的情况下保证生成。

实际上:

  • 无摄像头的虚拟机:getUserMedia() 静默失败(NotFoundError),不弹出提示。由于 media.peerconnection.ice.loopback = true,ICE 仍能连接。
  • 有摄像头的系统:Firefox 显示权限提示。接受可确保 ICE 模式 1。
  • 摄像头被拒绝:PoC 使用画布 (canvas) 作为回退。若偏好设置正确,ICE 仍可连接。

HTTP 服务器

Web Worker 不支持 file:// 协议。需通过 HTTP 提供:

root@kitploit:~
python3 -m http.server 8080

在受影响的 Firefox 中打开:http://localhost:8080/poc-cve-2025-14321.html

漏洞利用流程

1. getUserMedia → ICE 模式 1(尽力而为)

PoC 尝试请求摄像头访问。如果有摄像头且用户允许,Firefox 将会话提升至 RFC IP 处理模式 1。如果 getUserMedia() 失败(无摄像头的虚拟机、权限被拒绝),PoC 继续使用画布作为帧源——若 media.peerconnection.ice.loopback = true 处于活动状态,ICE 仍能连接。

2. 动画画布作为帧源

创建一个 320×240 的 <canvas>,通过 captureStream(30) 以 30fps 生成动画。这会产生可预测的编码视频帧。一旦 ICE 连接且已使用摄像头,PoC 通过 replaceTrack() 用画布轨道替换摄像头轨道,并释放摄像头。

3. WebRTC 环回连接

创建两个本地 RTCPeerConnection(pc1 ↔ pc2),使用标准 SDP 协商和 trickle ICE。候选者直接在两个对等端之间交换。

4. 转换 Worker (RTCRtpScriptTransform)

在 SDP 协商 之前,为 pc1 的发送方分配一个 RTCRtpScriptTransform。该 worker 拦截发送管道中的每个编码帧。

5. 保留 ArrayBuffer(200 帧)

对于前 200 个帧中的每一个,worker 执行以下操作:

  1. 提取 frame.data(指向本机内存的 ArrayBuffer)
  2. 将引用保存到数组 (leaks[]) 中
  3. 写入已知模式:new Uint8Array(buf).fill(0x41)
  4. 不转发该帧 → 本机包装器被销毁 → 内存被释放

由于不转发,垃圾回收器销毁 C++ 包装器并释放本机内存。但 JavaScript 的 ArrayBuffer 仍保留指针——创建了悬挂指针。

6. 检测 UAF

从第 201 帧开始,每 3 帧 worker 执行以下操作:

  1. 读取每个保留缓冲区的头 16 个字节
  2. 如果任何字节与 0x41 不同,则分配器已重用该内存 → UAF 确认
  3. 将 0x41 重新写入缓冲区(对他人堆的写入原语)

这种对已释放内存的读写循环会逐步破坏堆,直到 Firefox 标签页崩溃(等同于公告中报告的 SIGSEGV)。

预期结果

受影响版本 (Firefox < 146)

root@kitploit:~
[0.4s] ✓ 初始轨道:画布(回退)
[0.4s] ✓ ICE 连接已建立!
[0.5s] ▶▶▶ 收到第一个编码帧!◀◀◀
[0.5s] 泄漏 #0: 1219B → 41414141414141414141414141414141
[2.7s] 泄漏 #49: 1497B → 41414141414141414141414141414141
[9.8s] 泄漏 #199: 1870B → 41414141414141414141414141414141
[9.9s] 保留了 200 个 ArrayBuffer → 本机内存已释放
[9.9s] → 悬挂指针已激活,等待重用…
       [ 标签页崩溃 — 堆损坏 ]

注意: 如果有摄像头且授予权限,日志将显示 ✓ getUserMedia 已授予 — ICE 模式 1 已激活,然后 ✓ 轨道已替换:摄像头 → 画布 在 ICE 连接之后。在无摄像头的虚拟机中,PoC 直接使用画布,不弹出提示。

标签页崩溃确认堆损坏:在已重新分配给其他对象(虚函数表、DOM 节点)的内存上写入 0x41 会导致内容进程中的无效内存访问。

已修补版本 (Firefox ≥ 146)

root@kitploit:~
✓ Buffer[0] 已正确分离 — 修复已生效
ArrayBuffer 已分离 — 已修补版本 ✓

析构函数中的 DetachData() 在释放本机内存之前使 ArrayBuffer 失效,从而消除了悬挂指针。

项目结构

root@kitploit:~
├── poc-cve-2025-14321.html            # 功能性 PoC(可读源代码)
└── README.md                          # 本文件

补丁

Mozilla 在 Firefox 146 中通过在 RTCEncodedFrameBase 的所有析构函数和拆卸路径中添加 DetachData() 修复了此漏洞。

提交:https://hg-edge.mozilla.org/mozilla-central/rev/1051067f6e83

缓解措施

  • 将 Firefox 更新至 146 或更高版本
  • 将 Firefox ESR 更新至 140.6 或更高版本

免责声明

⚠ 仅用于教育和研究目的

此 PoC 仅证明漏洞存在直至堆损坏(崩溃)。它不实现堆布局、ASLR 绕过或执行代码所需的劫持技术。其目的仅在于在受控环境中验证和理解 CVE。

参考

  • CVE: CVE-2025-14321
  • 博客文章:https://aisle.com/blog/firefox-webrtc-encoded-transforms-uaf-via-undetached-arraybuffer-cve-2025-14321
  • 公告:MFSA 2025-92 · Bug 1992760
  • Mozilla 提交:https://hg-edge.mozilla.org/mozilla-central/rev/1051067f6e83

致谢

  • 发现者:Igor Morgernstern,AISLE 研究团队
  • 报告日期:2025-10-06
  • 补丁日期:2025-11-19
  • 公开日期:2025-12-09
下载工具