当前位置: 首页 > news >正文

React Native Community CLI命令执行 | CVE-2025-11953 复现研究

0x0 背景介绍

React Native 社区 CLI 启动的 Metro 开发服务器默认绑定到外部接口。该服务器暴露了一个存在操作系统命令注入漏洞的端点。这允许未经身份验证的网络攻击者向服务器发送 POST 请求并运行任意可执行文件。在Windows系统上,攻击者还可以执行带有完全控制参数的任意 shell 命令。

0x1 环境搭建

1.Win10环境复现

  • 安装Node
  • 下载Node传送门node-v24.11.0-x64.msi
  • 官方地址:官网下载页面

2.项目配置

PS:我这里是通过降级的版本还原的环境,貌似可以直接指定cli版本,大家可以研究下

  • 预安装项目
npx @react-native-community/cli init MyApp --version 0.82.1
  • 成功后进行拉取资源
cd MyApp
npm install
  • 这里启动与否没有必要, 这时项目的cli版本是 20.0.0版本,无法复现,如下:
npm list @react-native-community/cli-server-api
MyApp@0.0.1 C:\Users\txt\Desktop\MyApp
`-- @react-native-community/cli@20.0.0`-- @react-native-community/cli-server-api@20.0.0

3.降级搭建

  • A.所以修改下项目中的package.json文件,降级cli版本!
    "@react-native-community/cli": "19.1.0","@react-native-community/cli-server-api": "19.1.0",
  • B.删除package-lock.json文件并清空node_modules文件夹
  • C.这时候在重新拉取,就可以启动项目了
npm install
npm start

成功启动

0x2 漏洞复现

手动复现步骤

  • 命令行进行curl探测
    弹出计算器

  • cli控制在20.0版本-我当时搭建13.xx版本貌似也无法复现,追查源码是不同的
    20.0版本

YML检测

https://github.com/Kai-One001/cve-/blob/main/React_native_cI_cve_2025_11953.yml

xray

复现流量特征 (PACP)

0、弹出计算器

弹出计算器

2、写入文件
写入文件
3、其它操作·打开默认浏览器访问网站
打开浏览器

4、其它操作·创建用户-失败
反思可能是权限的问题,使用管理员运行项目也无法创建,可能Node.js(或者 Metro)进程权限有关系
创建用户

5、发现一些其它接口-open-stack-frame,貌似是用于在编辑器中打开源码文件,估计有其它手段(谨慎组合拳)
二进制打开文件

0x3 漏洞原理分析

漏洞定位:从补丁反推攻击面

  • ╰(°▽°)╯太喜欢有补丁提交的项目了,直接查看最新变动文件,锁定文件
  • 漏洞文件:openURLMiddleware.ts
  • 文件位置:packages/cli-server-api/src/openURLMiddleware.ts
