
カーネルレベルの eBPF サンドボックス - Model Context Protocol (MCP) を介して行われる LLM エージェントのツール呼び出しを保護します。
Model Context Protocol (MCP) を介して行われるLLMエージェントのツール呼び出しのためのカーネルレベルサンドボックス。
MCPGuardは、MCPクライアント(エージェント/ランナー)とMCPサーバーのサブプロセスの間の透過的なプロキシとして配置され、すべてのツール呼び出しに3層の防御を適用します。最下層はeBPFで実装され、システムコール境界でケイパビリティポリシーを強制するため、悪意のあるMCPサーバーが自身の実装内に機密性の高い動作をハードコードすることでポリシーを迂回することはできません。
このリポジトリには、プロキシ、eBPFプログラム、14サーバー/82ケースのベンチマーク、および付随する論文 Kernel-Level Sandboxing for LLM Agent Tool Calls via eBPF で使用された評価ハーネスが含まれています。
| レイヤー | コンポーネント | 目的 |
|---|---|---|
| L1 | proxy/policy_engine.py | 各ツールのMCPスキーマから導出されるサーバーごとのケイパビリティポリシー。パス、ネットワーク宛先、プロセス、環境変数の許可リスト。 |
| L2 | proxy/argument_validator.py | ツール呼び出し引数のアプリケーションレベル検査。パス正規化、URL検証、プロンプトインジェクション検出、環境変数漏洩/コマンドインジェクション検出、機密キースキャン、レスポンスサニタイズ。 |
| L3 | ebpf/*.bpf.c + proxy/ebpf_sandbox.py | OSレベルでの強制。3つのBPF LSMプログラム(file_guard、net_guard、proc_guard)が open() / connect() / execve() をインターセプトし、1つのトレースポイントプログラム(fork_guard)が sched_process_fork を介して子プロセスを追跡し、フォークをまたいでポリシーが引き継がれます。 |
6つの切り替え可能な防御構成(proxy/proxy_base.py)は、論文で使用されたアブレーション空間をカバーします: C0(パススルー)、C-AB(AgentBoundベースライン)、C-app(L1 + L2)、C-ebpf(L3のみ)、C-full(L1 + L2 + L3)、C-AB+ebpf(AgentBound + L3)。
.
├── proxy/ L1ポリシーエンジン、L2引数バリデータ、L3 eBPFコントローラ、AgentBoundベースライン
├── ebpf/ file/net/proc/forkガード用のBPF Cソース + Makefile + vmlinux.h
├── policies/ サーバーごとのJSONケイパビリティポリシー(デフォルト+オーバーライド)
├── servers/ 14のMCPサーバー: 11のPython(filesystem、notes、weather、shell、sqlite、git、env + 悪意のある/トロイの木馬化されたバリアント)+ 3のJavaScript(servers/js/)
├── test_cases/ 7カテゴリにわたる82のベンチマークシナリオ(file_read、exfiltration、env_leak、sandbox_escape、priv_escalation、cross_language、benign)
├── notes_data/ notes_serverで使用される170の有効な合成notes JSONフィクスチャ
├── runner/ evaluate.py、aggregate.py、agentbound_check.py、ebpf_edge_tests.py、latency_benchmark.py、override_workflow.py、smoke_test.py
└── EXECUTION_PLAN.md フェーズごとの再現手順
CONFIG_BPF_LSM=y、カーネルコマンドラインに lsm=bpf)clang 21以降bpftoolservers/js/ 配下のJavaScript MCPサーバーにのみ必要)# eBPFプログラムをビルド
cd ebpf && make && cd ..
# スモークテスト(1サーバー、少数のケース)
python3 runner/smoke_test.py
# 1つの構成でのフルベンチマーク
python3 runner/evaluate.py --config C-full --run-id trial
# 再現した実行の集計
python3 runner/aggregate.py --run-id trial
# eBPFインストール後に定常状態のレイテンシテーブルを再現
sudo python3 runner/latency_benchmark.py --run-id codex_20260523_latency --iterations 100 --warmup 20
# 監査/オーバーライドワークフローを再現
python3 runner/override_workflow.py --run-id codex_20260523_override
# eBPFインストール後にフォーカスしたeBPFエッジテストを実行
sudo python3 runner/ebpf_edge_tests.py --run-id codex_20260523_ebpf_edges
# AgentBoundスタイルのベースライン適合性チェックを実行
python3 runner/agentbound_check.py --run-id codex_20260523_agentbound
C-ebpf、C-full、C-AB+ebpf は、BPF LSMプログラムとピン留めされたマップが利用できない場合にフェイルクローズするようになりました。これらは、eBPFレイヤーをroot権限でインストールした後にのみ実行してください。
論文で固定された codex_20260523_full の14サーバー、82ケースのベンチマークにおける攻撃防止率(APR)、実行可能攻撃APR(V-APR)、および誤検知率(FPR):
APRには、C0で本質的に失敗する攻撃も含まれます。V-APRは、C0で成功する攻撃のみを分母として使用する、より保守的な防御カバレッジの指標です。
繰り返し実行されたベニン(良性)コールのレイテンシベンチマークは、社内論文ワークスペースに results/latency/codex_20260523_latency.md として保存されています。これは、構成ごとに20回のウォームアップコールと100回の測定コールで BN-01(filesystem_server.read_file)を測定します。C-fullは、この固定されたベニンコールに対してC0と比較して中央値レイテンシが+0.488 ms増加し、p95は1.141 msのままです。公開されているCodeSyncツリーには results/ が含まれていないため、外部ユーザーは上記のコマンドでこの成果物を再生成します。
監査/オーバーライドワークフローは、社内に results/audit/codex_20260523_override.md として保存されています。これは、ベニン拒否が構造化された監査イベントとして記録され、policies/overrides 互換レイアウトの下でスコープ付きオペレーターオーバーライドを追加することで解決される方法を示しています。
フォーカスしたeBPFエッジテストは、社内に results/ebpf_edges/codex_20260523_ebpf_edges.md として保存されています。これらは、フェイルクローズのマップ可用性、ワークスペース書き込み許可動作、ディレクトリプレフィックス境界拒否、/tmp ステージング拒否、およびlocalhost流出拒否をカバーしています。
AgentBoundスタイルのベースラインチェックは、社内に results/agentbound/codex_20260523_agentbound.md として保存されています。これは、C-AB がサーバーごとのアプリケーションレベルの再現であることを文書化し、期待される引数可視カバレッジと実装に隠されたブラインドスポットを検証します。
MCPサーバーは信頼できないものとして扱われます。ベニンだが誤設定されたもの、意図的に悪意のあるもの、または正規サーバーのトロイの木馬化されたフォークである可能性があります。エージェント/ランナーとホストOSは信頼されます。eBPFレイヤーは、カーネルが侵害されていないことを前提とします。カーネル内の権限昇格(カーネルモジュールのCWE-269)は対象外です。
論文が公開され次第、BibTeXエントリがここに追加されます。
CONTRIBUTING.md を参照してください。すべての貢献者はMetaのCLAに署名する必要があります。
セキュリティ問題を報告するには、SECURITY.md を参照してください。セキュリティレポートについては、公開のGitHub issueを提出しないでください。
MIT — LICENSE を参照してください。
| Config | APR | V-APR | Viable blocked | FPR |
|---|
| C0 | 21.3% | 0.0% | 0/48 | 0/21 |
| C-AB | 37.7% | 20.8% | 10/48 | 0/21 |
| C-app | 42.6% | 27.1% | 13/48 | 0/21 |
| C-ebpf | 60.7% | 50.0% | 24/48 | 0/21 |
| C-full | 68.9% | 60.4% | 29/48 | 0/21 |
| C-AB+ebpf | 67.2% | 58.3% | 28/48 | 0/21 |