
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.
Mascherata rinascimentale. Siediti al posto dell'agente.
Siediti al posto dell'agente.
Una CLI che parla MCP e OpenAI-compat come fa il modello, poi genera report stile linpeas. Risultati più remediation. Nessun payload di exploit. Nessuna decrittazione del CoT.
| Cosa | Recon live dell'infrastruttura agente: config MCP, listener, log di sessione, eco della catena di pensiero cifrata, API non autenticate, avvelenamento del catalogo, alberi delle skill. |
| Chi | Operatori di Hermes, Grok, Claude, Cursor, VS Code, Codex e stack di modelli locali che hanno bisogno di vedere ciò che l'agente può vedere. |
| Cosa non è | Non è un generatore di jailbreak. Non è il decoder per modelli più deboli di arXiv:2608.09867. Non è un gateway runtime. |
| Stato | Beta. Il cargo test offline è il gate pubblico. Il --lab live è per host di tua proprietà. |
| Licenza | MIT |
Gli scanner MCP statici (Invariant mcp-scan, mcp-security-scan) fanno lint di schemi e config. I tool di health check fanno ping a initialize. Il buco è il posto:
initialize, sei l'agente.:11434, :8000) spesso fanno bind su 0.0.0.0 senza bearer.Ruote su cui viaggiamo, non che riscriviamo: detector di catalogo esistenti + pin/check, netstat, ureq solo GET, OWASP MCP Top 10 come tassonomia dei finding. Non abbiamo clonato mcp-scan o mcp-security-scan.
git clone https://gitlab.com/WattoCyber/masq.git
cd masq
cargo install --path .
# binary: masq
cargo test
# expect: exit 0
World suite (binario contro fixture, mock locali, recon sull'host corrente):
python scripts/world_suite.py
# field = ~/.grok/sessions lab = allowlisted hosts bench = frozen-corpus wall
python scripts/world_suite.py --lanes all
Box remoto stile Kali, dal desktop:
MASQ_REMOTE_HOST=user@host bash scripts/deploy_kali.sh
# on the box:
~/.local/bin/masq --plain
MASQ_LAB_HOSTS=... ~/.local/bin/masq --lab --plain
masq # live stream + posture report (includes skills)
masq --lab # same, plus allowlisted homelab hosts
masq tui # boxed TUI, stays until Ctrl+C
masq --plain # report only, no live stream
masq --json # machine report
masq recon # same dump, recon only
masq sniff ~/.grok/sessions # CoT / secrets in session logs
masq sniff --timeline PATH # file-order blob/secret/reason lines (no decrypt)
masq api # GET /v1/models on local (and --lab) ports
masq sit --url http://127.0.0.1:4443/mcp
masq chameleon --url http://127.0.0.1:4443/mcp -o /tmp/chameleon
masq chameleon --url ws://127.0.0.1:9000/mcp -o /tmp/chameleon
masq chameleon --url unix:///tmp/mcp.sock -o /tmp/chameleon
masq chameleon --token-file ~/.secrets/mcp.txt --url http://127.0.0.1:9/mcp -o /tmp/chameleon
masq chameleon -- python -m their_mcp -o /tmp/chameleon
# then: npx -y @copilotkit/aimock --config /tmp/chameleon/aimock.json
masq discover # find VS Code / Cursor / Claude / Grok / Hermes MCP configs
masq proxy --upstream http://127.0.0.1:4443/mcp --block
masq sast ./server # local sinks (semgrep if present)
masq classify --url http://127.0.0.1:4443/mcp --lab
masq overnight --lab --hours 6
masq map --from reports/overnight-YYYYMMDD/latest.json
# catalog
masq fixtures/t3_line_jump.json
masq fixtures/clean_calculator.json --trusted
masq pin fixtures/clean_calculator.json -k calc
masq check fixtures/clean_calculator.json -k calc
masq detectors
Uscita: 0 pulito · 2 finding ≥ --fail-on (default high) · 1 errore.
La TUI è opzionale (masq tui o --tui). Il default su una tty è un live stream in stile linpeas, poi il report. Cron usa --plain / --no-color.
Alias: doctor / audit → scan. chameleon → mimic. posture → seat.
sit / chameleon parlano:
http://)ws://unix: e npipe:--framing auto prova NDJSON poi Content-Length)Auth (mai scritta nel report):
--token-file PATH (la prima riga diventa Authorization: Bearer …)--token-env VAR--header "Name: value" (ripetibile)wss:// non è integrato. Stunnel verso ws:// oppure usa HTTP. HTTP non segue alcun redirect.
L'initialize stdio non pubblicizza sampling. Segnala il server sampling / elicitation. Gli URL di docs (model-catalog.json, /docs/) vengono ignorati di proposito.
Radici di config + skill sotto $HOME / %USERPROFILE%:
VS Code, Cursor, Windsurf, Claude Desktop, Claude Code, Grok, Hermes, Codex, Continue, Gemini CLI, Amp, Kiro, OpenCode, Amazon Q, Antigravity, OpenClaw.
Più .mcp.json nella cwd e MASQ_EXTRA_CONFIG (lista di path del sistema operativo).
--lab)--lab è un'allowlist, non una scansione /24. È configurata dall'operatore. Nulla è compilato oltre il loopback.
MASQ_LAB_HOSTS: host:port o host separati da virgola, spazio o newline..masq/lab-hosts: un host per riga, commenti #.Esempio:
export MASQ_LAB_HOSTS="192.0.2.10,192.0.2.11"
masq --lab
MASQ_LAB_HOSTS viene letta per i probe API e per il rollup fleet della TUI. MASQ_SIT_URLS (o un --mcp-url) fornisce gli URL MCP su cui fare sit con --lab.
Un sit --url fuori dal loopback richiede --lab e un host allowlistato. L'initialize non autenticato su loopback è High. Fuori dalla macchina è Critical.
Non puntare proxy verso un host su cui non faresti sit.
Priorità sniff: prima chat_history.jsonl, poi Hermes request_dump_*, poi altri jsonl. La walk arriva in fondo. Non tiene i primi 300 risultati di WalkDir. Punta masq sniff <una-directory-di-sessione> per andare più a fondo.
masq overnight --lab --hours 6 --interval-mins 20
# writes <cwd>/reports/overnight-YYYYMMDD/{latest.json,latest.md,latest.txt,delta.txt}
Non muta le config. Non fa tools/call sul server live. delta.txt è baseline / no_change / CHANGE più + gravità titolo e - gravità titolo.
classify --llm e il componente aggiuntivo di triage della TUI sono gli unici POST di completions (Grok /v1/chat/completions, conferma dell'operatore). Senza chiave: solo remediation locali. Chiave da XAI_API_KEY o ~/.secrets/xai.txt. Mai scritta.
CLI (clap) masq
→ seat | recon | sniff | api | sit | chameleon
→ discover | proxy | sast | classify | overnight | map
→ scan | multi | pin | check | detectors | tui
→ client (HTTP / SSE / ws / unix / npipe / stdio)
→ normalize (full-schema walk, caps)
→ detectors + sniff + recon + sit findings
→ report (text / JSON / Markdown) + optional TUI
Crate libreria: masq (scan_from_tools_list, scan_stdio, run_seat, PostureReport).
Non fare dump di ~/.secrets. Recon conta i file. Percorso + "loaded".
cargo test
cargo clippy --all-targets -- -D warnings
Atteso exit 0.
Fixture: T1 avvelenamento descrizione, T3 line-jump, T6 nomi parametri, T8 ANSI, T13 nomi duplicati, pin rugpull, multi-list, mock NDJSON live in tests/mock_mcp_server.py.
I segreti restano fuori da git (reports/, data/, .env, *.key, secrets/, .masq/).
MIT. Copyright 2026 SamsonCyber.
| Comando | Cosa fa |
|---|
seat (default) | Postura completa: recon + sniff + api + skills + sit opzionale. |
recon | File di config, listener, URL ombra, argv sudo, npx/uvx non pinnati. |
sniff | Log di sessione per segreti, ragionamento in chiaro, eco di CoT cifrato. |
sniff --timeline | Righe T0001 in ordine di file. Nessuna decrittazione. Massimo 200 eventi/file. |
api | Solo GET /v1/models (e affini) su loopback; --lab aggiunge peer allowlistati. |
sit | Parla MCP: initialize, notifications/initialized, tools/list, prompts/list, resources/list. Non origina mai tools/call. |
chameleon / mimic | Sit su un catalogo live o da file, scrive catalog.json + aimock.json + calls.json. Gli envelope tools/call di esempio sono solo per aimock. |
discover | Stampa i percorsi noti delle config MCP degli agenti. Nessuno spawn. |
proxy | Inoltra il JSON-RPC dell'agente. --block rifiuta parametri/risultati tools/call con forma di segreto. Listen di default 127.0.0.1:9877. |
sast | Sink sorgente locali. Usa semgrep se installato. |
classify | Revisione IPI / avvelenamento locale di un tools/list live. --llm chiede a Grok (chiave operatore). |
overnight | Ripete seat finché non trascorrono --hours. Scrive report. Non muta le config. |
map | Query testuali di attack path su un JSON di postura salvato. Nessun diagramma. |
scan / multi | Lint statico del catalogo (i percorsi .json nudi riscrivono a questo). |
pin / check | Archivio pin con hash del contenuto (.masq/pins.json) per CI anti-rug-pull. |
detectors | Stampa il pacchetto di regole del catalogo. |
tui | Seat in una scatola. Resta fino a Ctrl+C. |
| Modulo | Copre |
|---|
| recon | Percorso segreti MCP01, npx/uvx non pinnati MCP04, listener e URL ombra MCP07/09, sudo argv MCP05 |
| catalog | Avvelenamento schema / shadowing / rugpull MCP03 |
| skills | Stessi detector del catalogo su SKILL.md (Hermes, Grok, Claude, Cursor, Codex, Gemini, Amp, Kiro, OpenCode, OpenClaw). Nessun Snyk cloud. |
| sit | Scope creep MCP02, tools/list live MCP03, initialize non autenticato MCP07, annuncio server di sampling/elicitation, Streamable HTTP (2025-06-18) poi HTTP+SSE (2024-11-05), Origin DNS-rebinding |
| sniff | MCP01 + MCP10 + eco CoT cifrato arXiv:2608.09867 (incluso thinkingSignature) |
| api | MCP07 /v1/models non autenticato, bind LAN MCP09 |
| watch | Pin-diff su .masq/pins.json + skills. Overnight lo imposta. Non è un proxy. |
| fleet | Rollup dell'allowlist lab in un'unica sezione FLEET |
| map | Query testuali di path su un report di postura |
| Limite | Valore |
|---|
| file tools/list | 8 MiB |
| file sniff | 8 MiB (primi 2 MiB campionati se più grande) |
| file sniff / root | 300 (mtime più recente nella priorità) |
| eventi timeline / file | 200, poi timeline truncated |
| righe T timeline | 500 (inspect e collapse continuano comunque) |
| profondità walk dello schema | 64 |
| tools per inventario | 5_000 |
| probe HTTP | solo GET, 2s API / 5s sit |
| handshake sit | timeout + kill |
| Questo strumento | Non questo strumento |
|---|
| Sit come client dell'agente (initialize + list) | Originare tools/call verso un server live |
| Rilevare l'eco di CoT cifrato nei log | Decrittare il CoT o riprodurlo in un modello più debole |
GET /v1/models | POST di completions (tranne triage TUI opt-in / classify --llm) |
| Pin-hash anti-rugpull su un catalogo | PKI firmata / vault di pin enterprise |
Inoltrare il tools/call dell'agente in proxy --block | Gateway DLP runtime completo / control plane SaaS |
| Lint locale dell'albero delle skill | Snyk / SCA cloud |
| Controllo | Atteso |
|---|
masq fixtures/clean_calculator.json --trusted | exit 0 |
masq fixtures/t3_line_jump.json | exit 2 |
masq fixtures/t13_duplicate_names.json | exit 2 (shadowing dei tool) |
masq sniff --timeline fixtures/ (non-TTY / --json) | T0001 solo con il flag |
masq chameleon fixtures/clean_calculator.json -o <tmpdir> | catalog.json, aimock.json, calls.json |
masq --no-color live | token oscurati (…, non l'intero sk-) |