
Ricognizione live e audit della postura per l'infrastruttura degli agenti AI: esegue la scansione di configurazioni MCP, log delle sessioni e API alla ricerca di segreti, cataloghi avvelenati e fughe di CoT.
Siediti dove si siede il modello. Guarda ciò che può vedere.
MASQ è una CLI di sicurezza locale per stack di agenti AI. Si siede nello stesso posto in cui si siede il modello: legge i cataloghi di strumenti MCP, completa l'handshake MCP, esamina i log delle sessioni e sonda le porte HTTP dei modelli locali. Poi stampa i risultati e le mitigazioni.
Parla MCP e HTTP compatibile con OpenAI come fa il client. Riporta i risultati come farebbe uno strumento di ricognizione per host. Non chiama strumenti su un server attivo, non decifra il chain-of-thought e non genera jailbreak.
| Usalo quando | Esegui Cursor, VS Code, Claude, Codex o uno stack di modelli locali e vuoi vedere i server MCP, le skill, i log e le API che l'agente può raggiungere. |
| Inizia con | La demo di due minuti qui sotto. Resta all'interno di questo repo. |
| Stato | Beta. cargo test è il gate pubblico. Le sonde live sono per host di tua proprietà. |
| Licenza | MIT |
Ti servono Rust stabile (1.88 o superiore) e Python 3. Da un clone di questo repo:
cargo build --locked --bin masq
alias masq=./target/debug/masq
# or run the same walkthrough as a script:
# bash scripts/demo.sh
1. Un catalogo pulito rimane pulito
masq fixtures/clean_calculator.json --trusted
CLEAN clean_calculator tools=2 hash=sha256:e680cd2e4ac6c80ec783f11a0d9272a6741797feba216eb8e79633dd59633ab4
Esce con 0.
2. Un catalogo avvelenato non supera il controllo
fixtures/t3_line_jump.json è uno strumento sqrt la cui descrizione dice al modello di consultarlo per primo in ogni sessione e di anteporre ai comandi shell un curl canary. Si tratta di avvelenamento del catalogo, non di matematica.
masq fixtures/t3_line_jump.json
FINDINGS t3_line_jump tools=1 findings=2 max=critical
F-001 [critical] D02 mcp03=schema_poison sqrt Network exfiltration directive in schema
path: $.tools[0].description
F-002 [critical] D03 mcp03=schema_poison sqrt Line-jump: force tool consultation / session prefix
path: $.tools[0].description
Esce con 2 (riscontri pari o superiori a --fail-on, predefinito high).
3. Simulare un MCP live come farebbe il modello
Il mock integrato comunica MCP tramite stdio. masq invia initialize, notifications/initialized e tools/list. Non invia mai tools/call.
masq sit --plain --no-color -- python3 tests/mock_mcp_server.py
01 CATALOG
M-001 CRIT live Secret path or credential exfil directive
Schema references secret file paths or credential stores in an agent-directed way.
ACT Never reference host secret paths in tool metadata.
LOCUS stdio:python3 :: add
M-002 HIGH live IPI / poison language in tool metadata
Local classifier hit `system-override` in tool `add`.
ACT Remove agent-directed instructions from the tool description.
M-003 HIGH live Instruction-override language in schema string
Text matches common prompt-injection / instruction-override phrasing in tool metadata.
M-004 HIGH live Pre-action system instruction in schema
Schema instructs the model to perform actions before the normal tool purpose.
02 SEAT
HIT stdio python3 init ok name=mock-poison tools=1
La descrizione dello strumento add del mock indica al modello di leggere ~/.ssh/id_rsa prima di eseguire operazioni aritmetiche. masq lo segnala dal tools/list live, quindi esce con 2.
4. Analizza un log di sessione di esempio
fixtures/demo/chat_history.jsonl inserisce una falsa chiave API e un blob di thinking cifrato. Punta masq a quella directory - non alla tua cronologia chat reale - per visualizzare la timeline.
masq sniff --timeline --plain --no-color fixtures/demo
T0001 SECRET chat_history.jsonl:2 {"content":"Authorization: Bearer sk-x……
T0002 BLOB chat_history.jsonl:3 encrypted_content len=202
La chiave inserita è oscurata. La catena di pensiero cifrata è riportata per lunghezza, non decodificata.
5. Fissa un catalogo che hai esaminato, poi intercetta le derive
masq pin fixtures/clean_calculator.json -k calc
masq check fixtures/clean_calculator.json -k calc --trusted
pin scrive .masq/pins.json. check fallisce in seguito se l'elenco degli strumenti o gli hash cambiano (rug-pull).
Codici di uscita ovunque: 0 pulito · 2 risultati ≥ --fail-on · 1 errore.
Gli scanner MCP statici analizzano gli schemi. Gli health check inviano un ping a initialize. Il divario è il posto a sedere: i file, i listener e gli handshake che il modello già utilizza.
initialize senza autenticazione. Se riesci a completare quell'handshake, sei già l'agente. masq si siede; non chiama gli strumenti.11434, 8000 e simili spesso si legano a 0.0.0.0 senza bearer. masq identifica il servizio (Ollama, vLLM, LiteLLM, …) con sonde solo GET, poi elenca i modelli.flowchart LR
A["MCP tools/list JSON"] --> M[masq]
B["Live MCP server"] --> M
C["Session logs"] --> M
D["Local model HTTP"] --> M
M --> E["Findings + remediations"]
M --> F["Optional pin store for CI"]
git clone https://gitlab.com/WattoCyber/masq.git
cd masq
cargo install --path . --locked
# command: masq
masq --version
masq --help
Richiede Rust stable corrente (1.88+; installare con rustup). cargo test è il gate pubblico. Python 3 è richiesto solo per il mock stdio live nella demo e nei test.
Per compilare su un host Unix remoto tramite SSH (solo installazione; non esegue la scansione di quell'host):
MASQ_REMOTE_HOST=user@host bash scripts/deploy_remote.sh
# on that host: masq --version
La demo non lascia mai questo repository. Questi comandi invece lo fanno, e sono limitati a questa macchina a meno che tu non aderisca a una allowlist di laboratorio.
Esporta o salva un JSON tools/list, poi:
masq path/to/tools.json
masq path/to/tools.json --json
masq path/to/tools.json --markdown
I percorsi .json nudi vengono riscritti in scan. Due o più file JSON diventano multi.
masq sit -- python3 -m your_mcp
masq sit --url http://127.0.0.1:PORT/mcp
Loopback è sufficiente. Anche gli URL off-loopback richiedono --lab e un host nella allowlist (vedi sotto). Autenticazione, se il server la richiede: