文章总结: 本文分析CVE-2026-94545漏洞,该漏洞影响Next.js的next/og组件,根因是上游Satori库SVG序列化层输出编码不当,导致SVG标记注入,可能升级为远程代码执行。影响Next.js16.2.0至16.3.5版本,修复版本为16.3.6。建议升级至修复版本并核对Satori依赖版本,临时缓解措施为停止将不可信参数传入SVG内容或切换Edgeruntime。 综合评分: 85 文章分类: 漏洞分析,代码审计,应急响应,安全工具
CVE-2026-94545 | Next.js next/og未授权远程代码执行漏洞(POC)
alicy alicy
信安百科
2026年10月4日 09:00 河北
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
免责声明:本漏洞技术细节均来源于公开可查证的安全研究资料,仅供安全研究与防御学习交流使用,严禁用于任何未经授权的测试;修复与排查操作请以厂商官方公告为准。
#
0x00、前言
Next.js 是 Vercel 维护的 React 全栈框架,全球数百万应用跑在它上面——官网、电商、SaaS 控制台,你每天大概率都会打开几个 Next.js 站点。除了页面渲染,它还内置一个不起眼但出场率很高的功能:next/og 的 ImageResponse,在服务端动态生成 Open Graph 分享图——链接发到微信、X、Slack 时弹出的那张预览卡片。实现路径是:Satori 库把 JSX/HTML 和 CSS 布局计算成一张 SVG,再交给下游组件栅格化为 PNG。
2026 年 9 月 22 日,Vercel 发布带外安全更新 v16.3.6(Active LTS)与 v15.5.26(Maintenance LTS),修复 CVE-2026-94545:Node.js 版 ImageResponse 的远程代码执行,CVSS 4.0 评分 9.5。Netlify 同日向平台客户发出通告。有意思的地方在于——这次的问题不在 Next.js 本体代码,而在它的上游依赖链:Satori 的 SVG 序列化层。
#
0x01、漏洞描述
CVE-2026-94545 的本质是输出编码不当(CWE-116):Satori 把 HTML/CSS 序列化为 SVG 时,多处插值点没有做 XML 转义。
攻击路径分四步——应用把用户可控的数据(URL 参数、表单、API 请求体)直接放进 ImageResponse 渲染的 SVG 内容、属性或样式;Satori 生成 SVG 时将其原样输出;攻击者用一个 " 或 </title> 就能突破 XML 结构边界,注入任意 SVG 节点;被污染的 SVG 随后进入下游解析与栅格化管线,触发其他上游依赖中的漏洞,最终可形成 SSRF、本地文件读取乃至 RCE。
利用前提有两点:必须是 Node.js runtime 的 ImageResponse 实现(Edge 实现不受影响),且应用确实把不可信数据渲染进了 SVG 的内容、属性或样式。
#
0x02、CVE 编号
官方 CVE 编号:CVE-2026-94545,关联 GitHub 公告 GHSA-vcvr-r3jv-pc5j(Next.js)与上游 GHSA-wx4j-mvgx-mqwp(Satori)。
漏洞类型:输出编码/转义不当(CWE-116)→ SVG 标记注入 → RCE
CVSS 4.0:9.5(Critical,Next.js 官方公告);上游 Satori 问题的直接影响评估与此不同
攻击向量:网络、未认证、无需用户交互
前置条件:Node.js runtime 的 ImageResponse + 不可信数据进入 SVG 内容/属性/样式
0x03、影响版本
受影响组件与版本范围如下(Satori 也可能被独立使用,单独列出):
| 组件 | 受影响版本 | 修复版本 | | — | — | — | | Next.js(Node.js 版 ImageResponse) | 16.2.0 – 16.3.5 | 16.3.6 | | Next.js 15.x | 不受 RCE 影响 | 15.5.26(仅纵深加固) | | Satori(独立使用) | 0.0.27 – 0.33.4 | 0.33.5 |
0x04、漏洞详情
4.1 漏洞点:Satori 序列化层的六处未转义插值
先看应用侧的典型形态。公告描述的受影响代码模式,就是”取一个请求参数,直接渲染进 SVG”——这类 OG 图接口在 Next.js 项目里非常常见:
// 动态 OG 图片生成路由(Node.js runtime)——公告描述的受影响模式
import { ImageResponse } from 'next/og'
export async function GET(request) {
const value = request.nextUrl.searchParams.get('value') // 攻击者可控
return new ImageResponse(
<svg><title>{value}</title></svg>, // 未经净化直接插入
{ size: { width: 1200, height: 630 } }
)
}
(代码较长,可左右滑动查看完整内容)
问题出在下游。公开验证实验室对照修复提交 satori@26a52aff 核对出根因:Satori 用 translateSVGNodeToSVGString()(位于 src/handler/preprocess.ts)序列化 <svg> 节点时,六个插值点全部裸奔:
| 插值点 | 未转义的后果 | 修复方式 | | — | — | — | | 文本节点(String(node) 返回值) | 原样写入 XML, 可直接闭合标签 | 统一经 escapeXMLText 转义 | | 属性值(引号内裸插值) | 一个双引号即可闭合属性、注入新属性 | 经 buildXMLString 转义 | | 属性名(裸插值) | 空格或引号可注入新的属性 | XML 名称合法性校验 | | style 值 | 原样插值进序列化输出 | 转义 | | 内嵌 SVG 的 data-URL 编码器 | 未编码 &,内层 XML 实体穿透外层 SVG 解析 | 编码修复 | | expand.ts 内部样式属性(_ 前缀) | 内部属性泄漏进序列化样式 | 拒绝序列化 |
4.2 注入与逃逸:从查询参数到 SVG 节点
以文本节点为例,注入的手法直白:闭合 <title> 标签,再塞进一个自己的 SVG 元素。验证实验室用的载荷形态如下(依据其公开验证描述还原示意):
// 闭合 title 标签,注入一个 500x150 的纯红矩形
value = </title><rect width="500" height="150" fill="#FF0000"/>
(代码较长,可左右滑动查看完整内容)
在漏洞版本的 Satori 里,这串字符原样进入序列化结果——注入的 <rect> 不再是文本,而是嵌入 SVG 文档里一个真实的图形元素;在修复版本 0.33.5 中,同样的载荷会被转义成 </title> 这样的无害文本。一个细节:载体刻意选了矩形而不是文字——渲染器里没有可加载的字体,注入文本即使成功也不可见,矩形才能让注入效果被”看见”。
4.3 从注入到 RCE:下游渲染链
注入本身只是第一步。Next.js 官方公告的措辞很讲究:”Satori 生成的 SVG 输出转义不当,可能因其他上游依赖中的漏洞导致远程代码执行。”也就是说,Satori 负责把 HTML/CSS 变成 SVG,随后还有一段 SVG 解析与栅格化(SVG→PNG)的管线,由其他上游组件承担——被注入的恶意标记正是打到这段下游管线上,触发其中未公开的漏洞,才升级为 SSRF、本地文件读取或 RCE。
这里要说明一个诚实的技术边界:公开验证实验室已把”注入原语”验证到端到端(用户输入 → 序列化 SVG → 栅格化输出),但 RCE 环节依赖的下游解析器漏洞细节并未公开,验证方也明确声明未演示文件读取、SSRF 或代码执行。所以准确的说法是:注入已被证明,RCE 链条成立与否取决于下游组件。
4.4 官方修复:统一的转义出口
Satori 的修复提交 26a52aff 做了一次结构性收口:把所有序列化路径统一路由到加固版的 buildXMLString()——值一律转义、XML 名称一律校验,不再允许任何裸插值。Next.js 侧的修复提交 868fad3 则把打了补丁的 @vercel/og 打包版本固定下来,同步更新 Satori 依赖定义。升级命令:
npm install [email protected] # 16.3 分支(Active LTS,修复 RCE)
npm install [email protected] # 15.5 分支(Maintenance LTS,仅加固)
升级后记得核对 lock 文件,确认 Satori 实际解析到 0.33.5 或更高。无法立即升级的环境,官方给出的临时缓解是:停止把不可信参数传入 SVG 内容、属性与样式——或者直接把 OG 生成路由切到 Edge runtime。注意,输入校验只能当缓解用,不能当修复用,SVG 解析的复杂行为随时可能绕过手工过滤器。
#
已关注
关注
重播 分享 赞
关闭
观看更多
更多
退出全屏
切换到竖屏全屏退出全屏
信安百科已关注
分享视频
,时长00:11
0/0
00:00/00:11
切换到横屏模式
继续播放
[ ]
进度条,百分之0
播放
00:00
/
00:11
00:11
倍速
全屏
倍速播放中
0.5倍0.75倍1.0倍1.5倍2.0倍
超清流畅
继续观看
CVE-2026-94545 | Next.js next/og未授权远程代码执行漏洞(POC)
观看更多
转载
,
CVE-2026-94545 | Next.js next/og未授权远程代码执行漏洞(POC)
信安百科已关注
分享点赞在看
已同步到看一看写下你的评论
视频详情
#
0x05、个人观察与判断
设计缺陷点评:六处插值各自裸奔、没有统一转义出口,是”默认不安全”的典型。修复引入 buildXMLString 统一收口才补上这一课——转义本应内建于序列化层,而不是指望每个下游开发者记得净化输入。
行业趋势:框架级 RCE 正越来越多地表现为上游依赖链问题——Next.js 本体无恙,Satori 加下游渲染组件的组合却致命。同一功能双实现(Node/Edge)攻击面不同,供应链审计必须下沉到传递依赖,而不是只盯直接依赖。
排查建议:全库检索 next/og、ImageResponse、opengraph-image 相关路由,重点盯带 query 参数的 OG 接口;确认 runtime 类型;升级 16.3.6/15.5.26 并核对 lock 文件里 Satori 的解析版本;暂不能升级的,停传用户输入或切 Edge runtime。
#
0x06、参考链接
1. Next.js 官方安全博客(2026-09-22 安全更新)
https://nextjs.org/blog/nextjs-security-update-september-22-2026
厂商公告 · 影响范围、升级命令与 Edge 实现边界
2. GitHub Advisory:GHSA-vcvr-r3jv-pc5j
https://github.com/vercel/next.js/security/advisories/GHSA-vcvr-r3jv-pc5j
CVE 官方公告 · 严重性评分与受影响版本范围
3. Github项目地址(CVE-2026-94545-nextjs-og-poc)
https://github.com/Hassham1/CVE-2026-94545-nextjs-og-poc
核心技术分析 · 根因核对、像素侧信道验证与版本对照
4.Github项目地址:
https://github.com/EQSTLab/CVE-2026-94545/tree/main
— END —
❤ 如果觉得有帮助,点个红心支持一下吧。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:信安百科 alicy alicy《CVE-2026-94545 | Next.js next/og未授权远程代码执行漏洞(POC)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论