面试官问:Next.js ImageResponse爆RCE漏洞,你项目用的16.3.2,怎么办?

周二下午两点,某头部电商公司的技术面,三面是安全架构师。前面聊了45分钟系统设计,节奏很舒服。然后他推了推防蓝光眼镜: "今天刚看到一个CVE,CVE-2026-94545,Next.js ImageResponse的RCE漏洞,CVSS 9.5。你们项目用的Next.js什么版本?" 我说16.3.2。 他眉毛一挑:"正好在受影响范围里,16.2.0到16.3.5都有。给你10分钟,告诉我你打算怎么处理。"

1.png

第一步:确认影响面。 CVE-2026-94545的根因在Satori库。Satori是某技术公司自研的HTML/SVG转图片引擎,ImageResponse在生成Open Graph社交预览图时调用它。问题是Satori在将动态值渲染到SVG时没有正确转义——攻击者可以通过URL参数、请求头或表单字段注入恶意SVG标记,触发服务端代码执行。 触发条件很具体:你的应用必须在生成图片时把用户可控的值嵌入SVG的内容、属性或样式中。典型场景包括:按页面标题生成分享卡片、按用户名生成头像卡、按商品名生成营销图。 我问了面试官一个关键问题:"我们的OG图片是怎么生成的?是静态的还是动态的?" 他说项目里两种都有。首页的OG是静态的,但商品详情页和用户个人页的OG是动态的——URL里带了商品名和用户名参数。 "那就是受影响最严重的场景。"我说。

第二步:紧急止血。 修复版本是16.3.6,9月22日发布的。但大版本升级不可能10分钟搞定,尤其是生产环境。我的止血方案

分三层: 第一层,WAF拦截。在Nginx或CDN层过滤OG图片请求URL中的SVG相关标签字符。<script、<foreignObject、这些关键词在OG图片的query参数里不应该出现。 第二层,代码层转义。在调用ImageResponse之前,对所有动态值做严格的HTML转义。用he库的encode方法或者DOMPurify做白名单过滤。 第三层,切换到Edge运行时。CVE-2026-94545只影响Node.js运行时的ImageResponse实现,Edge运行时不在受影响范围内。但Edge运行时功能有限,而且某技术公司已经标记Edge为弃用状态,这不是长期方案。

text
复制代码
面试官追问:"你说WAF拦截,但攻击者可以不用标签,直接用SVG的CSS样式触发漏洞。你怎么过滤?"

好问题。Satori的漏洞不仅限于SVG标签注入,还包括CSS样式注入。style="background: url(javascript:...)"这类payload在SVG上下文中可能被执行。 所以WAF层的规则需要更细粒度: 过滤所有包含<和>的OG图片请求参数过滤包含javascript:、data:、vbscript:等协议的值对OG图片请求做速率限制,防止自动化扫描 但说实话,WAF拦截是治标不治本。攻击面太大,规则很难写全。真正的修复只能是升级。 面试官再追问:"npm audit为什么没有报告这个漏洞?" 因为Satori是Next.js的内部依赖,不直接出现在项目的package.json里。npm audit扫描的是直接依赖和lockfile中的声明依赖,但Satori是通过next→@vercel/og→satori这条链路引入的。在npm的依赖解析中,Satori被hoist到了node_modules的深层目录,npm audit的规则没有覆盖到它。 这也是供应链安全的一个典型问题:transitive dependency的漏洞往往是最难发现和修复的。

text
复制代码
对了。顺嘴提一句,技术大厂,前后端-测试[机会](https://jsj.top/f/mx4wQA) ,全国一线及双线城市均有坑位,待遇和稳定性还不错,感兴趣看看。

我在项目中加了一个weekly的npx better-npm-audit检查,它比npm audit更深入。另外我还会关注某代码托管平台 Security Advisories,某技术公司的GHSA-vcvr-r3jv-pc5j是在9月22日发布的,如果项目配置了Dependabot,理论上当天就能收到通知。 面试官第三次追问:"16.2.x没有回迁修复,你有个老项目还跑在16.2.4上,怎么办?" 这是个真实困境。16.2.x这条线某技术公司没有出补丁,只能升级到16.3.6。但大版本升级可能有breaking changes。

text
复制代码
我的方案是:

先在staging环境升级到16.3.6,跑完整E2E测试重点关注ImageResponse的调用点,确认输出格式没变如果升级风险太大,临时方案是把动态OG图片改成预渲染的静态图片——商品详情页的OG图在商品发布时就生成好存到CDN,不再在请求时动态生成 方案3虽然牺牲了灵活性,但彻底消除了攻击面。对于核心交易链路,安全性优先于灵活性。

text
复制代码
反思:

这个漏洞给我最大的教训是:前端框架的安全更新必须纳入日常运维流程。以前我们只关心后端依赖的安全补丁,前端依赖觉得"反正是客户端跑的"。但Next.js这类框架大量使用SSR,服务端代码执行漏洞的影响跟后端漏洞一样严重。 CVSS 9.5是什么概念?跟Log4Shell同级。而且是零认证、零交互、可远程利用。 从发布CVE到修复版本发布,某技术公司用了大概一周。但从修复版本发布到所有受影响项目升级,可能需要几个月。这个时间差就是攻击者的窗口期。 我那天面完试回家第一件事就是把项目的Next.js升到了16.3.6。升完跑了一遍测试,没什么问题。 但我心里清楚,下一个CVE迟早会来。重要的是你有没有一套机制能在24小时内响应。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP