
Reconhecimento em tempo real e auditoria de postura para infraestrutura de agentes de IA: examina configurações de MCP, logs de sessão e APIs em busca de segredos, catálogos envenenados e vazamentos de CoT.
Mascarada renascentista. Sente-se no assento do agente.
Sente-se no assento do agente.
Um CLI que fala MCP e OpenAI-compat do jeito que o modelo fala e, em seguida, gera relatórios como o linpeas. Achados mais remediações. Sem payloads de exploração. Sem descriptografia de CoT.
| O quê | Reconhecimento ao vivo da infraestrutura do agente: configurações MCP, listeners, logs de sessão, eco de chain-of-thought criptografado, APIs sem autenticação, envenenamento de catálogo, árvores de skills. |
| Quem | Operadores de Hermes, Grok, Claude, Cursor, VS Code, Codex e pilhas de modelos locais que precisam ver o que o agente vê. |
| O que não é | Não é um gerador de jailbreak. Não é o decodificador de modelo mais fraco do arXiv:2608.09867. Não é um gateway de runtime. |
| Status | Beta. cargo test offline é o portão público. --lab ao vivo é para hosts que você possui. |
| Licença | MIT |
Scanners MCP estáticos (Invariant mcp-scan, mcp-security-scan) fazem lint de esquemas e configurações. Ferramentas de health check pingam initialize. A lacuna é o assento:
initialize, você é o agente.:11434, :8000) frequentemente fazem bind em 0.0.0.0 sem bearer.Rodas que usamos, não reescrevemos: detectores de catálogo existentes + pin/check, netstat, ureq somente GET, OWASP MCP Top 10 como taxonomia de achados. Não clonamos mcp-scan ou mcp-security-scan.
git clone https://gitlab.com/WattoCyber/masq.git
cd masq
cargo install --path .
# binary: masq
cargo test
# expect: exit 0
Suíte mundial (binário contra fixtures, mocks locais, reconhecimento deste host):
python scripts/world_suite.py
# field = ~/.grok/sessions lab = allowlisted hosts bench = frozen-corpus wall
python scripts/world_suite.py --lanes all
Caixa remota estilo Kali, a partir do 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
Saída: 0 limpo · 2 achados ≥ --fail-on (padrão high) · 1 erro.
A TUI é opcional (masq tui ou --tui). O padrão em um tty é um stream ao vivo estilo linpeas, seguido do relatório. Cron usa --plain / --no-color.
Aliases: doctor / audit → scan. chameleon → mimic. posture → seat.
sit / chameleon falam:
http://)ws://unix: e npipe:--framing auto tenta NDJSON e depois Content-Length)Autenticação (nunca despejada no relatório):
--token-file PATH (a primeira linha vira Authorization: Bearer …)--token-env VAR--header "Name: value" (repetível)wss:// não é nativo. Use Stunnel para ws:// ou HTTP. HTTP segue zero redirecionamentos.
O initialize via stdio não anuncia sampling. Sinalize o servidor sampling / elicitation. URLs de docs (model-catalog.json, /docs/) são ignoradas de propósito.
Raízes de configuração + skills sob $HOME / %USERPROFILE%:
VS Code, Cursor, Windsurf, Claude Desktop, Claude Code, Grok, Hermes, Codex, Continue, Gemini CLI, Amp, Kiro, OpenCode, Amazon Q, Antigravity, OpenClaw.
Além de .mcp.json no cwd e MASQ_EXTRA_CONFIG (lista de caminhos do SO).
--lab)--lab é uma allowlist, não um scan /24. É configurada pelo operador. Nada além de loopback é compilado.
MASQ_LAB_HOSTS variável de ambiente: host:porta ou hosts separados por vírgula, espaço ou nova linha..masq/lab-hosts arquivo: um host por linha, comentários com #.Exemplo:
export MASQ_LAB_HOSTS="192.0.2.10,192.0.2.11"
masq --lab
MASQ_LAB_HOSTS é lida para sondas de API e o rollup da frota na TUI.
MASQ_SIT_URLS (ou um --mcp-url) fornece URLs MCP para sit com --lab.
sit --url fora do loopback precisa de --lab e um host na allowlist. Initialize sem autenticação em loopback é Alto. Fora da máquina é Crítico.
Não aponte proxy para um host no qual você não sentaria.
Prioridade do sniff: chat_history.jsonl primeiro, depois Hermes request_dump_*, depois outros jsonl. A varredura termina. Ela não mantém os primeiros 300 resultados do WalkDir. Aponte masq sniff <um-diretório-de-sessão> para ir mais fundo.
masq overnight --lab --hours 6 --interval-mins 20
# writes <cwd>/reports/overnight-YYYYMMDD/{latest.json,latest.md,latest.txt,delta.txt}
Não altera configurações. Não faz tools/call no servidor ao vivo. delta.txt é baseline / no_change / CHANGE mais + severidade título e - severidade título.
classify --llm e o add-on de triagem da TUI são os únicos POSTs de completions (Grok /v1/chat/completions, confirmação do operador). Sem chave: apenas remediações locais. Chave de XAI_API_KEY ou ~/.secrets/xai.txt. Nunca despejada.
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 da biblioteca: masq (scan_from_tools_list, scan_stdio, run_seat, PostureReport).
Não despeje ~/.secrets. Recon conta arquivos. Caminho + "loaded".
cargo test
cargo clippy --all-targets -- -D warnings
Espere saída 0.
Fixtures: T1 envenenamento de descrição, T3 line-jump, T6 nomes de parâmetros, T8 ANSI, T13 nomes duplicados, pin rugpull, multi-lista, mock NDJSON ao vivo em tests/mock_mcp_server.py.
Segredos ficam fora do git (reports/, data/, .env, *.key, secrets/, .masq/).
MIT. Copyright 2026 SamsonCyber.
| Comando | O que faz |
|---|
seat (padrão) | Postura completa: recon + sniff + api + skills + sit opcional. |
recon | Arquivos de configuração, listeners, shadow URLs, sudo argv, npx/uvx sem pin. |
sniff | Logs de sessão para segredos, raciocínio em texto puro, eco CoT criptografado. |
sniff --timeline | Linhas T0001 em ordem de arquivo. Sem descriptografia. Limite de 200 eventos/arquivo. |
api | Somente GET /v1/models (e afins) em loopback; --lab adiciona peers na allowlist. |
sit | Fala MCP: initialize, notifications/initialized, tools/list, prompts/list, resources/list. Nunca origina tools/call. |
chameleon / mimic | Senta em um catálogo ao vivo ou de arquivo, escreve catalog.json + aimock.json + calls.json. Exemplos de envelopes tools/call são apenas para aimock. |
discover | Imprime caminhos de configuração MCP conhecidos de agentes. Sem spawn. |
proxy | Encaminha o JSON-RPC do agente. --block recusa parâmetros/resultados de tools/call com formato de segredo. Listen padrão 127.0.0.1:9877. |
sast | Sinks locais de código-fonte. Usa semgrep quando instalado. |
classify | Revisão local de IPI / envenenamento de um tools/list ao vivo. --llm pergunta ao Grok (chave do operador). |
overnight | Repete seat até que --hours decorram. Escreve relatórios. Não altera configurações. |
map | Consultas textuais de caminho de ataque sobre um JSON de postura salvo. Sem diagrama. |
scan / multi | Lint estático de catálogo (caminhos .json nus reescrevem para isto). |
pin / check | Armazenamento de pin por hash de conteúdo (.masq/pins.json) para CI de rugpull. |
detectors | Imprime o pacote de regras do catálogo. |
tui | Seat em caixa. Permanece até Ctrl+C. |
| Módulo | Abrange |
|---|
| recon | MCP01 caminho de segredos, MCP04 npx/uvx sem pin, MCP07/09 listeners e shadow URLs, MCP05 sudo argv |
| catalog | MCP03 envenenamento de schema / shadowing / rugpull |
| skills | Os mesmos detectores de catálogo em SKILL.md (Hermes, Grok, Claude, Cursor, Codex, Gemini, Amp, Kiro, OpenCode, OpenClaw). Sem Snyk cloud. |
| sit | MCP02 scope creep, MCP03 tools/list ao vivo, MCP07 initialize sem autenticação, anúncio de sampling/elicitation do servidor, Streamable HTTP (2025-06-18) e depois HTTP+SSE (2024-11-05), Origin DNS-rebinding |
| sniff | MCP01 + MCP10 + arXiv:2608.09867 eco CoT criptografado (incluindo thinkingSignature) |
| api | MCP07 /v1/models sem autenticação, MCP09 bind LAN |
| watch | pin-diff em .masq/pins.json + skills. Overnight define isso. Não é um proxy. |
| fleet | rollup da allowlist de lab em uma seção FLEET |
| map | Consultas textuais de caminho sobre um relatório de postura |
| Limite | Valor |
|---|
| arquivo tools/list | 8 MiB |
| arquivo de sniff | 8 MiB (primeiros 2 MiB amostrados se maior) |
| arquivos de sniff / raiz | 300 (mtime mais recente dentro da prioridade) |
| eventos de timeline / arquivo | 200, depois timeline truncated |
| linhas T do timeline | 500 (inspect e collapse ainda executam) |
| profundidade do walk de schema | 64 |
| ferramentas por inventário | 5_000 |
| sonda HTTP | Somente GET, API 2s / sit 5s |
| handshake do sit | timeout + kill |
| Esta ferramenta | Não é esta ferramenta |
|---|
| Atuar como o cliente do agente (initialize + list) | Originar tools/call contra um servidor ao vivo |
| Detectar eco CoT criptografado em logs | Descriptografar CoT ou reproduzir em um modelo mais fraco |
GET /v1/models | POST completions (exceto triagem TUI opt-in / classify --llm) |
| Rugpull por pin-hash em um catálogo | PKI assinada / cofre de pin corporativo |
Encaminhar o tools/call do agente em proxy --block | Gateway DLP completo de runtime / plano de controle SaaS |
| Lint local de árvore de skills | Snyk / cloud SCA |
| Verificação | Esperado |
|---|
masq fixtures/clean_calculator.json --trusted | saída 0 |
masq fixtures/t3_line_jump.json | saída 2 |
masq fixtures/t13_duplicate_names.json | saída 2 (sombreamento de ferramenta) |
masq sniff --timeline fixtures/ (non-TTY / --json) | T0001 apenas com a flag |
masq chameleon fixtures/clean_calculator.json -o <tmpdir> | catalog.json, aimock.json, calls.json |
masq --no-color ao vivo | tokens redigidos (…, não o sk- completo) |