FFmpeg曝出21个零日漏洞
速览
安全研究人员发现FFmpeg多媒体框架中存在21个零日漏洞。这些漏洞可能允许攻击者通过恶意构造的多媒体文件执行远程代码或导致服务中断。由于FFmpeg在音视频处理领域的广泛应用,此次发现对媒体安全具有重大影响。
AI 深度解读
深度解读:21个FFmpeg零日漏洞的发现与AI安全代理的突破
背景
FFmpeg 是全球部署最广泛的软件组件之一。从日常使用的浏览器到支撑大型流媒体平台的基础设施,它都在幕后默默处理着媒体数据。作为一个经常解析复杂且不受信任的媒体文件的库,FFmpeg 具有极高的安全敏感性,也是“零点击攻击”(zero-click attacks)的主要目标。
深入查看 FFmpeg 的代码库可以发现其面临的挑战规模之大:该项目规模庞大,包含约 150 万行经过高度优化的 C 代码,致力于解析数百种复杂的媒体格式。此外,它还吸收了超过二十年的持续模糊测试(fuzzing)和人工审计成果。
近期,安全领域在 FFmpeg 漏洞挖掘方面取得了显著进展:
- Google 的 Big Sleep 团队披露了 FFmpeg 中的 13 个漏洞。
- Anthropic 随后使用其 Mythos 模型扫描 FFmpeg,并成功发现了一些安全问题。
这些里程碑事件表明,先进的 AI 模型越来越具备通过密集且加固的 C 代码进行推理的能力。然而,随着这些努力,在 FFmpeg 中发现漏洞变得越来越困难。在此背景下,depthfirst 构建了一个能够在大代码库上进行深度扫描的代理系统(Agentic System)。由于无法直接访问 Anthropic 的 Mythos 模型,depthfirst 希望测试仅使用现有可用模型能走多远:能否重新发现 Big Sleep 和 Mythos 已经发现的问题?更重要的是,能否找到它们完全遗漏的新关键漏洞?
核心内容
1. 安全代理 vs. 编码代理
depthfirst 指出,虽然编码代理和安全代理可能使用相同的底层模型,但它们的运行目标截然不同:
- 编码代理(Coding Agent):通常是交互式的。人类给出任务,目标是编写代码,而非专注于边缘情况或对抗性输入。
- 安全代理(Security Agent):目标更狭窄、更具针对性。它不试图编写有用的应用程序代码,而是试图在现有系统中发现真实、可利用的安全问题,且无需特定的指令。
2. 安全代理的工作机制
安全代理改变了传统分析的形状,其工作流程包括:
- 威胁建模:首先对代码库进行威胁建模,理解其架构,识别暴露的解析器和协议处理程序,并映射攻击者控制的输入进入系统的位置。
- 直接审计攻击面:直接审计攻击面代码,沿着相关组件的数据流进行追踪,而不是将代码库视为文件的扁平集合。
- 护栏机制(Guardrails):为了防止伪造缺失的条件、过度声称理论漏洞或产生大量误报,系统必须检查:
- 攻击者是否真正控制了正确的输入?
- 易受攻击的路径是否可达?
- 怀疑的缺陷是否可以复现?
- 具体验证:在需要时,识别或生成适当的测试工具(harnesses)来与目标组件交互,并具体测试这些假设。
depthfirst 的安全代理会深入分析代码,并行分支以测试各种假设。它们追踪执行路径,验证攻击者是否控制了正确的输入,并确定数据流是否实际到达易受攻击的终点(sink)。关键在于,该过程的结果不仅仅是一份理论报告或模糊的警告,而是自动定位确切的网络安全问题,并提供可复现的具体输入(PoC),通过执行来确认漏洞。这确保了每个发现都是真实的、可达的且可操作的。
3. 发现成果
depthfirst 的代理总共发现了 21 个零日漏洞,涵盖从 TS 解复用器到 VP9 解码器的各个组件。总成本约为 1,000 美元,仅为 Anthropic 使用 Mythos 花费(约 10,000 美元)的 10%。
已分配 CVE 的漏洞(8 个)
- CVE-2026-39210 (堆缓冲区溢出):2010 年引入 TS 解复用器,在读取两个字节前缺乏长度边界检查。
- CVE-2026-39211 (整数溢出):2010 年在 swscale 重构期间引入,通过一个没有上限的大小因子公式,允许用户控制的参数触发任意大的缩放。
- CVE-2026-39212 (栈溢出):2025 年 7 月
ffmpeg_opt.c中的近期回归问题,预设文件可触发无深度限制的选项解析递归。 - CVE-2026-39213 (堆缓冲区溢出):2023 年在 yuv4mpegenc rawvideo 输入路径中引入,未验证尺寸是否与数据包大小匹配。
- CVE-2026-39214 (栈缓冲区溢出):2003 年在原始 SDT 实现期间引入,写入服务条目时未跟踪剩余空间。该漏洞潜伏了 23 年。
- CVE-2026-39215 (堆缓冲区溢出):2012 年在
update_mb_info()内部引入,逻辑错误允许后续调用在已分配缓冲区之外写入 12 个字节。 - CVE-2026-39216 (堆缓冲区溢出):2012 年在
img2enc.c中引入,因将安全的色度大小替换为无界的维度派生大小所致。 - CVE-2026-39217 (堆缓冲区溢出):2025 年 3 月 VP9 解码器中的近期回归问题,重构的大小更新函数导致 tile 线程缓冲区错过了必要的重新分配。
- CVE-2026-39218 (堆缓冲区溢出):2017 年在 DASH 解复用器中引入,因未能拒绝负持续时间值,导致片段数组索引变为负数。
已修复但未分配 CVE 的漏洞(通过内部 ID 引用)
- DFVULN-127 (堆缓冲区溢出):在 RTP AV1 解包器 (
rtpdec_av1.c) 中,av1_handle_packet()在跳过时间分隔符 OBU 时,输出写入位置前进obu_size,但未分配匹配空间,导致下一个 OBU 写入缓冲区边界之外。该缺陷自 2024 年 AV1 RTP 解包器首次添加以来一直存在。 - DFVULN-126 (堆缓冲区溢出):在 swscale 图代码 (
graph.c) 中,run_legacy_unscaled()错误处理隔行扫描 YUV420P 到 NV12 的转换:get_field()使平面行跨度加倍,导致ff_copyPlane的连续 memcpy 使目标 Y 平面溢出 576 个字节。2024 年随 swscale 新动态缩放 API 引入。 - DFVULN-125 (栈缓冲区溢出):在 RTP JPEG 解包器 (
rtpdec_jpeg.c) 中,jpeg_create_header()在 1024 字节的栈缓冲区中构建量化表部分;包含qtable_len >= 1024的精心构造的数据包会填满缓冲区,随后一个尾随的AV_WB16会在末尾之外写入两个字节。归咎于 2012 年的回归:JPEG 解包器落地几天后,重构将受限的表计数替换为无界的qtable_len / 64,允许足够的量化表溢出固定缓冲区。 - DFVULN-124 (堆缓冲区溢出):在 AVIF 叠加路径 (
ffmpeg_demux.c) 中,istg_parse_tile_grid()未能拒绝具有零条目标项的adimg引用;无符号回绕随后驱动对单字节堆分配的越界读取。2025 年添加自动 HEIF 条目标合并时引入。 - **DFVULN-123 (
