
Um scanner de segurança estático + em tempo de execução para servidores MCP (Model Context Protocol)
Um scanner de segurança estático + runtime para servidores MCP (Model Context Protocol). Entre janeiro e abril de 2026, pesquisadores de segurança divulgaram mais de 40 CVEs em implementações de servidores MCP, e uma varredura de 2026 da Endor Labs em servidores MCP públicos encontrou 82% vulneráveis a pelo menos uma classe de risco do OWASP MCP Top 10, 67% expondo sinks de path-traversal ou com formato de injeção, e 34% com manipulação de credenciais codificadas ou com privilégios excessivos — pesquisas separadas estimaram que cerca de 38-40% dos servidores varridos rodavam sem nenhuma autenticação.
Docker:
docker build -t sentrymcp .
docker run --rm -v "$(pwd):/scan" sentrymcp scan /scan
(PowerShell: docker run --rm -v ${PWD}:/scan sentrymcp scan /scan)
A partir do código-fonte:
git clone https://github.com/zaydmulani09/sentrymcp.git && cd sentrymcp
cargo build --release
./target/release/sentrymcp scan <path>
Nota para Windows: se a toolchain padrão do rustc for -gnu e o build falhar com dlltool.exe not found, mude para MSVC uma vez dentro do diretório do repositório: rustup override set stable-x86_64-pc-windows-msvc.
Saída real contra o exemplo sintético de path-traversal em 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
| Categoria | O que detecta | Exemplo |
|---|---|---|
| Vulnerabilidades de código | Path traversal, injeção de shell/comandos, eval/exec inseguros | Path(arguments["repo_path"]) usado sem verificação de contenção em relação a um diretório raiz |
| Envenenamento de ferramentas | Instruções ocultas, unicode invisível/homoglifo, descrições superdimensionadas escondidas nos metadados da ferramenta | Uma descrição de ferramenta que diz "...ignore instruções anteriores, não conte ao usuário..." |
| Autenticação e permissões | Ausência de autenticação em transportes de rede, credenciais codificadas, vazamento de credenciais via logs, escopo com privilégios excessivos | api_key = "sk-live-..." gravada como literal em vez de lida do ambiente |
| Proxy de runtime | "Rug pulls" de descrição de ferramentas e conexões de saída inesperadas, observados ao vivo | A description de uma ferramenta muda entre a primeira resposta e uma resposta posterior de tools/list na mesma sessão |
sentrymcp scan <path> cobre as três primeiras (estático, somente código-fonte).
sentrymcp proxy -- <target cmd> cobre a quarta (runtime, fica entre
um cliente MCP e o servidor real via stdio, retransmitindo o tráfego de
forma transparente enquanto observa).
Um workspace Cargo, quatro crates:
sentrymcp-core — mecanismo de correspondência de regras, scanner de diretórios, extração de descrição de ferramentas.sentrymcp-rules — todas as regras de detecção em TOML (severidade, referência CWE/OWASP, remediação) — nenhum padrão de detecção é codificado em Rust.sentrymcp-proxy — o relé stdio de runtime, diffing de tools/list e o observador de rede best-effort.sentrymcp-cli — o único binário sentrymcp (subcomandos scan e proxy).Notas de design mais detalhadas e limitações conhecidas por mecanismo estão nos
comentários de doc de cada crate (engine.rs, extract.rs, netwatch.rs).
netstat); outras plataformas sempre reportam zero conexões, uma lacuna documentada em vez de silenciosa.heuristic (missing-auth, homoglyph, overprivileged-scope) são avisos de revisão, não vereditos confirmados — espere alguns falsos positivos aí por design.Fork, branch, PR. Mantenha novas regras de detecção em TOML, não em Rust, e adicione um
par vulnerável/corrigido em corpus/ para qualquer coisa nova.
MIT — veja LICENSE.