FlawOpen

flawopen.com/Incidents/deadbugz-mcp-delayed-metadata-supply-chain-campaign-august-2026

● Pillar Security / MCP ecosystem · CWE-829 (editorial mapping; no CVE assigned) · 2026-08-10 · 中
セキュリティ研究 · FlawOpen

Deadbugz:承認後にMCPツールのメタデータが変化

Pillar Securityは、通常の呼び出し3回後にメタデータを変更するMCPサプライチェーン活動を報告しました。調査でGitHub経由のPRマージは見つからず、報告書に後続侵害の記載はありません。Cloud Security Allianceは、対象が独自にローカル実行したかの把握には限界があったと述べています。[1], [3]

💡 わかりやすい解説 (ELI5)

無害な作業だけが書かれた身分証を見て、作業員を承認したと想像してください。通常の配達を3回終えると、身分証がひそかに変わり、施錠された部屋への立ち入りを求めます。建物が以前の承認を信頼し続けることが危険です。MCPクライアントは、サーバーが承認済みツールの説明を変更したことを検知しなければなりません。[1]

主要な概念と専門用語

MCP
AIアプリケーションがサーバー提供のツールを検出し呼び出すためのプロトコル。[5]
ツールメタデータ
ツール名、説明、入力スキーマ。クライアントがモデルのコンテキストに渡す場合がある。[5], [1]
実行時の遅延変更
通常のやり取りが一定回数に達した後に現れる動作。Pillarは3回の呼び出しカウンターを報告。[1]
サプライチェーン経由の導入
pull requestなど信頼された開発フローを通じた依存関係や設定の導入。[1]
CWE-829
編集上の分類:クライアントの信頼境界外にあるサーバーから機能が持ち込まれた。CVEとCVSSは割り当てられていない。[1], [3]

フレームワーク対応

  • このガイドで説明する弱点の CWE 参照: CWE-829

インシデントのタイムライン

2026-08-10

Pillarは74分間に作成された関連pull requestを23件確認。調査時点でGitHubのPR機能を通じてマージされたものはなかった。[1]

2026-08-12

Pillarが3回の呼び出し後のメタデータ変更と指標を説明する技術報告を公開。[1]

2026-10-08

OWASP GenAI Projectが2026年第3四半期のまとめにDeadbugzを掲載。これは注目の証拠であり、侵害や検索量の証拠ではない。[2]

ステップ・バイ・ステップの攻撃フロー

ステップ 1

設定変更が提案される

pull requestでAIプロジェクトにリモートまたはローカルのMCPサーバー設定が追加される。Pillarはリモートendpointの変更17件、隠しローカルスクリプトへの参照4件、一覧投稿2件を確認。[1]

ステップ 2

初回確認では通常のツールが見える

サーバーは最初、テキスト整形と要約を提供する。Pillarによると短いテストでは無害なメタデータだけが返ることがある。[1]

ステップ 3

通常利用でしきい値を超える

サーバーはクライアントごとに呼び出しを数える。3回後、後続の tools/list と prompts/get の応答が変わる。[1], [5]

ステップ 4

エージェントが信頼できない指示を受け取る

指示は接続エージェントを機密ローカル情報へ誘導し、活動を隠そうとする。このキャンペーン説明は侵害の確認を意味しない。[1], [3]

ステップ 5

承認対象をメタデータそのものに結び付ける

クライアントは承認済みツール定義の指紋を保存し、差異があれば運用者の確認まで停止する。ファイル、認証情報、ネットワークの権限は別のポリシーで強制する。[1], [4], [5]

ソースコード比較:脆弱 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

エンジニアリング&システム堅牢化チェックリスト

参考資料