
Reconocimiento en vivo y auditoría de postura para la infraestructura de agentes de IA: escanea configuraciones de MCP, registros de sesión y APIs en busca de secretos, catálogos envenenados y fugas de CoT.
Siéntate donde se sienta el modelo. Ve lo que puede ver.
MASQ es una CLI de seguridad local para stacks de agentes de IA. Ocupa el mismo asiento en el que se sienta el modelo: lee catálogos de herramientas MCP, completa el handshake de MCP, revisa los registros de sesión y sondea los puertos HTTP de modelos locales. Después imprime hallazgos y remediaciones.
Habla MCP y HTTP compatible con OpenAI tal como lo hace el cliente. Reporta como lo hace una herramienta de reconocimiento de hosts. No llama a herramientas en un servidor en vivo, no descifra el chain-of-thought ni genera jailbreaks.
| Úsalo cuando | Ejecutas Cursor, VS Code, Claude, Codex o un stack de modelos locales y quieres ver los servidores MCP, skills, registros y APIs a los que el agente puede llegar. |
| Empieza con | La demo de dos minutos de abajo. Se mantiene dentro de este repo. |
| Estado | Beta. cargo test es la puerta pública. Los sondeos en vivo son para hosts que tú controlas. |
| Licencia | MIT |
Necesitas Rust estable (1.88 o superior) y Python 3. Desde un clon de este 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 catálogo limpio se mantiene limpio
masq fixtures/clean_calculator.json --trusted
CLEAN clean_calculator tools=2 hash=sha256:e680cd2e4ac6c80ec783f11a0d9272a6741797feba216eb8e79633dd59633ab4
Salida 0.
2. Un catálogo envenenado no pasa la puerta
fixtures/t3_line_jump.json es una herramienta sqrt cuya descripción indica al modelo que la consulte primero en cada sesión y que anteponga a los comandos de shell un curl canario. Eso es veneno de catálogo, no matemáticas.
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
Sale con 2 (hallazgos iguales o superiores a --fail-on, por defecto high).
3. Simular un MCP en vivo tal como lo hace el modelo
El mock incluido en el árbol habla MCP sobre stdio. masq envía initialize, notifications/initialized y tools/list. Nunca envía 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 descripción de la herramienta add del mock le indica al modelo que lea ~/.ssh/id_rsa antes de hacer aritmética. masq lo marca desde el tools/list en vivo y luego sale con 2.
4. Inspeccionar un registro de sesión de ejemplo
fixtures/demo/chat_history.jsonl inserta una clave de API falsa y un blob de pensamiento cifrado. Apunta masq a ese directorio —no a tu historial de chat real— para ver la línea de tiempo.
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 clave implantada está censurada. La cadena de pensamiento cifrada se reporta por longitud, no se decodifica.
5. Fija un catálogo que hayas revisado y luego detecta la deriva
masq pin fixtures/clean_calculator.json -k calc
masq check fixtures/clean_calculator.json -k calc --trusted
pin escribe .masq/pins.json. check falla más tarde si la lista de herramientas o los hashes cambian (rug-pull).
Códigos de salida en todas partes: 0 limpio · 2 hallazgos ≥ --fail-on · 1 error.
Los escáneres MCP estáticos analizan esquemas. Las comprobaciones de estado hacen ping a initialize. El vacío está en el asiento: los archivos, los listeners y los handshakes que el modelo ya utiliza.
initialize sin autenticación. Si puedes completar ese handshake, ya eres el agente. masq se limita a observar; no llama a herramientas.11434, 8000 y similares a menudo se enlazan a 0.0.0.0 sin bearer. masq identifica el servicio (Ollama, vLLM, LiteLLM, …) con sondeos solo GET y luego enumera los modelos.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
Requiere Rust estable actual (1.88+; instalar con rustup). cargo test es la puerta pública. Python 3 solo es necesario para el mock de stdio en vivo en la demo y en las pruebas.
Para compilar en un host Unix remoto a través de SSH (solo instalación; no escanea ese host):
MASQ_REMOTE_HOST=user@host bash scripts/deploy_remote.sh
# on that host: masq --version
La demo nunca sale de este repositorio. Estos comandos sí lo hacen, y están limitados a esta máquina a menos que optes por una lista de permitidos de laboratorio.
Exporta o guarda un JSON de tools/list, luego:
masq path/to/tools.json
masq path/to/tools.json --json
masq path/to/tools.json --markdown
Las rutas .json sin formato se reescriben a scan. Dos o más archivos JSON se convierten en multi.
masq sit -- python3 -m your_mcp
masq sit --url http://127.0.0.1:PORT/mcp
Loopback es suficiente. Las URL fuera de loopback también requieren --lab y un host en la lista de permitidos (ver más abajo). Autenticación, si el servidor la necesita: