
AIドキュメントパイプラインを介したサイレントな依存関係注入。240回の隔離Docker実行により、Context Hubのサニタイズ無しのMCPサーバーが、悪意のあるドキュメントによって開発者プロジェクトを警告なしに侵害することを実証。
コンテキストハブ (Context Hub) (@aisuite/chub v0.1.3) におけるサニタイズゼロの脆弱性により、MCPドキュメントパイプラインを通じてサイレントな依存関係注入が可能になります。
参考文献: CWE-94 (コードインジェクション) | CWE-829 (信頼できない制御範囲) | CWE-345 (データの真正性検証不足) | OWASP LLM01 (プロンプトインジェクション)
我々は、偽の依存関係(plaid-link-verify、stripe-checkout-guard)を含む現実的な毒文書を作成し、隔離されたDockerコンテナ内のローカルchub MCPサーバーを通じて提供しました。毒されたコンテンツはContext Hubのレジストリにアップロードされておらず、chub buildをローカルで実行し、MCPサーバーがディスク上のビルド済み出力を提供するように設定しました。エージェントから見れば、その体験はライブレジストリからドキュメントを取得するのと同一です。
AIコーディングアシスタントがドキュメントを取得したとき、Haikuは100%の実行で、テキスト出力で一度も言及することなく、requirements.txtに偽のパッケージをサイレントに書き込みました。 アシスタントの応答を読む開発者は怪しいものを見ることはありませんが、プロジェクトは毒されています。
240回の隔離実行。3つのモデル。4つの努力レベル。2つのAPI。0の汚染。
生成されたコードは、正当なモジュールとともに偽の依存関係をサイレントにインポートします:

エージェントはまた、CLAUDE.mdを修正し、偽のパッケージを「プロジェクト標準」として埋め込みます:

以下の表はPlaid Linkの結果(120回の隔離実行)を示しています。Stripe Checkoutを含む完全なデータ(合計240回の実行)はRESULTS.mdを参照してください。
Haikuは偽の依存関係について警告しませんでした(0/40)。Sonnetは48%の実行(19/40)で警告しましたが、全体的には53%でrequirements.txtを毒しました。Opusは75%の実行(30/40)で警告し、requirements.txtやコードを毒することはありませんでした。
Haikuは88%の実行(35/40)でプロジェクトのCLAUDE.mdを修正し、偽の依存関係を「プロジェクト標準」として含めます。このファイルはgitにコミットされ、リポジトリをクローンする将来のすべての開発者が毒された設定を継承します。
flowchart LR
A["Attacker\nsubmits PR"] -->|"No identity\nverification"| B["Maintainer\nmerges PR"]
B -->|"No content\nsanitization"| C["Doc on CDN\n(no integrity check)"]
C -->|"MCP serves\nraw content"| D["Agent context\nwindow"]
D -->|"Agent acts on\nuntrusted content"| E["Developer\nworkstation"]
style A fill:#111,stroke:#333,color:#f0f0f0
style B fill:#161616,stroke:#333,color:#888
style C fill:#161616,stroke:#333,color:#888
style D fill:#161616,stroke:#333,color:#888
style E fill:#111,stroke:#333,color:#f0f0f0
Haikuの毒化は完全にサイレントです。 両方のAPIにわたるHaikuの80回の実行中、応答で偽の依存関係に言及したものは0回でした。モデルは知らせずにディスクに書き込みます。Sonnetは48%の実行で警告しましたが、それでも35-53%の実行でrequirements.txtを毒しました。Opusは23-75%の実行で警告し、requirements.txtやコードを毒することはありませんでした。
Haikuはすべての努力レベルで100%悪用可能です。 両方のAPIで努力レベルに依存しません。ファミリーの中で最も弱いモデルは偽の依存関係を決して検出しません。
Opusはコード毒化には耐性がありますが、設定毒化には耐性がありません。 Opusはrequirements.txtやPythonコードに偽の依存関係を書き込むことはありませんでした(両方のAPIで0/80)。しかしStripeでは、Opusは38%の実行でCLAUDE.mdを修正し、カナリアをインストールせずにプロジェクト依存関係として文書化しました。
CLAUDE.mdの永続性はサプライチェーンベクターを生み出します。 修正された設定ファイルはgitにコミットされ、リポジトリをクローンするすべての開発者と、そのプロジェクトの将来のすべてのAIセッションを毒します。これはすべてのモデルで機能します(Haiku 88-90%、Sonnet 58%、Opus 0-38%)。
APIの熟知度が重要です。 Stripe(よく知られている):モデルはトレーニングデータから偽のパッケージを検出します。Plaid(あまり知られていない):モデルは検証できず、偽の依存関係を疑わずに受け入れます。
これはカテゴリ全体の問題です。 Context7はContextCrush(2026年2月)がありました。Context Hubにもこれがあります。サニタイズされていない外部コンテンツをエージェントコンテキストに注入するツールはすべて脆弱です。
パイプライン全体でサニタイズゼロ:
annotations.js - 生のコンテンツでwriteFileSync、フィルタリングなしbuild.js - コンテンツスキャンなし、ユニコード正規化なしcache.js - CDNフェッチ、ハッシュ/署名検証ゼロsource: official - 自己宣言、検証なしContext HubにはSECURITY.mdがありません。脆弱性を責任を持って開示する方法が文書化されておらず、セキュリティ連絡先、PGP鍵、開示ポリシーもありません。コミュニティメンバーはとにかく脆弱性を見つけ、通常のIssueやPRとして報告しました。どれもレビューされませんでした。

