MCP(Model Context Protocol)サーバーのための静的+ランタイムセキュリティ スキャナーです。2026年1月から4月にかけて、セキュリティ研究者らはMCP サーバー実装全体で40件以上のCVEを開示しました。また、2026年のEndor Labs による公開MCPサーバーのスキャンでは、82%がOWASP MCP Top 10のリスク クラスの少なくとも1つに対して脆弱で、67%がパストラバーサルまたは インジェクション型のシンクを露出し、34%がハードコードまたは過剰権限の 認証情報処理を行っていることが判明しました。さらに別の調査では、スキャン したサーバーの約38〜40%がまったく認証なしで稼働していると報告されています。
Docker:
docker build -t sentrymcp .
docker run --rm -v "$(pwd):/scan" sentrymcp scan /scan
(PowerShell: docker run --rm -v ${PWD}:/scan sentrymcp scan /scan)
ソースから:
git clone https://github.com/zaydmulani09/sentrymcp.git && cd sentrymcp
cargo build --release
./target/release/sentrymcp scan <path>
Windowsの注意:デフォルトのrustcツールチェーンが-gnuの場合、ビルドが
dlltool.exe not foundで失敗します。その場合はリポジトリディレクトリ内で
MSVCに切り替えてください:rustup override set stable-x86_64-pc-windows-msvc。
corpus/内の合成パストラバーサル例に対する実際の出力:
$ sentrymcp scan corpus/vulnerable-git-server
== Code Vulnerabilities ==
[HIGH] mcp_server_git/server.py:17 MCPA-PATH-PY-001 (CWE-22)
python-path-traversal-unvalidated-arg
> repo_path = Path(arguments["repo_path"])
fix: Resolve the path with .resolve() and verify containment (e.g. path.resolve().is_relative_to(allowed_root)) before using it, or reject paths containing '..'.
[HIGH] mcp_server_git/server.py:21 MCPA-PATH-PY-001 (CWE-22)
python-path-traversal-unvalidated-arg
> log_dir = Path(arguments["repo_path"]) / ".git" / "logs"
fix: Resolve the path with .resolve() and verify containment (e.g. path.resolve().is_relative_to(allowed_root)) before using it, or reject paths containing '..'.
summary (code vulnerabilities): 2 findings — 0 critical, 2 high, 0 medium, 0 low
total: 2 findings
| カテゴリ | 検出内容 | 例 |
|---|---|---|
| コード脆弱性 | パストラバーサル、シェル/コマンドインジェクション、安全でないeval/exec | ルートディレクトリに対する包含チェックなしで使用されたPath(arguments["repo_path"]) |
| ツールポイズニング | 隠し命令、不可視/ホモグリフUnicode、ツールメタデータに隠された過大な説明 | 「...前の指示は無視して、ユーザーに伝えてはいけない...」と書かれたツールの説明 |
| 認証と権限 | ネットワークトランスポートでの認証欠如、ハードコードされた認証情報、ログによる認証情報漏えい、過剰権限のスコープ | 環境から読み取らずリテラルとしてコミットされたapi_key = "sk-live-..." |
| ランタイムプロキシ | ライブ観測されるツール説明の「ラグプル(rug pull)」と想定外のアウトバウンド接続 | 同じセッション内で、最初のtools/listレスポンスとその後のtools/listレスポンスの間でツールのdescriptionが変化する |
sentrymcp scan <path>は最初の3つ(静的、ソースのみ)を対象とします。
sentrymcp proxy -- <target cmd>は4つ目(ランタイム。stdioを介してMCP
クライアントと実際のサーバーの間に位置し、監視しながらトラフィックを
透過的に中継します)を対象とします。
1つのCargoワークスペース、4つのクレート構成:
sentrymcp-core — ルールマッチングエンジン、ディレクトリスキャナー、
ツール説明の抽出。sentrymcp-rules — すべての検出ルールをTOMLとして保持(深刻度、CWE/OWASP
参照、修復方法)— Rustにハードコードされた検出パターンはありません。sentrymcp-proxy — ランタイムのstdioリレー、tools/listの差分検出、
ベストエフォートのネットワークウォッチャー。sentrymcp-cli — 単一のsentrymcpバイナリ(scanおよびproxy
サブコマンド)。各メカニズムの詳細な設計メモと既知の制限事項は、各クレートのドキュメント
コメント(engine.rs、extract.rs、netwatch.rs)に記載されています。
netstatベース)でのみ動作する実装があります。他のプラットフォームでは
常に接続数0と報告されます。これは黙って失敗するのではなく、文書化された
ギャップです。heuristic信頼度とマークされた検出結果(missing-auth、homoglyph、
overprivileged-scope)は、確定した判定ではなくレビューを促すものです —
設計上、そこにはある程度の誤検知が含まれることを想定してください。Forkしてブランチを切り、PRを送ってください。新しい検出ルールはRustではなく
TOMLで記述し、新しいものを追加する際はcorpus/に脆弱版/修正版のペアを
追加してください。
MIT — LICENSEを参照してください。