近日,React 核心团队确认了一个存在于 React Server Components (RSC) 实现中的严重远程代码执行 (RCE) 漏洞。该漏洞被分配了 CVE-2025-55182(Next.js 对应编号 CVE-2025-66478),攻击者无需任何身份验证,仅通过一个 HTTP 请求,即可在你的服务器上执行任意代码。
该漏洞烽火台实验室日前已做了相关预警:
https://mp.weixin.qq.com/s/djibDduH3bluVXHDSLAsSg
官方公告中提到,该漏洞由Lachlan Davidson 在Lachlan Davidson11 月 29 日 进行报告:
https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
在作者的github中,也贴了这样一个链接,说明了该漏洞的局限性。
https://react2shell.com
对源码进行分析,在server.js中,当请求/formaction会进入如下:
注释很明显,主要关注decodeAction函数,decodeAction函数的实现位于node_modules/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js中,接收body和serverManifest。当表单名以$ACTION_REF_123 开头,则截取$ACTION_REF_123 中的123,然后重新拼接为$ACTION_123: 作为value,然后将body、serverManifest、value作为参数调用decodeBoundActionMetaData方法。
进入到decodeBoundActionMetaData方法中,会获取所有以$ACTION_123:开头的表单项;
然后调用getChunk(body, 0) 获取表单名称为$ACTION_123:0 的内容;
随后会用serverManifest,value.id,value.bound作为参数调用loadServerReference函数,根据serverManifest找到对应函数,预加载模块,然后把它封装成一个真正可调用的 JS 函数,绑定参数。
在resolveServerReference 中,先通过id在manifest 中获取resolvedModuleData,再拿到保存的name,也就是通过模块名拿到resolvedModuleData,然后再调用resolvedModuleData.name去拿函数名进行返回;如果没获取到则会通过#进行切割id,#前作为模块名,#后则作为函数名进行返回。
随后调用preloadModule,在moduleExports中,保存该模块的所有函数,可以通过resolveServerReference 中处理后得到的函数名来获取进行返回,而函数名我们可以通过fs#writeFileSync来指定绕过manifest 中的限制来调用其他函数。
总结一下,这个漏洞实际上是绕过serverManifest中的对某个模块的特定方法的调用,如该项目中指定了fs的readFileSync方法可以调用,实际上可传入fs#writeFileSync来调用其他方法。
Ddpoc上提供了该漏洞的验证环境,访问第一个镜像。
https://www.ddpoc.com/vulenv.html
点击启用,生成一个容器环境(15分钟内自动销毁)
# 漏洞分析
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)