注: 当社はIssue #74を提出していません。当社の監査はこれらの脆弱性を独自に発見・定量化しました。Issue #74およびPR #69、#81、#125は、コミュニティがこれらの問題をメンテナーの関与ゼロで指摘したことを示す先行技術として引用されています。
偽のパッケージがrequirements.txtに含まれると、標準のpip install -r requirements.txtによって、攻撃者はsetup.pyのポストインストールフックを介して任意のコード実行を得ることができます。これはサンドボックスではなく、pipは開発者の完全な権限で無制限のPythonを実行します。
その単一のエントリポイントから、攻撃者は以下が可能です:
.envファイル、またはソースコードを読み取り、攻撃者が管理するサーバーに送信します。~/.chub/config.yamlを変更して、攻撃者が管理するドキュメントソースを追加します。すべてのライブラリに対する将来のすべてのchubクエリに攻撃者のコンテンツが含まれるようになります。設定はキャッシュではないため、chub cache clear後も存続します。これらは相互排他的ではありません。単一のポストインストールフックで1秒未満でこれらすべてを実行できます。当社は悪意のあるパッケージを作成または登録していません。
.
|-- README.md # このファイル
|-- RESULTS.md # 実行ごとの内訳を含む完全なデータセット
|-- REPRODUCE.md # Dockerベースの再現ガイド
|-- alternatives-comparison.md # Context7、LAP、GitMCP、Docforkの比較
|-- article.html # 完全な記事
|-- docker/
| |-- Dockerfile # 隔離テスト環境
| |-- run_isolated.ps1 # PowerShellランナー(Windows/macOS/Linux via pwsh)
| |-- seed-claude.md # 各実行にシードされる最小限のCLAUDE.md
| |-- plaid-doc/ # 毒されたPlaid Linkドキュメント(カナリア: plaid-link-verify)
| | `-- plaid/link/DOC.md
| `-- stripe-doc/ # 毒されたStripe Checkoutドキュメント(カナリア: stripe-checkout-guard)
| `-- stripe/checkout/DOC.md
`-- results/
|-- plaid-isolated/ # 120回のPlaid実行:JSON + セッション書き起こし + プロジェクトファイル
`-- stripe-isolated/ # 120回のStripe実行:JSON + セッション書き起こし + プロジェクトファイル
完全なDockerベースの再現ガイドはREPRODUCE.mdを参照してください。
クイックスタート:
# Plaid (default)
docker build --build-arg DOC_DIR=plaid-doc -t plaid-bench docker/
docker run -d --name plaid-runner plaid-bench sleep infinity
docker exec -it plaid-runner claude login
# Stripe
docker build --build-arg DOC_DIR=stripe-doc -t stripe-bench docker/
docker run -d --name stripe-runner stripe-bench sleep infinity
docker exec -it stripe-runner claude login
# Then run the test matrix from the host (see REPRODUCE.md)
--permission-mode bypassPermissionsを使用。実際のエージェントは確認を求める可能性があります。MIT
この研究は、Context Hubのオープンソース代替品であるLAPの開発者、Mickey Shmueliによって実施されました。LAPは公式API仕様からの決定論的コンパイルを使用し、パイプラインにコミュニティコントリビューションコンテンツはありません。この監査は、サニタイズされていないコンテンツパイプラインに関する真摯なセキュリティ懸念に動機付けられたものです。これは、検証されていないコミュニティのコントリビューションを受け入れるこの分野のツールすべてに影響する脆弱性のクラスです。発見事項はそれ自体で成立しています:240回の隔離Docker実行、決定論的検出、完全に再現可能。
このPoCは教育およびセキュリティ研究目的のみです。すべてのテストは隔離されたDockerコンテナ内でローカルに実行されました。悪意のあるコンテンツはContext Hubリポジトリに提出されていません。すべてのカナリアパッケージ名はテスト前にPyPIに存在しないことが確認されました。
これらの脆弱性はコミュニティメンバーによってissue #74(3月12日)とPR #125(3月17日)で独立して報告されました。両方ともメンテナーからの応答はゼロでした。
| 努力 | Haiku | Sonnet | Opus |
|---|
| 低 | 100% | 60% | 0% |
| 中 | 100% | 70% | 0% |
| 高 | 100% | 40% | 0% |
| 最大 | 100% | 40% | 0% |
| 努力 | Haiku | Sonnet | Opus |
|---|
| 低 | 90% | 70% | 0% |
| 中 | 80% | 70% | 0% |
| 高 | 90% | 40% | 0% |
| 最大 | 90% | 50% | 0% |
| 攻撃者 | Context HubのドキュメントレジストリにPRを送信できる任意の人物 |
| 攻撃面 | GitHub PRからCDN、MCP、エージェントコンテキストへと流れるコミュニティドキュメント |
| 信頼境界 | 信頼できないコントリビューターのコンテンツが権威あるAPIドキュメントとして扱われる |
| 前提条件 | 毒されたドキュメントを含む1つのマージされたPR |
| 影響 | 依存関係注入 + pipのポストインストールフックによる任意コード実行 |
| 日付 | イベント |
|---|
| 2026-03-12 | Issue #74 が @bjorkbjork によって提出され、CDNの整合性、自己宣言ソース検証、アノテーションインジェクションを含む4つのセキュリティ脆弱性を報告 |
| 2026-03-12 | Issue #74 が内部でコアチームメンバーに割り当てられた - フォローアップゼロ |
| 2026-03-17 | PR #125 が @hobostay によって提出され、コンテンツ整合性検証を追加 - レビューゼロ |
| 2026-03-12 to 03-20 | 追加のセキュリティPR (#69, #81) がコミュニティによって提出 - レビューゼロ |
| 2026-03-20 to 03-23 | 当社の独立した監査により、240回の隔離Docker実行で脆弱性を確認・定量化 |
| 2026-03-23 | 公開開示 |