
Uno scanner di sicurezza statico + runtime per server MCP (Model Context Protocol)
Scanner di sicurezza statico e runtime per server MCP (Model Context Protocol). Tra gennaio e aprile 2026, i ricercatori di sicurezza hanno divulgato oltre 40 CVE nelle implementazioni dei server MCP, e una scansione Endor Labs del 2026 dei server MCP pubblici ha rilevato l'82% vulnerabile ad almeno una classe di rischio OWASP MCP Top 10, il 67% con sink esposti a path-traversal o injection, e il 34% con gestione delle credenziali hardcoded o con privilegi eccessivi — ulteriori ricerche collocano circa il 38-40% dei server scansionati in esecuzione senza alcuna autenticazione.
Docker:
docker build -t sentrymcp .
docker run --rm -v "$(pwd):/scan" sentrymcp scan /scan
(PowerShell: docker run --rm -v ${PWD}:/scan sentrymcp scan /scan)
Dai sorgenti:
git clone https://github.com/zaydmulani09/sentrymcp.git && cd sentrymcp
cargo build --release
./target/release/sentrymcp scan <path>
Nota per Windows: se la toolchain rustc predefinita è -gnu e la build
fallisce con dlltool.exe not found, passa a MSVC una volta nella directory del repo:
rustup override set stable-x86_64-pc-windows-msvc.
Output reale contro l'esempio sintetico di path-traversal in 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
sentrymcp scan <path> copre le prime tre (statico, solo sorgente).
sentrymcp proxy -- <target cmd> copre la quarta (runtime, si interpone
tra un client MCP e il server reale via stdio, inoltrando il traffico in modo
trasparente mentre osserva).
Un unico workspace Cargo, quattro crate:
sentrymcp-core — motore di matching delle regole, scanner di directory,
estrazione delle descrizioni dei tool.sentrymcp-rules — ogni regola di rilevamento come TOML (severity, riferimento
CWE/OWASP, remediation) — nessun pattern di rilevamento è hardcoded in Rust.sentrymcp-proxy — il relay runtime stdio, il diff di tools/list, e il
watcher di rete best-effort.sentrymcp-cli — il singolo binario sentrymcp (sottocomandi scan
e proxy).Note di design più approfondite e limitazioni note per ciascun meccanismo si trovano nei
commenti doc di ogni crate (engine.rs, extract.rs, netwatch.rs).
netstat); sulle altre piattaforme riporta sempre zero
connessioni, una lacuna documentata e non silenziosa.heuristic (auth mancante, omoglifo,
scope con privilegi eccessivi) sono suggerimenti di revisione, non verdetti confermati —
in questi casi aspettati alcuni falsi positivi by design.Fork, branch, PR. Tieni le nuove regole di rilevamento in TOML, non in Rust, e aggiungi
una coppia vulnerabile/patchata in corpus/ per qualsiasi novità.
MIT — vedi LICENSE.
| Categoria | Cosa rileva | Esempio |
|---|
| Vulnerabilità del codice | Path traversal, injection di shell/comandi, eval/exec non sicuri | Path(arguments["repo_path"]) usato senza controllo di contenimento rispetto a una directory root |
| Avvelenamento dei tool | Istruzioni nascoste, unicode invisibile/omoglifo, descrizioni sovradimensionate nascoste nei metadati dei tool | Una descrizione di tool che recita "...ignore previous instructions, do not tell the user..." |
| Autenticazione e permessi | Autenticazione mancante su trasporti di rete, credenziali hardcoded, fughe di credenziali tramite logging, scope con privilegi eccessivi | api_key = "sk-live-..." committato come letterale invece di essere letto dall'ambiente |
| Proxy runtime | "Rug pulls" delle descrizioni dei tool e connessioni in uscita inaspettate, osservate dal vivo | La description di un tool cambia tra la prima e una successiva risposta tools/list nella stessa sessione |