
Live-Recon und Posture-Auditing für KI-Agenten-Infrastrukturen: scannt MCP-Konfigurationen, Session-Logs und APIs nach Secrets, vergifteten Katalogen und CoT-Leaks.
Renaissance-Maskerade. Nimm Platz im Sitz des Agenten.
Nimm Platz im Sitz des Agenten.
Eine CLI, die MCP und OpenAI-kompatibel so spricht wie das Modell und dann wie linpeas berichtet. Befunde plus Behebungen. Keine Exploit-Payloads. Kein CoT-Entschlüsseln.
| Was | Live-Recon der Agent-Infrastruktur: MCP-Konfigurationen, Listener, Sitzungsprotokolle, verschlüsseltes Chain-of-Thought-Echo, unauthentifizierte APIs, Katalog-Poisoning, Skill-Trees. |
| Für wen | Betreiber von Hermes, Grok, Claude, Cursor, VS Code, Codex und lokalen Modell-Stacks, die sehen müssen, was der Agent sehen kann. |
| Was es nicht ist | Kein Jailbreak-Generator. Nicht der Decoder für schwächere Modelle (arXiv:2608.09867). Kein Runtime-Gateway. |
| Status | Beta. Offline cargo test ist das öffentliche Gate. Live --lab ist für Hosts, die du besitzt. |
| Lizenz | MIT |
Statische MCP-Scanner (Invariant mcp-scan, mcp-security-scan) linten Schemas und Konfigurationen. Health-Checks pingen initialize. Die Lücke ist der seat:
initialize kannst, bist du der Agent.:11434, :8000) binden oft 0.0.0.0 ohne Bearer-Token.Räder, auf denen wir fahren, nicht neu erfinden: bestehende Katalog-Detektoren + Pin/Check, netstat, ureq nur-GET, OWASP MCP Top 10 als Befund-Taxonomie. Wir haben weder mcp-scan noch mcp-security-scan geklont.
git clone https://gitlab.com/WattoCyber/masq.git
cd masq
cargo install --path .
# binary: masq
cargo test
# expect: exit 0
World-Suite (Binärdatei gegen Fixtures, lokale Mocks, Recon dieses Hosts):
python scripts/world_suite.py
# field = ~/.grok/sessions lab = allowlisted hosts bench = frozen-corpus wall
python scripts/world_suite.py --lanes all
Kali-artige Remote-Box, vom Desktop aus:
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
Exit: 0 sauber · 2 Befunde ≥ --fail-on (Standard: high) · 1 Fehler.
TUI ist optional (masq tui oder --tui). Standard auf einem tty ist ein Linpeas-Livestream, dann der Bericht. Cron nutzt --plain / --no-color.
Aliasse: doctor / audit → scan. chameleon → mimic. posture → seat.
sit / chameleon sprechen:
http://)ws://unix: und npipe:--framing auto versucht NDJSON, dann Content-Length)Auth (wird nie in den Bericht geschrieben):
--token-file PATH (die erste Zeile wird zu Authorization: Bearer …)--token-env VAR--header "Name: value" (wiederholbar)wss:// ist nicht eingebaut. Stunnel zu ws:// oder HTTP verwenden. HTTP folgt null Redirects.
Stdio-initialize bewirbt kein sampling. Server-sampling / elicitation kennzeichnen. Docs-URLs (model-catalog.json, /docs/) werden absichtlich ignoriert.
Config- und Skill-Wurzeln unter $HOME / %USERPROFILE%:
VS Code, Cursor, Windsurf, Claude Desktop, Claude Code, Grok, Hermes, Codex, Continue, Gemini CLI, Amp, Kiro, OpenCode, Amazon Q, Antigravity, OpenClaw.
Außerdem .mcp.json im aktuellen Arbeitsverzeichnis und MASQ_EXTRA_CONFIG (OS-Pfadliste).
--lab)--lab ist eine Allowlist, kein /24-Scan. Sie ist operator-konfiguriert. Über Loopback hinaus ist nichts einkompiliert.
MASQ_LAB_HOSTS: durch Komma, Leerzeichen oder Zeilenumbruch getrennte host:port oder Hosts..masq/lab-hosts: ein Host pro Zeile, #-Kommentare.Beispiel:
export MASQ_LAB_HOSTS="192.0.2.10,192.0.2.11"
masq --lab
MASQ_LAB_HOSTS wird für API-Probes und das TUI-Fleet-Rollup gelesen. MASQ_SIT_URLS (oder ein --mcp-url) liefert MCP-URLs zum Sitzen mit --lab.
sit --url außerhalb von Loopback benötigt --lab und einen allowlisteten Host. Unauthentifiziertes initialize auf Loopback ist High. Außerhalb der Box ist Critical.
Richte proxy nicht auf einen Host, auf den du nicht sitzen würdest.
Sniff-Priorität: zuerst chat_history.jsonl, dann Hermes request_dump_*, dann andere jsonl. Der Walk läuft zu Ende. Es behält nicht die ersten 300 WalkDir-Treffer. Richte masq sniff <ein-Sitzungsverzeichnis> auf ein einzelnes Verzeichnis, um tiefer zu gehen.
masq overnight --lab --hours 6 --interval-mins 20
# writes <cwd>/reports/overnight-YYYYMMDD/{latest.json,latest.md,latest.txt,delta.txt}
Mutiert keine Konfigurationen. Führt kein tools/call am Live-Server aus. delta.txt enthält baseline / no_change / CHANGE plus + severity title und - severity title.
classify --llm und das TUI-Triage-Add-on sind die einzigen Completions-POSTs (Grok /v1/chat/completions, Operator-Bestätigung). Ohne Key: nur lokale Behebungen. Key von XAI_API_KEY oder ~/.secrets/xai.txt. Wird nie ausgegeben.
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
Library-Crate: masq (scan_from_tools_list, scan_stdio, run_seat, PostureReport).
Gib ~/.secrets nicht aus. Recon zählt Dateien. Pfad + „loaded“.
cargo test
cargo clippy --all-targets -- -D warnings
Erwarte Exit 0.
Fixtures: T1-Beschreibungs-Poisoning, T3-Zeilensprung, T6-Parameternamen, T8-ANSI, T13-Duplikatnamen, Pin-Rugpull, Multi-List, Live-NDJSON-Mock unter tests/mock_mcp_server.py.
Secrets bleiben außerhalb von Git (reports/, data/, .env, *.key, secrets/, .masq/).
MIT. Copyright 2026 SamsonCyber.
| Befehl | Funktion |
|---|
seat (Standard) | Vollständige Posture: recon + sniff + api + skills + optionales sit. |
recon | Konfigurationsdateien, Listener, Shadow-URLs, sudo-argv, nicht gepinnte npx/uvx. |
sniff | Sitzungsprotokolle auf Geheimnisse, Klartext-Reasoning, verschlüsseltes CoT-Echo. |
sniff --timeline | T0001-Zeilen in Dateireihenfolge. Keine Entschlüsselung. Max. 200 Ereignisse/Datei. |
api | Nur-GET /v1/models (und Verwandtes) auf Loopback; --lab ergänzt Allowlist-Peers. |
sit | Spricht MCP: initialize, notifications/initialized, tools/list, prompts/list, resources/list. Initiiert nie tools/call. |
chameleon / mimic | Sit auf einem Live- oder Dateikatalog, schreibt catalog.json + aimock.json + calls.json. Beispiel-tools/call-Envelopes sind nur für aimock gedacht. |
discover | Gibt bekannte Agent-MCP-Konfigurationspfade aus. Kein Spawn. |
proxy | Leitet die JSON-RPC des Agents weiter. --block verweigert tools/call-Parameter/-Ergebnisse, die wie Geheimnisse aussehen. Hört standardmäßig auf 127.0.0.1:9877. |
sast | Lokale Source-Sinks. Nutzt semgrep, falls installiert. |
classify | Lokale IPI-/Poison-Prüfung eines Live-tools/list. --llm fragt Grok (Operator-Key). |
overnight | Wiederholt seat, bis --hours verstrichen sind. Schreibt Berichte. Mutiert keine Konfigurationen. |
map | Textbasierte Angriffspfad-Abfragen über ein gespeichertes Posture-JSON. Kein Diagramm. |
scan / multi | Statischer Katalog-Lint (nackte .json-Pfade werden hierhin umgeschrieben). |
pin / check | Content-Hash-Pin-Speicher (.masq/pins.json) für Rugpull-CI. |
detectors | Gibt das Katalog-Regelpaket aus. |
tui | Seat in einer Box. Bleibt bis Ctrl+C. |
| Modul | Abdeckung |
|---|
| recon | MCP01-Geheimnispfad, MCP04 nicht gepinnte npx/uvx, MCP07/09 Listener und Shadow-URLs, MCP05 sudo-argv |
| catalog | MCP03 Schema-Poisoning / Shadowing / Rugpull |
| skills | Dieselben Katalog-Detektoren auf SKILL.md (Hermes, Grok, Claude, Cursor, Codex, Gemini, Amp, Kiro, OpenCode, OpenClaw). Kein Snyk Cloud. |
| sit | MCP02 Scope Creep, MCP03 Live-tools/list, MCP07 unauthentifiziertes initialize, Server bewirbt sampling/elicitation, Streamable HTTP (2025-06-18), dann HTTP+SSE (2024-11-05), Origin-DNS-Rebinding |
| sniff | MCP01 + MCP10 + arXiv:2608.09867 verschlüsseltes CoT-Echo (inklusive thinkingSignature) |
| api | MCP07 unauthentifiziertes /v1/models, MCP09 LAN-Bind |
| watch | Pin-Diff auf .masq/pins.json + skills. Overnight setzt dies. Kein Proxy. |
| fleet | Lab-Allowlist-Rollup in einem FLEET-Abschnitt |
| map | Textpfad-Abfragen über einen Posture-Bericht |
| Limit | Wert |
|---|
| tools/list-Datei | 8 MiB |
| sniff-Datei | 8 MiB (bei größeren Dateien werden die ersten 2 MiB gesampelt) |
| sniff-Dateien / Wurzel | 300 (neueste mtime innerhalb der Priorität) |
| Timeline-Ereignisse / Datei | 200, dann timeline truncated |
| Timeline-T-Zeilen | 500 (inspect und collapse laufen trotzdem weiter) |
| Schema-Walk-Tiefe | 64 |
| Tools pro Inventar | 5_000 |
| HTTP-Probe | Nur GET, 2s API / 5s sit |
| sit-Handshake | Timeout + Kill |
| Dieses Tool | Nicht dieses Tool |
|---|
| Als Agent-Client sitzen (initialize + list) | tools/call gegen einen Live-Server initiieren |
| Verschlüsseltes CoT-Echo in Protokollen erkennen | CoT entschlüsseln oder in ein schwächeres Modell zurückspielen |
GET /v1/models | POST-Completions (außer opt-in TUI-Triage / classify --llm) |
| Pin-Hash-Rugpull auf einem Katalog | Signierte PKI / Enterprise-Pin-Vault |
tools/call des Agents in proxy --block weiterleiten | Vollwertiges Runtime-DLP-Gateway / SaaS-Control-Plane |
| Lokaler Skill-Tree-Lint | Snyk / Cloud-SCA |
| Prüfung | Erwartung |
|---|
masq fixtures/clean_calculator.json --trusted | exit 0 |
masq fixtures/t3_line_jump.json | exit 2 |
masq fixtures/t13_duplicate_names.json | exit 2 (Tool-Shadowing) |
masq sniff --timeline fixtures/ (non-TTY / --json) | T0001 nur mit dem Flag |
masq chameleon fixtures/clean_calculator.json -o <tmpdir> | catalog.json, aimock.json, calls.json |
Live-masq --no-color | Token geschwärzt (…, nicht volles sk-) |