视频:AI Did This. 来源:Low Level 发布日期:2026-06-12
有人用人工智能在 FFmpeg 里挖出了 21 个零日漏洞,但他既没用 Anthropic 的 Mythos,也没烧掉两万美元。这件事本身就值得底层安全圈停下来想一想:撑起半个互联网的那块多媒体地基,被一个智能体加一套测试流程,花了大约一千美元就撬开了 21 道口子。

Low Level 作者先把 FFmpeg 的分量讲清楚:它是几乎全部用 C 写成、夹杂少量内联汇编做性能优化的多媒体库,负责格式转换、播放、推流。YouTube、TikTok、Twitch、Instagram 这类平台的背后,多多少少都压着 FFmpeg。那张著名的梗图把它画成顶起整个互联网的那块积木,并不算夸张。
作者特意强调一句反直觉的判断:这不是水平问题。FFmpeg 的开发者是世界上最顶尖的一批人,代码质量是业界标杆。但只要是 C 写的代码库,体量够大、参与的人够多,出漏洞几乎是语言层面注定的,是时间问题,不是能力问题。
21 个洞,本质都是同一类病
这 21 个漏洞清一色带着某种溢出——栈溢出、堆溢出、整数溢出,全是 C 代码库解析用户数据时的经典毛病。
作者拿 BMP 格式举例:图像高度、宽度、每像素位数、每米像素数这些字段,任何一个都可能是恶意构造的。它们都要参与某种算术运算,算出真正像素数据在内存里的位置。只要某个字段没被正确校验,运算就可能上溢或下溢,结果就是访问到图像数据数组边界之外的内存。道理朴素,杀伤力却实打实。
时间跨度才是吓人的地方。有些洞 2023 年才随新格式实现引入,但其中一个栈缓冲区溢出可以追溯到 2003 年最初的 SDP 实现——它静静躺了 23 年。更扎心的是,Google 的 Big Sleep、OSS-Fuzz 这些常年靠 AI 和开源模糊测试去刨 FFmpeg 的项目,始终没把它翻出来。
一个简单到离谱的 RTSP 远程洞
博客作者重点拆的那个洞,作者直接说"crazy simple"——只要让 FFmpeg 去接一条 RTSP 流就能触发。你看 Twitch、看 YouTube 直播,背后基本就是播放器在读 RTSP 流,RTSP 推出 RTP 这种实时协议来传视频音频数据。攻击面就藏在这条最日常的链路里。
机制是这样的:从 RTSP 服务器收到包时,包里带着包大小,软件还用一个游标记录当前处理到包的哪个位置,就像 for 循环遍历数组时的下标。FFmpeg 解析包内的 OBU 数据时,每处理一个字节就调用一次 av_grow_packet,一边把数据写进 packet data、一边扩容、一边推进游标。
问题出在 AV1 的 temporal delimiter(时域分隔符)。按规范,收到 temporal delimiter 应该直接丢弃、跳过。代码确实跳过了:它把包位置往后推了 OBU 大小、把剩余数据减掉 OBU 大小、把已处理 OBU 计数加一——唯独没有调用 av_grow_packet。
后果是连锁的:游标被推到了 packet data 的边界之外,而后续另一个 OBU 在调用过 av_grow_packet之后,会把用户控制的数据写到那个越界位置。于是攻击者能把自己控制的数据,精确地写到分配区末尾往后 67 字节处——一个标准的堆溢出。
从一个越界写,到把 RIP 设成 deadbeef
作者顺着讲了堆溢出怎么变成代码执行,这部分是底层安全的硬核。光有越界写还不够,你得做堆布局(heap grooming),在那个越界位置精确摆上一个值得攻击的对象或结构体:想泄露数据就摆要泄露的数据,想覆盖函数指针就摆函数指针。
而 FFmpeg 里现成就有这么个理想目标——AVBuffer结构体。它内部有数据指针、大小字段(适合做任意读写),更关键的是一个负责释放 buffer 数据的函数指针。把 AVBuffer布到堆上合适位置,溢出覆盖它,就能劫持那个函数指针,最终拿到代码控制权。
当然,真实利用还得绕过 ASLR、指针认证等一堆缓解措施。但作者点明:这个基本原语,正是过去三十年漏洞利用一贯的套路。而且为了致敬 Pwn or GTFO,博客作者在栈回溯里把 RIP 直接设成了 0xdeadbeef,明示自己已经握有 FFmpeg 内的代码控制原语。
为什么模糊测试和 AI 之前都漏了它
这里有个值得每个安全从业者记住的判断:触发条件简单到不可思议——发一种特定的包,让包涨大,就能写到另一个包的边界外。跑一遍这个包、再跟一个包,配合 ASan 这类工具,越界写本该立刻触发崩溃。
作者给出的推测很关键:OSS-Fuzz 那批模糊测试器很可能压根没把 FFmpeg 的 RTSP 客户端当作目标。因为用 RTSP 时,你多少"信任"自己连的那台服务器——它被默认当成可信面,于是逃过了模糊测试的火力覆盖。这恰恰是被忽视的攻击面最危险的地方。
而研究者用 AI 做的事,作者总结为识别不变量(invariant):盯着这类包看,很容易发现它是唯一一个不经 av_grow_packet扩容的包——这个异常点,正是人工智能擅长揪出来的。
真正的差距是"测试框架",不是话术
视频后半段才是 Low Level 想敲给开发者和安全研究者的钉子。Anthropic 的 Mythos 写得很漂亮,但他们那篇报告说,烧掉约两万美元,才在 FreeBSD 里找到一个 DoS 漏洞;而这位研究者用非 Mythos 模型、约一千美元,挖出了 21 个。
作者自己也用 Opus 47、Sonnet 47 这类更早的模型做过漏洞研究,结论是:它们找漏洞已经相当能打。难点根本不在"怎么跟 AI 说话"的措辞。他特意泼了盆冷水:别迷信 prompt 用词。
真正的功夫在两件事:一是把问题切到 AI 能真正吃下的粒度,二是给它工具去证明自己真解出来了。因为 AI 有上下文问题——你把整个代码库甩过去说"帮我找零日",它只会迷失在里面,还会吐一堆误报。
作者借 Cloudflare 那篇关于 Glasswing 的博客,点出了"漏洞发现 harness(测试框架)"这个说法。流程大致是:先给 AI 做代码库踩点(recon),再喂给它一个小函数或单个文件问"这里有没有可能出问题";如果有,再往外扩展判断这个 bug 是否真的可达;最后套一层 ASan harness 或 fuzzer,验证能不能真正命中它。
他强调这套流程其实就是人类做漏洞研究多年的老办法,只是现在有了近乎自动化、能规模化跑的版本——而且不依赖 Z3、angr 这类 SMT 求解器需要的硬数学建模,用 AI 在更高层面把这些问题趟过去。
夜雨聆风