
Linux セキュリティチェック
Linuxサーバ向け暗号通貨マイナー検出・削除・堅牢化ツールキット
実際のインシデントレスポンスから構築 —
ps、top、htop、btopからルートキット技術を用いて隠れるマイナーを検出します。
git clone https://gitlab.com/abdom.seada/security-checks.git
cd security-checks
sudo bash setup.sh
🔀 ブランチ:
master— このツールキットはmasterブランチにあります。他のセキュリティスクリプトは将来別のブランチに追加される可能性があります。
⚠️ クローン後すぐに
setup.shを一度実行してください — これをスキップするとエラーの最大の原因になります。
sudo bash setup.sh
setup.sh はすべてを自動的に処理します:
セットアップ成功時の期待される出力:
✅ Setup complete — all checks passed!
Next steps:
sudo ./miner-hunter scan # Safe read-only scan
sudo ./miner-hunter full # Scan → Kill → Harden
💡 なぜこれが必要か? Linux は、ファイルに
+xフラグがないと実行しません。Git や SCP 転送ではこれが失われます。setup.shは、メインスクリプトが依存するlib/モジュールを含むすべてのファイルを一度に修正します。
sudo ./miner-hunter scan # ✅ 安全 — 読み取り専用、変更なし
sudo ./miner-hunter full # ⚠️ フルパイプライン: スキャン → キル → ハードニング
sudo ./miner-hunter scan --dry-run # 👁️ プレビューモード — 何が起こるかを表示
| オプション | 説明 |
|---|---|
-d, --dry-run | 変更を加えずにすべてのアクションをプレビュー |
実際の状況と、それぞれで正確に実行すべき内容を示します。
top には何も表示されない」これは典型的なルートキットの症状です。マイナーはユーザー空間ツールからは隠れますが、ハードウェアパフォーマンスカウンタからは隠れられません。
# ステップ1: まず安全なスキャンを実行 — 何を触る前に何があるか確認
sudo ./miner-hunter scan
マイナーが存在する場合に表示される内容:
🚨 [CRITICAL] CPU anomaly: 97% user CPU but top shows max 2% per process
🚨 [CRITICAL] perf detected 4 hidden threads consuming ~94% total CPU
🚨 [CRITICAL] Active connection to 185.x.x.x:9200 (known mining port)
🚨 [CRITICAL] Fake kernel thread PID=3421 NAME=[kworker/0:1] EXE=/tmp/.x/miner
# ステップ2: マイナーを強制終了し、そのプールをブロック
sudo ./miner-hunter kill
# ステップ3: サーバを堅牢化して再発を防止
sudo ./miner-hunter harden
異常な送信トラフィック、自分で作成していないcronジョブ、奇妙な名前のプロセスなど、何か怪しいことに気づいたが確信がない場合。
# 完全スキャンを実行 — 完全に安全、読み取り専用、変更なし
sudo ./miner-hunter scan
# その後、構造化されたレポートを読む
sudo ./miner-hunter report
/root/miner_evidence_*/report.txt のレポートはすべての検出結果を重要度別に分類します:
[CRITICAL] エントリ → すぐに kill を実行[WARNING] エントリ → 手動で確認してから対処マイナーには永続化メカニズムがあります — そのメカニズム(cronジョブ、systemdサービス、PM2エントリ、シェルプロファイルのバックドア)が、強制終了後に再生成します。
sudo ./miner-hunter scan
出力内で以下を探します:
⚠️ [WARN] Suspicious cron entry: * * * * * /tmp/.x/update
🚨 [CRITICAL] Malicious systemd service: /etc/systemd/system/update-check.service
🚨 [CRITICAL] PM2 process 'app-worker' has 8432 restarts — likely miner respawn loop
🚨 [CRITICAL] Shell profile backdoor detected in /root/.bashrc
# kill は実行中のプロセスだけでなく、すべての永続化アーティファクトを削除します
sudo ./miner-hunter kill
# 次に、何かが再生成された場合に警告を受け取れるようにウォッチドッグをインストールするため、ハードニングを実行
sudo ./miner-hunter harden
💡
kill後、ウォッチドッグcronは5分ごとに実行され、/var/log/miner_hunter/watchdog_alerts.logにログを記録します — 何かが再発した場合に即座に把握できます。
デプロイ前の予防的な堅牢化 — マイナーなし、インシデントなし、単にロックダウン。
# ハードニングを単独で実行 — スキャンやキルは不要
sudo ./miner-hunter harden
これにより:
sshd ジャイルでアクティブであることを確認/usr/bin の整合性ベースラインを作成(MD5チェックサム — 後で改ざんされたバイナリを検出可能)kill 後、検証ステップでマイナーがまだ実行中である可能性が報告されます:
⚠️ MINER MAY HAVE RESPAWNED
CPU: 89% | Mining conns: 1
Firewall blocks are in place — miner can't reach pool
Consider a REBOOT or OS REINSTALL
# 1. ファイアウォールブロックはすでに有効 — マイナーはプールに到達できません
# ブロックがアクティブであることを確認:
iptables -L OUTPUT -n | grep DROP
# 2. 2回目のスキャンを実行して何が生き残ったか確認
sudo ./miner-hunter scan
# 3. プロセスを隠しているカーネルモジュールルートキットを確認
lsmod | grep -iE 'diamorphine|reptile|kovid|rootkit'
# 4. 非ゼロの taint = カーネル外のモジュールがロードされている(ルートキットの指標)
cat /proc/sys/kernel/tainted
カーネル taint 値が非ゼロであるか、既知のルートキットモジュールが表示される場合 — マイナーはカーネルレベルで制御しています。この時点で最も安全な方法は、既知のクリーンなスナップショットからの完全なOS再インストールです。
harden 後、ウォッチドッグcronがすでにインストールされています。その操作方法は以下の通りです:
# アラートログをリアルタイムで監視
tail -f /var/log/miner_hunter/watchdog_alerts.log
# ウォッチドッグcronジョブが登録されていることを確認
cat /etc/cron.d/miner-watchdog
# ベースライン作成以降の /usr/bin バイナリの変更を確認
md5sum --check /var/lib/miner_hunter/usrbin_baseline.md5 --quiet
最後のコマンドで出力があった場合、ベースライン作成後にシステムバイナリが変更されたことを意味します — 直ちに調査してください。
| 手法 | 検出するもの |
|---|---|
perf ハードウェアPMCプロファイリング | 隠されたCPU消費 — ルートキットはハードウェアカウンタを偽造できません |
/proc デルタサンプリング | PIDごとの直接のカーネルレベルCPUアカウンティング |
| CPU異常検出 | それを説明する可視プロセスがない高い CPU |
| 手法 | 検出するもの |
|---|---|
| 直接読み取り |
sudo ./miner-hunter kill を実行すると、以下の順序で処理が行われます:
DROP ルールを適用。これにより、再生成してもマイナーは再接続できませんSIGKILL でTGID(スレッドグループリーダーPID)を対象perf を再実行し、/proc/net/tcp をチェックしてCPUが低下し接続がなくなったことを確認security-checks/ ← リポジトリルート (master ブランチ)
├── miner-hunter # エントリポイント — 実行するスクリプト
├── setup.sh # ⚙️ 初回セットアップ — クローン後に一度実行
├── lib/
│ ├── common.sh # 共有ユーティリティ: ログ、色、ヘルパー
│ ├── detect_hidden.sh # 隠しプロセスとルートキットの検出
│ ├── detect_cpu.sh # perf と /proc によるCPUプロファイリング
│ ├── detect_network.sh # マイニングプール接続の検出
│ ├── detect_persistence.sh # 永続化メカニズムの検出
│ ├── kill_miner.sh # プロセス強制終了とアーティファクト削除
│ └── harden.sh # インシデント後の堅牢化
├── README.md
└── LICENSE
実行ごとに以下が作成されます:
このツールは、以下の特徴を持つ暗号通貨マイナーに対する実際のインシデント対応中に構築されました:
next にリネームし、Node.jsサーバ上のNext.jsプロセスに紛れ込んだkthreadd にリネームされたスレッドグループリーダーを使用/proc/PID/exe → (deleted))ps、top、htop、btop では完全に見えずperf ハードウェアCPUカウンタプロファイリングによってのみ検出可能だったMIT
| ステップ | 処理内容 |
|---|
| ✅ パーミッション | miner-hunter とすべての lib/*.sh スクリプトに chmod +x を実行 |
| ✅ ディレクトリ | /var/log/miner_hunter/ および /var/lib/miner_hunter/ を作成 (rootのみ、700) |
| ✅ 依存関係 | perf、mpstat、iptables、fail2ban、bc、strings を確認 — 不足分は自動インストール |
| ✅ セルフテスト | ./miner-hunter --version を実行してすべてが正しく接続されていることを確認 |
| コマンド | 説明 | システムを変更するか? |
|---|
scan | 完全検出スキャン — 隠しプロセス、CPU、ネットワーク、永続化 | ✅ いいえ |
kill | 特定されたマイナーを強制終了、プールIPをブロック、アーティファクトを削除 | ⚠️ はい |
harden | インシデント後の堅牢化 — SSH、ファイアウォール、ウォッチドッグ、整合性ベースライン | ⚠️ はい |
full | スキャン → キル → ハードニングを各フェーズ間で確認プロンプト付きで実行 | ⚠️ はい |
report | 最新のスキャンレポートを表示 | ✅ いいえ |
-e, --evidence DIR/root/miner_evidence_* の代わりにカスタムディレクトリに証拠を保存 |
-h, --help | ヘルプを表示 |
-v, --version | バージョンを表示 |
| 手法 | 検出するもの |
|---|
/proc と ps の比較 | ユーザー空間ツールから見えないプロセス |
| LD_PRELOAD ハイジャック | libc をフックしてプロセスを隠す悪意のある共有ライブラリ |
| カーネルモジュールルートキット | Diamorphine、Reptile、Kovid などの既知のルートキット |
| 偽のカーネルスレッド | [kworker]、[kthreadd]、[kswapd] に偽装したマイナー |
| 改ざんされたシステムバイナリ | 置き換えられた ps、top、ls、ss、netstat |
%user/proc/net/tcpアクティブな接続 — フックされた ss/netstat をバイパス |
| マイニングポート検出 | ポート 3333、4444、5555、7777、9200、14433、14444、45560 |
| マイニングドメイン解決 | 既知のプールドメインを解決し、アクティブな接続と相互参照 |
| ソケットからPIDへのマッピング | 各マイニング接続がどのプロセスに属するかを特定 |
| 場所 | チェック内容 |
|---|
| Cron | /etc/cron*、/var/spool/cron/、全ユーザーのcrontab |
| Systemd | すべてのユニットファイルとタイマーの疑わしいエントリ |
| Udevルール | デバイスイベントによるハードウェアトリガー実行 |
| PM2 | Node.jsプロセスマネージャエントリの異常に多い再起動回数 |
| シェルプロファイル | .bashrc、.bash_profile、/etc/profile、/etc/profile.d/* |
| SSH | 全ユーザーの authorized_keys ファイルすべて |
| Webshell | Node.jsプロジェクトディレクトリ内のPHPファイル |
| XMRig設定 | 一般的なマイナー配置場所の config.json |
| アクション | 詳細 |
|---|
| ファイアウォールの永続化 | 再起動のたびにiptablesのマイニングブロックを復元するsystemdサービス |
| SSH監査 | PermitRootLogin、PasswordAuthentication、MaxAuthTries をチェック — 推奨値を表示 |
| Fail2banチェック | sshd ジャイルがアクティブであることを確認し、現在禁止されているIPを報告 |
| マイナーウォッチドッグ | 5分ごとにCPU異常、LD_PRELOAD、マイニングポート、PHP webshellをチェックするcronジョブ |
/usr/bin ベースライン | /usr/bin 内の全バイナリのMD5チェックサム — 将来の改ざん検出用 |
| 要件 | 詳細 |
|---|
| OS | Linux — Ubuntu 24.04 LTS、Debian 13 でテスト済み |
| 権限 | root (sudo) で実行する必要あり |
| setup.sh が自動インストール | perf、mpstat (sysstat)、bc、strings (binutils) |
| 推奨 | fail2ban — 不足時は警告表示、自動インストールはしない |
| 必須(自動インストールしない) | iptables — kill/harden フェーズでは必須 |
| 出力 | 場所 | 内容 |
|---|
| 証拠ディレクトリ | /root/miner_evidence_YYYYMMDD_HHMMSS/ | キャプチャしたバイナリ、perfレポート、マイナー設定 |
| ログファイル | /var/log/miner_hunter/run_YYYYMMDD_HHMMSS.log | 完全なタイムスタンプ付き実行ログ |
| レポート | evidence_dir/report.txt | 重要度付きの構造化された検出結果サマリー |
| ウォッチドッグアラート | /var/log/miner_hunter/watchdog_alerts.log | harden 後の継続的なアラート |
| 整合性ベースライン | /var/lib/miner_hunter/usrbin_baseline.md5 | harden 後の /usr/bin チェックサム |