
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)が必要です。
| データタイプ | ソース | 保存先 |
|---|---|---|
| ログ | /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> | サブディレクトリを個別のホストとして分析 | - |