
MongoBleedエクスプロイトの検出スクリプト
CVE-2025-14847 (MongoBleed) のためのオフラインMongoDB分析ツール
MongoDBデータを分析し、複数の検出モジュールを使用してCVE-2025-14847の悪用の可能性を特定するスタンドアロンLinuxコマンドラインツールです。
MongoBleed (CVE-2025-14847) は、MongoDBのzlib伸長処理におけるメモリ開示の脆弱性であり、攻撃者が認証なしでサーバーメモリから資格情報、セッショントークン、PIIなどの機密データを直接抽出することを可能にします。
このツールは、インシデント対応担当者が複数の証拠ソースを使用して悪用の試みを検出できるようにします。
MongoDB JSONログを分析して悪用パターンを検出します。
| イベントID | タイプ | 説明 |
|---|---|---|
| 22943 | Connection Accepted | クライアントが接続したときに記録されます |
| 51800 | Client Metadata | クライアントがドライバー/アプリケーション情報を送信したときに記録されます |
| 22944 | Connection Closed | クライアントが切断したときに記録されます |
重要な洞察: 正規のMongoDBドライバーは常にクライアントメタデータを送信します。MongoBleedの悪用は接続し、メモリを抽出し、切断しますが、メタデータを送信しません。
db.serverStatus().asserts のスナップショットを分析して、asserts.userカウンターの異常なパターンを検出します。
asserts.userを他のアサーションタイプと比較して怪しいパターンを検出します。ユーザーアサートが異常に高い(比率≥250倍)または他のすべてのタイプがゼロの場合、疑わしいとフラグします(MEDIUM確信度)注意: 累積カウンターは誤検出を引き起こす可能性があります。最良の結果を得るには、FTDC(モジュールB2)と組み合わせて使用してください。
MongoDBのFull-Time Diagnostic Data Capture(FTDC)ファイルを分析して、アサーションカウンターの時間局所的なスパイクを検出します。FTDCは定期的にserverStatusをサンプリングするため、攻撃の正確なタイミングを特定できます。
jq - JSONプロセッサawk(gawk推奨)gzip - 圧縮ログ対応pymongo - FTDCファイルデコード用ssh、scpコマンド)# シェルスクリプトの依存関係
# Debian/Ubuntu
apt-get install jq gawk gzip
# RHEL/CentOS/Fedora
dnf install jq gawk gzip
# macOS
brew install jq gawk
# Python依存関係(FTDCデコード用)
pip install -r requirements.txt
# リポジトリのクローン
git clone https://github.com/your-org/mongobleed-detector.git
cd mongobleed-detector
# スクリプトに実行権限を付与
chmod +x mongobleed-detector.sh
chmod +x mongobleed-remote.py
chmod +x ftdc-decode.py
# Python依存関係のインストール(オプション、FTDC対応用)
pip install -r requirements.txt
MongoDBホストから手動で収集したデータを分析します。
SSH経由で複数のホストから自動的にデータを収集し、ローカルで分析します。
MongoDBホストからデータを収集し、次の構造に整理します。
./collected-data/
├── logs/ # MongoDB JSONログ
│ ├── mongod.log
│ ├── mongod.log.1
│ └── mongod.log.2.gz
├── assert-counts/ # serverStatus().asserts スナップショット
│ ├── asserts-2025-01-01.json
│ └── asserts-2025-01-02.json
└── ftdc-files/ # FTDC diagnostic.data の内容
├── metrics.2025-01-02T10-00-00Z-00000
└── metrics.interim
# リモートホストからコピー
scp user@mongohost:/var/log/mongodb/mongod.log* ./collected-data/logs/
MongoDBホストで次のコマンドを実行します(mongoshアクセスが必要)。
mongosh --quiet --eval 'JSON.stringify({
timestamp: new Date().toISOString(),
hostname: db.hostInfo().system.hostname,
asserts: db.serverStatus().asserts,
uptime: db.serverStatus().uptime
})' > asserts-$(date +%Y%m%d-%H%M%S).json
結果のJSONファイルを ./collected-data/assert-counts/ にコピーします。
ヒント: このコマンドを複数回(例:1時間ごと)実行すると、ベースラインを確立してスパイクを検出できます。
FTDCファイルは次の場所にあります。
<storage.dbPath>/diagnostic.data/(通常は /var/lib/mongodb/diagnostic.data/)systemLog.path から派生(例:/var/log/mongodb/mongos.diagnostic.data/)# FTDCファイルのコピー(sudoが必要な場合あり)
sudo cp /var/lib/mongodb/diagnostic.data/metrics.* ./collected-data/ftdc-files/
# 自動検出モード - 利用可能なすべてのデータを分析
./mongobleed-detector.sh --data-dir ./collected-data/
# カスタム閾値
./mongobleed-detector.sh --data-dir ./collected-data/ \
-t 1440 \ # 24時間のルックバック
-c 50 \ # 接続閾値を下げる
--spike-threshold 50 # スパイク閾値を下げる
後方互換性のため、ログを直接分析することもできます。
# デフォルトパスをスキャン
./mongobleed-detector.sh
# 特定のログファイルをスキャン
./mongobleed-detector.sh -p /path/to/logs/*.json
# フォレンジックモード(複数ホストを分析)
./mongobleed-detector.sh --forensic-dir /evidence/
複数のホストから自動的にデータを収集し、分析します。
# ホストファイルを作成
cat > hosts.txt << EOF
mongo-prod-01.example.com
mongo-prod-02.example.com
mongo-staging.example.com
EOF
# 収集と分析
./mongobleed-remote.py --hosts-file hosts.txt --user admin --output-dir ./collected-data/
# 特定のSSH鍵を使用
./mongobleed-remote.py --hosts-file hosts.txt --user admin --key ~/.ssh/mongodb_key
# 並列実行
./mongobleed-remote.py --hosts-file hosts.txt --user admin --parallel 10
# FTDC収集をスキップ(高速)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --skip-ftdc
# 収集のみ、後で分析
./mongobleed-remote.py --hosts-file hosts.txt --user admin --collect-only
# SSHオプションを渡す(例:ジャンプホスト)
./mongobleed-remote.py --hosts-file hosts.txt --user admin \
-o "ProxyJump=bastion.example.com"
# 特権ファイルアクセスにsudoを使用(FTDCファイルは制限されていることが多い)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --sudo
# 接続問題のトラブルシューティング用デバッグモード
./mongobleed-remote.py --hosts-file hosts.txt --user admin --debug
FTDC権限に関する注意:
/var/lib/mongodb/diagnostic.data/内のFTDCファイルは通常mongodbユーザーが所有しており、一般ユーザーは読み取れません。「FTDC Permission Issues」の警告が表示された場合は、--sudoフラグを使用してください。この場合、リモートユーザーにパスワードなしのsudoアクセス(sudoersのNOPASSWD)が必要です。
| コード | 意味 |
|---|---|
| 0 | HIGHまたはMEDIUMの発見なし |
| 1 | HIGHまたはMEDIUMの発見あり |
| 2 | エラー(依存関係の欠如、データなしなど) |
ツールは、利用可能なすべての証拠に基づいて複合的な確信度判定を提供します。
ログ相関(モジュールA)の場合、個々のIPが次のように分類されます。
| リスク | 基準 |
|---|---|
| HIGH | 接続数 ≥ 閾値、メタデータレート < 10%、バーストレート ≥ 400/分 |
| MEDIUM | 接続数 ≥ 閾値、メタデータレート < 10%、バーストレート < 400/分 |
| LOW |
INFO: Auto-discovery mode: analyzing ./collected-data/
INFO: Module A: Analyzing 3 log file(s)...
INFO: Module B1: Analyzing assert-counts...
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ MongoBleed (CVE-2025-14847) Detection Results ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Module Status:
[✓] Module A (Log Correlation): 3 log file(s) found
[✓] Module B1 (Assert Counts): 4 snapshot(s) found
[−] Module B2 (FTDC Spikes): No FTDC files or decoder unavailable
Analysis Parameters:
Time Window: 4320 minutes
Connection Thresh: 100
Burst Rate Thresh: 400/min
Metadata Rate: 0.10
Spike Threshold: 100
User Ratio Thresh: 250x
Module A - Log Correlation Findings:
Risk SourceIP ConnCount MetaCount DiscCount MetaRate% BurstRate/m FirstSeen (UTC) LastSeen (UTC)
-------- ---------------------------------------- ---------- ---------- ---------- ------------ -------------- ---------------------- ----------------------
HIGH 137.137.137.137 8172 0 8172 0.00% 490.32 2025-12-27T12:55:52Z 2025-12-27T13:12:32Z
Module B1 - Assert Counts Analysis:
Analyzed 4 snapshots from 2025-01-01T10:00:00Z to 2025-01-01T11:30:00Z
asserts.user: 100 -> 860 (delta: 760)
SPIKE DETECTED: 2025-01-01T10:30:00Z to 2025-01-01T11:00:00Z
Delta: +740 user asserts (110 -> 850)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Combined Verdict:
MEDIUM CONFIDENCE - Investigation recommended
- Suspicious connection patterns but FTDC data unavailable for correlation
⚠ IMPORTANT: If exploitation is confirmed, patching alone is insufficient.
- Rotate all credentials that may have been exposed
- Review accessed data for sensitive information disclosure
- Check for lateral movement from affected systems
- Preserve logs for forensic analysis
Caveats:
- Connection metadata absence is PoC-specific and can be evaded
- Assertion counters are cumulative - false positives possible without baseline
- FTDC provides timing but not perfect attribution
- Patch + rotate secrets remains mandatory regardless of detection results
リポジトリには、検出ツールを検証するためのテストスイートが含まれています。
example-data/ ディレクトリには、MongoBleed PoCを使用して攻撃されたMongoDB 8.0.16インスタンスの実際のデータが含まれています。
example-data/
├── logs/ # 攻撃パターンを含む実際のMongoDBログ
│ ├── mongod.log
│ └── mongod.log.1.gz
├── assert-counts/ # 攻撃後のserverStatus().assertsスナップショット
│ └── asserts-post-attack.json
└── ftdc-files/ # 実際のFTDC診断データファイル
└── metrics.*
このデータは次のものを示しています。
./test/generate-test-logs.sh
これにより、さまざまなパターンを持つ追加の合成テストデータが作成されます。
./test/test-detector.sh
期待される出力:
╔════════════════════════════════════════════════════════╗
║ MongoBleed Detector Test Suite ║
╚════════════════════════════════════════════════════════╝
Module A Tests (Log Correlation):
✓ PASS: Exit code is 1 (findings detected)
✓ PASS: Detected source IP 137.137.137.137
...
Module B1 Tests (Assert Counts):
✓ PASS: Shows Module B1 status
✓ PASS: Detected assert spike
...
Auto-Discovery Mode Tests:
✓ PASS: Shows Module A status
✓ PASS: Shows combined verdict
...
Results:
Passed: 24
Failed: 0
All tests passed!
⚠️ 重要な制限
PoC固有の検出: メタデータ欠如の検出は、既知のMongoBleed PoCの動作に基づいています。巧妙な攻撃者は、偽のメタデータを送信するようにエクスプロイトを変更する可能性がありますが、これにより悪用速度が低下します。
累積カウンター: asserts.user はmongod再起動以降の累積値です。ベースラインスナップショットがない場合、高い値は長期稼働インスタンスでは正常である可能性があります。経時的な複数のスナップショットにより精度が大幅に向上します。
FTDCのタイミング: FTDCはタイミング情報を提供しますが、完全な属性情報は提供しません。最良の結果を得るには、ログ相関と組み合わせて使用してください。
ログ保持: 存在するログのみ分析できます。積極的なローテーションや攻撃者によるログ消去は証拠を破壊します。
JSONログ必須: MongoDB 4.4+ はデフォルトでJSONログを使用します。従来のテキストログはサポートされていません。
FTDCデコーダー: FTDCデコードにはpymongoを使用するPython 3が必要です。これがないとモジュールB2は使用できません。
mongoshアクセス: アサートカウントの収集には、適切な権限を持つmongoshが必要です。
HIGHまたはMEDIUMの発見が確認された場合。
このツールの検出ロジックは、Eric Capuano と Tamir Zimerman による研究に基づいています。
LICENSEファイルを参照してください。
コントリビューションを歓迎します!Issueやプルリクエストを送信してください。
このツールを本番データに対してテストした場合は、特に以下のフィードバックをいただけると幸いです。
| データタイプ | ソース | 保存先 |
|---|
| ログ | /var/log/mongodb/mongod.log* | <output-dir>/<hostname>/logs/ |
| アサートカウント | mongosh コマンド | <output-dir>/<hostname>/assert-counts/ |
| FTDCファイル | /var/lib/mongodb/diagnostic.data/metrics.* | <output-dir>/<hostname>/ftdc-files/ |
| オプション | 説明 | デフォルト |
|---|
-d, --data-dir <path> | 収集データのあるディレクトリ(自動検出モード) | - |
-p, --path <glob> | 追加のログパス/グロブ(繰り返し可) | - |
-t, --time <minutes> | ルックバックウィンドウ(分) | 4320(3日) |
-c, --conn-threshold | 接続数の閾値 | 100 |
-b, --burst-threshold | バーストレート閾値(毎分) | 400 |
-m, --metadata-rate | メタデータレート閾値(0.0〜1.0) | 0.10 |
--spike-threshold | アサートスパイク閾値 | 100 |
--user-ratio-threshold | 単一スナップショット検出用のユーザー/その他アサート比率 | 250 |
--no-default-paths | デフォルトログパスをスキップ | false |
--forensic-dir <path> | サブディレクトリを個別のホストとして分析 | - |
| オプション | 説明 | デフォルト |
|---|
-H, --host <hostname> | スキャンするリモートホスト(繰り返し可) | - |
-f, --hosts-file <file> | ホスト名を含むファイル(1行に1つ) | - |
-u, --user <user> | SSHユーザー名 | 現在のユーザー |
-k, --key <file> | SSH秘密鍵ファイル | ssh-agent |
-P, --port <port> | SSHポート | 22 |
-o, --ssh-options <opt> | 追加のSSHオプション(繰り返し可) | - |
--sudo | 特権ファイルアクセスにsudoを使用(FTDC) | false |
-O, --output-dir <path> | 収集データを保存するディレクトリ | ./collected-data |
--log-path <path> | 収集するリモートログパス(繰り返し可) | 標準パス |
--ftdc-path <path> | リモートFTDCディレクトリパス(繰り返し可) | 標準パス |
--skip-logs | ログ収集をスキップ | false |
--skip-asserts | serverStatus().assertsの収集をスキップ | false |
--skip-ftdc | FTDCファイル収集をスキップ | false |
--collect-only | データの収集のみ行い、分析は実行しない | false |
-j, --parallel <n> | 並列接続数 | 5 |
--timeout <seconds> | SSHコマンドのタイムアウト | 300 |
-d, --debug | デバッグ出力を有効にする(SSHコマンドを表示) | false |
-q, --quiet | 進捗メッセージを抑制 | false |
| 確信度 | 基準 | 解釈 |
|---|
| HIGH | FTDCピークが検出され、かつ同じ時間枠内に怪しいログがある | 悪用の強い指標 |
| MEDIUM | FTDCピークまたは怪しいログ(相関なし) | 調査推奨 |
| LOW | スパイクのない累積アサートカウントのみ | 異常検出、弱い証拠 |
| INFO | 重要な発見なし | 通常の動作 |
| 接続数 ≥ 閾値、メタデータレート ≥ 10% |
| INFO | 接続数 < 閾値 |
| バージョン | 脆弱なバージョン | 修正バージョン |
|---|
| 8.2.x | 8.2.0 - 8.2.2 | 8.2.3 |
| 8.0.x | 8.0.0 - 8.0.16 | 8.0.17 |
| 7.0.x | 7.0.0 - 7.0.27 | 7.0.28 |
| 6.0.x | 6.0.0 - 6.0.26 | 6.0.27 |
| 5.0.x | 5.0.0 - 5.0.31 | 5.0.32 |
| 4.4.x | 4.4.0 - 4.4.29 | 4.4.30 |
| 4.2.x | 4.2.0+ | 修正なし |
| 4.0.x | 4.0.0+ | 修正なし |
| 3.6.x | 3.6.0+ | 修正なし |