返回 文章 apply CMS 文章

Next.js 图像优化中的 libheif RCE 漏洞:从复现到上游修复的完整过程

一次跨依赖链的漏洞复现、披露与修复的完整案例复盘。

Next.jslibheifRCE漏洞披露
成长分 / 100 76 综合收获、行动、留存与影响

Next.js 图像优化中的 libheif RCE 漏洞:从复现到上游修复的完整过程
为什么值得读了解一个真实 RCE 漏洞如何从 Next.js 图像优化追溯到上游 libheif,并理解依赖链的复杂性。

学习 Vercel 与 Hacktron 如何协调披露、平台缓解与上游修复,以及时间线管理。

关键洞察
  1. 漏洞代码不在 Next.js 本身,而在上游 libheif,但可通过 Next.js 图像优化触达。
  2. 依赖链为:<Image> → /_next/image → sharp → libvips → libheif。
  3. Vercel 通过中央图像优化服务禁用 AVIF 优化和缩放,实现平台范围缓解。
转成行动

深入阅读

正文与原文对照

原文保真覆盖:全文原文字符:7089

2026 年 8 月,Hacktron 报告了一个看起来像是 Next.js 图像优化中的远程代码执行(RCE)漏洞。他们的调查发现,存在漏洞的代码并不在 Next.js 本身,而是在上游的 libheif 中。libheif 是一个 AVIF 图像解码器,被 Next.js、ImageMagick、WordPress、sharp 以及网络上的许多项目所使用。

Hacktron 通知我们之后不久,我们便与他们合作,针对当前的 Next.js 构建复现了该 RCE,并向 sharp、libvips 和 libheif 的维护者披露了漏洞。随后,我们在 Vercel 上部署了平台级缓解措施,并开始与维护者一起推进修复。

依赖链

Next.js 图像优化允许应用通过 <Image> 组件(next/image)调整图像尺寸并优化图像。对于 AVIF 图像,图像处理的依赖链如下:

  • <Image> 调用 /_next/image,
  • /_next/image 调用 sharp
  • sharp 调用 libvips
  • libvips 使用 libheif 解码图像

Next.js 中 libheif 漏洞的完整依赖链。

Next.js 中 libheif 漏洞的完整依赖链。

Next.js 中 libheif 漏洞的完整依赖链。

Next.js 中 libheif 漏洞的完整依赖链。

Next.js 中 libheif 漏洞的完整依赖链。

这意味着存在漏洞的代码虽然不在 Next.js 中,却仍可通过 Next.js 图像优化触达。发送到图像优化端点的恶意 AVIF 图像,会经由 sharp 和 libvips 调用 libheif。

因此,一个显而易见的缓解办法是在 Next.js 中禁用 AVIF 优化。这样,恶意 AVIF 图像就会止步于图像优化端点,而不会经由 sharp 和 libvips 传给 libheif,漏洞利用也就不会向上游传播。

然而,只在 Next.js 层面缓解而没有上游修复,会带来披露方面的问题。

披露漏洞并协调上游修复

在与 Hacktron 合作成功复现问题之后,我们在 Vercel 上推出了平台级缓解措施,并联系 sharp、libvips 和 libheif 的维护者披露漏洞,着手推进修复。

时间线如下:

  • 8 月 11 日至 12 日:Hacktron 向 Vercel 报告该问题;Hacktron 与 Vercel 借助可用的概念验证复现了该 RCE。
  • 8 月 13 日:Vercel 通过其图像优化服务(Image Optimization Service)应用了平台缓解措施。
  • 8 月 19 日:Next.js 团队与 libvips 维护者会面,并开始在 sharp、libvips 和 libheif 之间展开协调。
  • 8 月 24 日:Next.js 通知了其安全合作伙伴。
  • 8 月 25 日:Next.js 发布了禁用 AVIF 优化的安全版本。

Vercel 安全团队通过电子邮件联系了 sharp 和 libvips 的维护者,并通过 GitHub 安全公告(GitHub Security Advisory)与 libheif 展开协调。Hacktron 也已向 libheif 提交了漏洞和利用的详细信息。8 月 19 日,Next.js 团队与 libvips 维护者会面,并就 sharp、libvips 和 libheif 之间的后续路径达成一致。libheif 维护者则通过 Hacktron 的 GitHub 安全公告继续推进修复。

8 月 24 日,Next.js 向其安全合作伙伴通报了 libheif 漏洞及其对 Next.js 的影响(通知合作伙伴是 Next.js 安全发布流程中的例行环节)。

8 月 25 日,也就是 8 月 19 日会面的六天后,libheif 维护者发布了 v1.23.2,修复了该 RCE。

Vercel 与 Next.js 的缓解措施

保护 Vercel 及其客户的做法很直接:Vercel 上所有 Next.js 图像优化请求都会经过一个集中的图像优化服务。因此,我们在该集中服务中禁用了 AVIF 优化和缩放。任何传入的 AVIF 图像都不会交给 libheif 解码,因此在 Vercel 上无法实现 RCE。

保护自托管应用则需要发布 Next.js 新版本。8 月 25 日,Next.js 发布了一个安全版本,该版本原本计划用于解决另一个问题。在协调上游修复之后,我们把 AVIF 缓解措施并入该版本,比原计划提前一天发布。该版本在 Next.js 中禁用了 AVIF 优化和缩放;鉴于已修复的 libheif 版本仍在向下游传播,这是最及时的选择。我们还发布了一份安全公告,以说明该问题的严重程度。

我们让网络更安全的承诺

被发现的开源软件漏洞数量持续攀升,数字之大令人不堪重负:

随着 LLM 加速漏洞研究,我们预计开源生态中会出现更多像 libheif RCE 这样的上游漏洞。近几个月来 Next.js 安全版本的发布数量有所增加,随着我们缓解由我们自己和研究社区发现的新漏洞,预计这一趋势还将持续。

我们致力于抢在攻击者之前主动发现漏洞,负责任地披露我们发现的一切,并与研究人员和维护者合作修复。

致谢

感谢 Hacktron 负责任地披露 AVIF 漏洞,与我们合作复现问题,并在修复过程中与上游维护者保持协调。

我们还要感谢 sharp、libvips 和 libheif 的维护者。他们在上游修复上的工作,使整条图像处理依赖链上的协同修复成为可能。

我们通过 Vercel 开源漏洞赏金计划与一批才华横溢的研究人员合作,保障 Next.js 及其他开源框架的安全。欢迎任何有意为符合条件的框架的安全做出贡献的人参与其中。

参考资料