核心内容摘要
别样童趣:当“熊孩子”遇上“高能班主任”,网络热议“神操作”视频集锦
React服务器组件(RSC)协议中的严重漏洞CVE-
仓库概述我创建这篇博客是因为没有找到任何向真正了解React但无法理解此问题的初学者解释该漏洞的博客。
本文纯粹用于教育目的。
此问题的根源在于Next.js中React服务器函数处理客户端与服务器之间数据块的方式存在安全缺陷。
以下是逐步概述以及数据块如何涉及
React服务器函数中的数据处理背景React服务器函数充当客户端和服务器之间的通信桥梁使客户端能够向服务器发送数据请求。
对这些请求的响应使用所谓的React Flight协议其中数据块被传输到服务器进行反序列化。
数据块这些是在客户端和服务器之间传递的小块数据。
数据块可以相互引用这种引用告诉服务器如何高效处理复杂数据。
为什么React Flight协议很重要服务器组件允许React应用程序将某些操作卸载到服务器。
Flight协议通过定义数据如何在客户端和服务器之间编码、传输和解码来实现这一点。
关键特性基于块的序列化数据以块的形式传递这些块可以相互引用并包含嵌套数据结构。
紧凑格式针对低延迟进行了优化减少了通过网络传输的数据量。
客户端-服务器互操作客户端发送数据请求服务器使用表示React组件或数据的序列化块进行响应。
React Flight协议的优势效率紧凑的序列化实现了快速的服务器到客户端通信。
流式传输由于数据以块的形式传输浏览器可以在初始块到达后立即开始渲染。
引用支持得益于块引用如$
$2React Flight可以传递复杂的树状结构而无需重复数据。
Press enter or click to view image in full sizeCVE-
中利用的弱点在CVE-2025–55182的背景下Flight协议存在一个漏洞它在反序列化过程中没有充分验证块引用。
这使得攻击者可以制作恶意块来访问敏感的JavaScript对象包括对象的原型并执行任意代码。
例如如果块0是{then:$1:__proto__:constructor:constructor}这将导致服务器调用构造函数从而导致任意代码执行。
反序列化如何发生以下是发送到服务器的示例有效载荷files{0:(None,[$1]),1:(None,{object:fruit,name:$2:fruitName}),2:(None,{fruitName:cherry}),}文件0引用$1块1。
文件1引用$2:fruitName块2中的水果名称。
文件2提供实际值{“fruitName”:“cherry”}。
当服务器处理这些块时它们会组合成类似这样的内容{object:fruit,name:cherry}
漏洞利用是什么该漏洞的核心是React在尝试访问键如fruitName之前没有验证该键是否实际存在。
这个疏忽允许攻击者访问敏感的JavaScript对象如对象原型其中包含危险的方法。
攻击者使用特殊格式的数据块有效载荷来绕过安全性并侵入性地访问服务器。
以下是恶意有效载荷files{0:(None,[$1:__proto__:constructor:constructor]),1:(None,{x: 1}),}这在服务器上转换为以下对象[Function:Function]发生了什么__proto__路径访问对象原型。
原型上的constructor检索构造函数。
再次附加constructor会创建函数构造函数在此阶段攻击者可以访问允许执行任意JavaScript代码的工具Function。
触发任意代码执行然后攻击者可以确保恶意块的数据以服务器将其作为可then对象类似Promise的对象调用的方式返回。
以下是实现此目的的有效载荷files{0:(None,{then:$1:__proto__:constructor:constructor}),1:(None,{x:1}),}这在服务器上创建一个可then对象类似Promise的对象function() { [native code] }
组合实现远程代码执行(RCE)攻击者使用可then方法通过调用小工具来执行自己制作的JavaScript代码。
具体来说他们以重新评估自身的方式制作块称为虚假块。
用恶意代码替换then处理程序。
服务器最终等待返回的恶意代码并执行它。
以下是最终制作的有效载荷files{0:(None,{then:$1:__proto__:then,status:resolved_model}),1:(None,$
,}在此示例中then被覆盖。
resolved_model触发另一个评估周期反序列化。
攻击者覆盖服务器的函数并使用调用小工具来推送自己的远程代码执行有效载荷。
代码修复通过添加确保接收的数据无法访问原型的检查来修补该漏洞。
具体来说if(hasOwnProperty.call(moduleExports,metadata.NAME)){returnmoduleExports[metadata.NAME];}returnundefined;这确保仅访问显式对象属性阻止原型污染。
漏洞成功利用的原因松散的验证React的flight协议在检索值之前没有验证键是否存在。
这允许滥用__proto__和constructor。
Promisethen方法使用可then对象使得将恶意代码链接到看似有效的服务器流程变得容易。
动态评估服务器的代码动态解析和处理对象。
这被利用来运行任意代码。
CSD0tFqvECLokhw9aBeRqgogYUG9/yr4cbJrLtRx1UHTPT620wqVETV/UVJ80k4HJPZ15Uv3YXxcJ7YeWVBlx9a0pGuxC3mTzErVuZUztYcmoaGjBeAn5lsEw/gNdOsq3M2WEAJjKdTtaP4aaHeA更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号网络安全技术点滴分享