/*** Copyright (c) Facebook, Inc. and its affiliates.** This source code is licensed under the MIT license found in the* LICENSE file in the root directory of this source tree.*/import type {IncomingMessage, ServerResponse} from 'http';import {json} from 'body-parser';
import connect from 'connect';
import open from 'open';/*** Open a URL in the system browser.*/
async function openURLMiddleware(req: IncomingMessage & {// Populated by body-parserbody?: Object;},res: ServerResponse,next: (err?: Error) => void,
) {if (req.method === 'POST') {if (req.body == null) {res.writeHead(400);res.end('Missing request body');return;}const {url} = req.body as {url: string};await open(url);res.writeHead(200);res.end();}next();
}export default connect().use(json()).use(openURLMiddleware);
  • 注意open函数,逻辑大体是接收 POST JSON 请求,提取 url 字段,未见任何限制
  • 调用open(url) 打开该 URL(预期是 https://... 或 http://...
  • 安全编码基本原则:永远不要信任用户输入

顺腾摸瓜

  • 在项目中查询cli所使用的版本是6.4.0
E:\MyApp>npm list open
MyApp@0.0.1 E:\MyApp
+-- @react-native-community/cli-server-api@19.1.0
| `-- open@6.4.0
`-- react-native@0.82.1`-- @react-native/community-cli-plugin@0.82.1`-- @react-native/dev-middleware@0.82.1`-- open@7.4.2
  • 然而openwin项目的特性是cmd启动传入的参数,只此一项结合cli的完全信任用户输入参数,导致漏洞产生
当调用 open(userInput) 时,open@6.4.0 内部执行如下操作
1、选择命令解释器方式为“cmd”模式运行
2、构造参数数组-cliArguments数组:['/c', 'start', '""', '/b']
3、转义 & 和 ^,这target string是项目中传入的。
4、target将字符串添加到cliArguments
拼接并执行命令:
childProcess.spawn(command, cliArguments, childProcessOptions);
childProcess.spawn('cmd', ['/c', 'start', '""', '/b', target], options);
  • 由于 使用open()时也没有区分“URL”与“本地命令”,就可以构造恶意 payload,如:
{"url": "cmd /c echo abc > C:\\Windows\\Temp\\proof.txt"} 
最终触发命令:
cmd /c start "" /b cmd /c echo abc ^> C:\Windows\Temp\proof.txt

接口暴露根源:无鉴权的中间件注册

  • 到项目根下找路由,定位到文件:packages/cli-server-api/src/index.ts
  • 关键代码片段如下:
xport function createDevServerMiddleware(options: MiddlewareOptions) {const messageSocketEndpoint = createMessageSocketEndpoint();const broadcast = messageSocketEndpoint.broadcast;const eventsSocketEndpoint = createEventsSocketEndpoint(broadcast);const middleware = connect().use(securityHeadersMiddleware(options))// @ts-ignore compression and connect types mismatch.use(compression()).use(nocache()).use('/', indexPageMiddleware).use('/open-stack-frame', openStackFrameMiddleware(options)).use('/open-url', openURLMiddleware).use('/status', statusPageMiddleware)// @ts-ignore mismatch.use('/systrace', systraceProfileMiddleware).use('/reload', (_req: http.IncomingMessage, res: http.ServerResponse) => {broadcast('reload');res.end('OK');})
  • 未添加任何身份认证(Authentication)或来源限制(如 Host/Origin 校验)

  • 所有注册的中间件(包括 /open-url)对任意 IP HTTP请求开放

  • 完整的攻击数据流如下:

[]│↓ POST /open-url {"url": "cmd /c calc"}
[React Native Metro Server (localhost:8081)]│↓ 路由匹配 → index.ts 中注册的 openURLMiddleware↓ 提取 body.url(无校验)↓ 调用 open(url) → open@6.4.0↓ 构造 cmd /c start "" /b cmd /c calc↓ childProcess.spawn() → 执行系统命令
[Windows System]│↓ 弹出计算器(RCE 成功)

0x4 修复建议

修复方案

  1. 升级到安全版本:厂商已提供漏洞修补方案github-cli-20.0.0
  2. 临时缓解措施:
    强制只监听本地回环地址: npx react-native start --host 127.0.0.1
    防火墙限制 8081 端口: 非必要不开放
    使用 WAF 规则拦截 敏感命令

免责声明:本文仅用于安全研究目的,未经授权不得用于非法渗透测试活动。

http://www.dtcms.com/a/578453.html

相关文章:

  • 大厂做网站shijuewang如何用ps做创意视频网站
  • 公司设计网站电商毕业设计作品
  • 如何利用天燃气分析仪优化管网能效与安全
  • 考研408--计算机网络--day3--通信基础信道编码与调制
  • 许昌市建设信息网站win7电脑做网站
  • 7.无监督学习
  • 深圳软装公司排名前十强广州各区正在进一步优化以下措施
  • 电子商务网站开发公司做网站应注意什么
  • 网站建设技术服务公司陕西省国家示范校建设专题网站
  • Windows运行Kafka
  • 在阿里云备案网站通过上海虹口建设局官方网站
  • 廊坊专业网站制作服务前端开发是青春饭吗
  • 2025年11月6日 AI快讯
  • 我在高职教STM32(新10)——LCD1602驱动程序分析
  • 深圳市公司网站建设平台精品网站建设多少钱
  • 资源站建站技术贵州最新新闻
  • 代理模式的使用
  • 什么网站好建设做一个公司官网需要多少钱
  • 微博如何做的跟网站一样asp网站做视频
  • 万网网站备案查询什么网站做美食最好最专业
  • 做网站首页的图片怎么缩小网络优化工程师前景
  • 做loge的网站山东省建设厅官方网站怎么样
  • 1.1 计算机系统
  • Windows 使用Mongosh创建管理与普通账户
  • 【前端】JS/JQ实现页面滚动控制
  • Javascript数组案例-生成柱形图
  • 盛雪竹的命运轨迹与菅纫姿的表演解析
  • javaFX AutoCompleteComboBox / AutoCompletionBinding 控件jar包下载
  • 天元建设集团有限公司分公司百度seo排名公司
  • 校园网站建设年度工作计划垂直门户网站怎么做