🟠 高危 | CVE-2026-64832 — FFmpeg versions 4.4 through 8.1.2 contain a double...
🟠 【深度分析】高危安全漏洞:CVE-2026-64832
CVSS 评分: 高危(8.7)🟠 状态: Analyzed 发布时间: 2026-07-22
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-64832 |
| CVSS 评分 | 8.7 🟠 |
| 严重程度 | 高危 |
| CVSS 向量 | CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X |
| CWE 分类 | CWE-415 |
| 发布时间 | 2026-07-22 |
| 最后更新 | 2026-07-28 |
| 状态 | Analyzed |
| 数据来源 | disclosure@vulncheck.com |
CVSS 评分:8.7(高危)
CVSS 向量: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
危害等级:高危
漏洞状态:已分析
漏洞概述
CVE-2026-64832 是 FFmpeg 中 NVIDIA NVDEC 硬件解码器(libavcodec/nvdec.c)的一个双重释放(double-free)漏洞。攻击者可以通过提供特制的视频文件,利用该漏洞触发内存破坏,进而可能导致信息泄露、任意代码执行或拒绝服务。受影响的版本包括 FFmpeg 4.4 至 8.1.2。该漏洞由 disclosure@vulncheck.com 披露,NVD 已于 2026 年 7 月 22 日发布分析结果。
受影响组件与版本
| 组件 | 受影响版本范围 |
|---|---|
| FFmpeg(libavcodec) | 4.4, 4.4.x, 5.0.x, 5.1.x, 6.0.x, 6.1.x, 7.0.x, 7.1.x, 8.0.x, 8.1.2 |
| 所有使用 NVDEC 硬件加速解码的 FFmpeg 应用 | 上述版本中启用了 NVIDIA NVDEC 后端 |
注意:仅当 FFmpeg 编译时包含 NVIDIA NVDEC 支持(--enable-nonfree 或相应配置)且实际使用硬件解码时才会受影响。纯软件解码不受影响。
漏洞原理分析
技术成因
漏洞位于 libavcodec/nvdec.c 文件中的 ff_nvdec_start_frame_sep_ref 函数。该函数负责启动一帧的 NVDEC 硬件解码。在解码过程中,当硬件解码器表面(decoder surfaces)不足时(即 no decoder surfaces remain),代码会进入错误处理路径。
在该错误路径中,函数直接调用 nvdec_fdd_priv_free() 来释放当前帧的描述数据(frame description data,即 FrameDecodeData 的私有数据)。然而,该函数的调用者(上层解码逻辑)在发现错误返回后,会再次尝试释放相同的帧描述数据结构(通常通过统一的清理机制),从而导致对同一块内存的第二次释放(double-free)。
攻击向量
- 攻击者构造恶意视频文件:通过精心设计的视频流,使得在解码过程中 NVDEC 硬件表面耗尽(例如通过大量并发帧、特定分辨率或复杂的参考帧结构)。
- 用户交互:攻击者需要诱使用户使用受影响的 FFmpeg 应用(如播放器、转码工具)打开该视频文件。
- 触发条件:当解码器进入“无可用表面”状态时,
ff_nvdec_start_frame_sep_ref返回错误,触发双重释放。
关键代码路径(基于 NVD 描述推断)
// libavcodec/nvdec.c (简化伪代码)
int ff_nvdec_start_frame_sep_ref(AVCodecContext *avctx, ...) {
NVDECFrame *f = ...;
if (!decoder_surfaces_available) {
nvdec_fdd_priv_free(f); // 第一次释放
return -1;
}
// ...
}
// 调用者(如 h264dec.c)
if ((ret = ff_nvdec_start_frame_sep_ref(ctx, ...)) < 0) {
// 错误处理:可能会再次调用 ff_decode_frame_props 或 ff_frame_pool_unref 等释放函数
// 其中包含了同样的 frame description data 的释放路径
}
由于 nvdec_fdd_priv_free 仅释放了私有上下文,但外层释放逻辑并不知道该内存已被释放,因此导致了第二次 free。
影响评估
利用难度分析(基于 CVSS 4.0 向量)
- 攻击向量 (AV:N):远程可发起,攻击者只需提供恶意文件(通过下载、邮件、网页等)。
- 攻击复杂度 (AC:L):无需特殊技巧,构造触发双重释放的视频文件在技术上可行(需了解 NVDEC 表面管理逻辑)。
- 攻击要求 (AT:N):无特殊攻击前置条件。
- 权限要求 (PR:N):无需任何用户权限。
- 用户交互 (UI:P):受害者需要主动打开恶意视频文件(如播放、转码)。
- 影响 (VC:H / VI:H / VA:H):机密性、完整性和可用性均为高。双重释放通常导致堆内存破坏,攻击者可借此劫持控制流或泄露敏感数据。在 FFmpeg 处理多媒体的场景中,可能进一步导致任意代码执行。
潜在后果
- 代码执行:成功利用后,攻击者可在目标系统上以运行 FFmpeg 的进程权限执行任意代码。
- 拒绝服务:即使无法代码执行,双重释放也会导致程序崩溃(SIGSEGV),造成服务不可用。
- 信息泄露:内存破坏可能间接暴露堆中的其他数据。
实际威胁评估
由于 FFmpeg 被广泛集成在视频播放器、转码工具、流媒体服务器中(如 VLC、OBS、HandBrake 等),该漏洞影响面较大。攻击者只需诱导用户播放一个特制视频,即可触发。利用复杂度较低,因此属于高危漏洞。
修复建议
官方补丁
FFmpeg 官方已在 8.1.2 之后的版本(例如 8.2.0)中修复了此问题。检查 nvdec.c 中 ff_nvdec_start_frame_sep_ref 的错误处理逻辑,确保在释放后正确置空指针或避免外层重复释放。建议立即升级至以下版本之一:
- FFmpeg >= 8.2(最新稳定版)
- 或包含补丁的向后移植版本(如 7.1.1、6.1.2 等,需确认官方发布状态)
临时缓解措施
- 禁用 NVDEC 硬件解码:在不支持硬件加速的场景下,可以通过环境变量或配置强制使用软件解码:
export FFMPEG_HWACCEL=none # 或命令行参数:-hwaccel none - 限制用户输入:避免处理来自不可信来源的视频文件,尤其是未知格式或来源的文件。
- 启用 ASLR 和堆保护:在操作系统层面启用地址空间布局随机化和堆保护(如 glibc 的
malloc检测)可一定程度增加利用难度,但并不能根本避免代码执行。
参考资料
| 类型 | 链接 |
|---|---|
| CVE 详情 | https://nvd.nist.gov/vuln/detail/CVE-2026-64832 |
| CWE-415(Double Free) | https://cwe.mitre.org/data/definitions/415.html |
| FFmpeg 官方安全公告 | 待发布(参考 https://ffmpeg.org/security.html) |
| 披露来源 | disclosure@vulncheck.com |
免责声明:本文基于 NVD 公开数据撰写,部分技术细节为基于已有信息的合理推断。对于漏洞的具体利用方式及补丁详细信息,请以 FFmpeg 官方发布为准。