flawopen.com/Incidents/deadbugz-mcp-delayed-metadata-supply-chain-campaign-august-2026
Deadbugz:承認後にMCPツールのメタデータが変化
Pillar Securityは、通常の呼び出し3回後にメタデータを変更するMCPサプライチェーン活動を報告しました。調査でGitHub経由のPRマージは見つからず、報告書に後続侵害の記載はありません。Cloud Security Allianceは、対象が独自にローカル実行したかの把握には限界があったと述べています。[1], [3]
無害な作業だけが書かれた身分証を見て、作業員を承認したと想像してください。通常の配達を3回終えると、身分証がひそかに変わり、施錠された部屋への立ち入りを求めます。建物が以前の承認を信頼し続けることが危険です。MCPクライアントは、サーバーが承認済みツールの説明を変更したことを検知しなければなりません。[1]
主要な概念と専門用語
MCP- AIアプリケーションがサーバー提供のツールを検出し呼び出すためのプロトコル。[5]
実行時の遅延変更- 通常のやり取りが一定回数に達した後に現れる動作。Pillarは3回の呼び出しカウンターを報告。[1]
サプライチェーン経由の導入- pull requestなど信頼された開発フローを通じた依存関係や設定の導入。[1]
フレームワーク対応
- このガイドで説明する弱点の CWE 参照: CWE-829
インシデントのタイムライン
Pillarは74分間に作成された関連pull requestを23件確認。調査時点でGitHubのPR機能を通じてマージされたものはなかった。[1]
Pillarが3回の呼び出し後のメタデータ変更と指標を説明する技術報告を公開。[1]
OWASP GenAI Projectが2026年第3四半期のまとめにDeadbugzを掲載。これは注目の証拠であり、侵害や検索量の証拠ではない。[2]
ステップ・バイ・ステップの攻撃フロー
ソースコード比較:脆弱 vs 堅牢化
報告はメタデータ汚染とpull requestによる配布を説明しており、MCP仕様のCVEではありません。初回承認後もサーバーの変更可能な説明を信頼し続けるとリスクが生じます。Pillarは活動を公開GitHubアカウントに帰属させています。本記事ではPillarによる帰属として記し、実在人物の確認済み身元とは扱いません。Pillarは調査対象のPRが当時GitHubのPR機能でマージされていなかったと述べ、後続侵害も確認していません。参照されたソースリポジトリは現在404のため、技術的な記述はPillarの公開分析に基づき、コードツリーを再取得して独立確認したものではありません。Python例はクライアント側の防御方針を示すもので、MCPライブラリの置き換えコードではありません。CWE-829は編集上の分類で、CVEとCVSSはありません。 アダプターはMCP変更通知後にデータを再取得し、tools/list と prompts/get の両方を含めます。metadata_snapshot は説明用のアダプターメソッドで、MCP SDK APIではありません。approved_digest は運用者の確認後にのみ作成します。 スナップショットには tools/list の定義と承認済みプロンプトの完全な prompts/get 内容を含む、関連するすべてのサーバーメタデータが必要です。実行直前に再取得し、不一致なら処理を止めます。この検査ではサーバー動作の変更や検査と使用の間の変更は検出できないため、独立したアクション権限も必要です。[1], [4], [5]
def agent_metadata(session):
# アダプターはサーバーの現在のツールとプロンプトを JSON データとして返す。
return session.metadata_snapshot()
import hashlib
import hmac
import json
def fingerprint(snapshot):
normalized = dict(snapshot)
for key in ("tools", "prompts"):
normalized[key] = sorted(
snapshot[key],
key=lambda item: json.dumps(item, sort_keys=True, separators=(",", ":")),
)
canonical = json.dumps(normalized, sort_keys=True, separators=(",", ":"))
return hashlib.sha256(canonical.encode()).hexdigest()
def agent_metadata(session, approved_digest):
current = session.metadata_snapshot()
if not hmac.compare_digest(fingerprint(current), approved_digest):
raise PermissionError("MCP metadata changed; require operator approval")
return current
エンジニアリング&システム堅牢化チェックリスト
- ✓承認済みMCPツールの名前、説明、入力スキーマの正規化フィンガープリントを保存する。[1], [4]
- ✓承認後に
tools/listまたはprompts/getが変化したらツールを停止し、運用者の確認を求める。[1], [5], [4] - ✓モデル指示やメタデータとは別に、ファイル、認証情報、プロセス、外向き通信の権限を強制する。[1], [4]
- ✓MCP endpointやローカルサーバースクリプトを追加する変更をレビューし、有効化前に出所を確認する。[1]
- ✓サーバーの挙動が予期せず変わった場合、クライアントログを保全し、定義変更とエージェント操作を照合する。[1], [3]
参考資料
- Pillar Security — Deadbugz: Currently Active MCP Supply-Chain Campaign (12 August 2026)
- OWASP GenAI Security Project — GenAI and Agentic AI Exploit Roundup Q3 2026 (8 October 2026)
- Cloud Security Alliance — Deadbugz: Runtime-Gated MCP Metadata Poisoning as Supply-Chain Attack
- OWASP MCP Security Cheat Sheet
- MCP specification: Tools