Next.js 两个 9.5 分漏洞:一个在缓存,一个在图片

两个 9.5 分,两条几乎不重叠的路

10 月 14 日,Vercel 一次性放出了两个修复版本:16.4.1 和 15.5.28。同一批公告里,两个漏洞的 CVSS 4.0 评分都是 9.5,都叫「未认证远程代码执行」,但触发条件差得远——一个要 16.x 的开缓存,一个从 10.x 一直影响到 15.x,而后者跟你写没写业务代码几乎无关。

10 月 20 日,新加坡 CSA 发了安全警报,把两个编号一起点名(GHSA-673q-mjm6-r5xr 与 CVE-2026-96889)。如果你还没升,现在正好。

第一个:缓存返回值里的 typed array

受影响的是 App Router 且开了 Cache Components 的 16.x(16.0.0 到 16.4.0)。条件是:某个 use cache 函数返回了多个 typed array(Uint8Array、Float32Array 这类),未认证请求就能打到 RCE。

官方给的处理意见很干脆:没有 workaround,就算你没有这种函数也要立刻升级。关联的上游公告在 React 那边(GHSA-xqc2-xf4c-x3h3),Vercel 只是先被暴露的那个。

这里有个值得留意的方向:use cache 的返回值是要被序列化进缓存层的。一个「序列化 / 反序列化」的边界,配上多个 typed array 这种带长度和内存布局的输入,出问题并不意外。官方没有公布细节,所以再往下就只能猜——但「缓存后端变成了不可信输入的解析器」这个结论,已经够解释严重度了。

第二个:SVG 进了图片优化

这条影响面宽得多:10.0.0 到 15.5.27,加上 16.0.0 到 16.4.0。条件是 Next.js 跑在 glibc 的 Linux 上、用了内置的 Image Optimization、并且能处理 SVG。

根因不在 Next.js 本身,而在它依赖的图像处理库——内存相关的缺陷,落到 RCE。这也解释了为什么修复版本会同时约束 sharp 的版本:把 Next.js 升上去,包管理器才会自动给你装修好的 sharp。

临时缓解只有一个:确保 sharp 不低于 0.35.5。注意它只盖住这一条,不盖住上面那条缓存的问题。

三条命令自查

# 当前项目实际跑的版本(别只看 package.json 里写的)
node -e "console.log(require('next/package.json').version)"

# 看 next 和 sharp 的解析结果
npm ls next sharp

# 有没有开后缓存(16.x 才有意义)
grep -rn "cacheComponents" next.config.* 2>/dev/null

判断口径:

  • 15.x 及更早:只要版本低于 15.5.28,图片那条就成立,直接升级;
  • 16.x 低于 16.4.1:两条都成立,没有例外;
  • 开了 cacheComponents 又低于 16.4.1:别评估了,先升。

另外一件容易被忽略的事:很多自建站把 Next.js 放在 Caddy 或 Nginx 后面,/_next/image 是对公网开放的。也就是说,这类漏洞的暴露面不取决于你有没有「上线那个功能」,而取决于这个端点有没有被挡住。

sharp 是这件事里最容易踩的坑

常见的几种「升级了但没修好」:

  • package.json 里写着 next: "^15.5.0",锁文件却还停在 15.5.20——升级只改了声明,没改解析结果;
  • 项目里手动 pin 了一个旧 sharp(为了兼容某个插件),把 Next.js 自动带的新版本顶回去了;
  • 只在本地升了,镜像还是老层——Docker 构建缓存没失效,跑起来的还是旧代码。

所以升完别只看 package.json,看 npm ls 的实际解析,再看构建产物里的版本。Docker 部署的话,--no-cache 重建一次比讲道理快。

框架自带的端点,正在变成新的暴露面

这两条放在一起看,指向的是同一件事。图片优化、开缓存这类框架内置能力,默认对公网开放,默认不需要你写任何代码,也基本不在业务代码的审计范围里。你审自己的接口审得再细,也审不到 /_next/image 的解码器。

对自建的人来说,能做的其实很朴素:把 /_next/image 当成一个对外服务来对待——限速、限制来源、只放行需要的格式,出问题时能一键关掉。真出事那天,这几行配置比任何「已及时升级」的说明都有用。

参考来源

延伸阅读

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像/SUENCA
欢迎您留下宝贵的见解!
提交
头像/SUENCA

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容