内容提要
React Flight协议是React服务器组件用于流式传输UI的自定义协议,但其反序列化机制存在严重安全漏洞。CVE-2025-55182(React2Shell)为CVSS 10.0级漏洞,攻击者可通过构造恶意请求实现未授权远程代码执行。防御措施包括:严格输入验证、使用server-only包、加强CSRF防护、及时更新补丁、利用Taint API和WAF。该协议仍面临中间人攻击等结构性风险。
延伸解读
Flight协议为何成为反序列化攻击面
Flight协议并非简单的数据格式,它通过$前缀系统重建可执行行为,如模块引用、服务器动作和Promise链。这种设计使得解析器控制流完全由输入流驱动,攻击者一旦能影响流内容,就能控制解析器调用的函数和构造的对象。文章指出,这类似于Java的ObjectInputStream或Python的pickle,属于典型的反序列化风险模式。
React2Shell漏洞的根源与修复局限
CVE-2025-55182(React2Shell)源于getOutlinedModel函数在解析$:属性路径时未检查hasOwnProperty,导致攻击者可通过__proto__:constructor:constructor遍历原型链到达Function构造函数,实现远程代码执行。React团队的修复是缓存hasOwnProperty并强制使用.call()检查,但文章认为这仅修补了症状,未改变Flight协议暴露任意属性遍历的设计缺陷,未来可能仍有类似漏洞。
防御措施的优先级与局限性
文章按影响排序防御措施:首要的是在Server Actions入口进行严格schema验证(如Zod),并避免在验证前解构参数;其次使用server-only包防止敏感代码进入客户端,但需注意barrel文件可能绕过;CSRF防护需加强,尤其避免将'null'加入allowedOrigins;Taint API仅作为开发期护栏,无法追踪数据派生;WAF可拦截已知模式,但攻击者可用填充绕过。
后续漏洞与结构性风险
React2Shell之后,同一反序列化面又出现多个漏洞:CVE-2025-55184和CVE-2025-67779为DoS(无限递归),CVE-2026-23864为内存耗尽,CVE-2025-55183为源码泄露,CVE-2026-27978为CSRF绕过。文章还指出结构性风险:Flight流可被中间人篡改、服务器动作ID可被枚举、加密闭包可能被篡改、以及供应链激活风险,这些无法仅靠补丁解决。
Q&A
React Flight协议是什么?它和普通的JSON传输有什么不同?
React Flight协议是React服务器组件用于将UI流式传输到客户端的自定义协议。它采用行分隔的格式,包含自己的类型系统、引用解析和重建可执行行为的规则。与JSON只传输数据不同,Flight协议不仅描述UI外观,还指示客户端运行时加载哪些代码、调用哪些函数以及信任什么,因此它传输的是行为而非纯数据。
CVE-2025-55182(React2Shell)是什么?它的严重程度和影响范围如何?
CVE-2025-55182,又名React2Shell,是React Flight协议反序列化层中的一个严重漏洞,CVSS评分为10.0,属于未认证的远程代码执行漏洞。攻击者只需发送一个精心构造的HTTP请求到Server Function端点,即可获得shell访问权限,无需任何凭据。该漏洞影响React 19.0.0、19.1.0、19.1.1和19.2.0版本,涉及react-server-dom-webpack、react-server-dom-parcel和react-server-dom-turbopack。CISA已将其列入已知被利用漏洞目录。
React2Shell漏洞的根本原因是什么?攻击者是如何利用它实现远程代码执行的?
根本原因是Flight协议中的$:前缀系统允许任意属性遍历,而getOutlinedModel函数在遍历属性路径时缺少hasOwnProperty检查,导致攻击者可以通过构造类似$1:__proto__:constructor:constructor的路径,从普通对象一路遍历到Function构造函数,从而执行任意代码。攻击链包括:利用$:路径遍历到Function、使用$@获取原始Chunk对象、篡改.then属性实现Thenable劫持、覆盖_response._formData.get和_prefix,最后通过$B触发blob处理器调用Function执行命令。
针对React Flight协议的安全风险,有哪些有效的防御措施?
防御措施按影响排序:1. 在Server Actions入口使用Zod或Valibot进行严格的输入验证,使用.safeParse()而非.parse();2. 使用server-only包防止服务器端代码被客户端导入;3. 加强CSRF防护,设置SameSite=Strict或Lax,使用显式CSRF令牌,避免在allowedOrigins中添加'null';4. 确保React版本已修补(19.0.1+、19.1.2+、19.2.1+);5. 使用Taint API作为开发时的防护栏;6. 配置WAF检测已知攻击模式,但不要依赖它作为主要安全边界。
React2Shell漏洞修复后,还有哪些相关的安全漏洞?
修复后还发现了一系列相关漏洞:CVE-2025-55184(DoS,无限递归)、CVE-2025-67779(CVE-2025-55184的不完整修复)、CVE-2026-23864(DoS/OOM,zipbomb)、CVE-2025-55183(信息泄露,源码暴露)、CVE-2026-27978(CSRF绕过,Origin: null)。这些漏洞分别影响不同版本,需要及时更新到修复版本。
React Flight协议还存在哪些结构性风险?
结构性风险包括:中间人攻击(MITM)可篡改Flight流,注入恶意模块引用或修改组件属性;Server Action ID枚举,如果manifest暴露,攻击者可利用已知ID进行参数篡改;加密闭包篡改,如果加密密钥泄露,攻击者可修改闭包状态;供应链激活,通过注入模块ID加载未使用的恶意模块。这些风险源于协议设计本身,即使补丁修复了已知漏洞,这些风险依然存在。