
Live-Recon und Posture-Auditing für KI-Agenten-Infrastrukturen: scannt MCP-Konfigurationen, Session-Logs und APIs nach Secrets, vergifteten Katalogen und CoT-Leaks.
Setz dich dorthin, wo das Modell sitzt. Sieh, was es sehen kann.
MASQ ist eine lokale Sicherheits-CLI für KI-Agenten-Stacks. Sie nimmt denselben Platz ein, an dem das Modell sitzt: Sie liest MCP-Tool-Kataloge, führt den MCP-Handshake durch, durchsucht Sitzungsprotokolle und prüft lokale Modell-HTTP-Ports. Anschließend gibt sie Befunde und Behebungsmaßnahmen aus.
Sie spricht MCP und OpenAI-kompatibles HTTP so, wie es der Client tut. Sie berichtet so, wie es ein Host-Recon-Tool tut. Sie ruft keine Tools auf einem Live-Server auf, entschlüsselt keine Gedankenketten und erzeugt keine Jailbreaks.
| Verwende es, wenn | Du Cursor, VS Code, Claude, Codex oder einen lokalen Modell-Stack betreibst und sehen möchtest, welche MCP-Server, Skills, Protokolle und APIs der Agent erreichen kann. |
| Beginne mit | Der untenstehenden Zwei-Minuten-Demo. Sie bleibt innerhalb dieses Repos. |
| Status | Beta. cargo test ist das öffentliche Gate. Live-Probes sind für Hosts gedacht, die dir gehören. |
| Lizenz | MIT |
Du benötigst Rust stable (1.88 oder neuer) und Python 3. Aus einem Klon dieses Repos:
cargo build --locked --bin masq
alias masq=./target/debug/masq
# or run the same walkthrough as a script:
# bash scripts/demo.sh
1. Ein sauberer Katalog bleibt sauber
masq fixtures/clean_calculator.json --trusted
CLEAN clean_calculator tools=2 hash=sha256:e680cd2e4ac6c80ec783f11a0d9272a6741797feba216eb8e79633dd59633ab4
Beende 0.
2. Ein vergifteter Katalog lässt das Gate fehlschlagen
fixtures/t3_line_jump.json ist ein sqrt-Tool, dessen Beschreibung das Modell anweist, es in jeder Sitzung zuerst zu konsultieren und Shell-Befehle mit einem Canary-curl zu versehen. Das ist Katalogvergiftung, keine Mathematik.
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
Exit 2 (Befunde auf oder über --fail-on, Standard high).
3. Ein Live-MCP so bedienen, wie es das Modell tut
Der im Baum enthaltene Mock spricht MCP über stdio. masq sendet initialize, notifications/initialized und tools/list. Es sendet niemals 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
Die Beschreibung des add-Tools des Mocks weist das Modell an, ~/.ssh/id_rsa zu lesen, bevor es Arithmetik ausführt. masq markiert dies aus dem Live-tools/list und beendet sich dann mit 2.
4. Eine Beispiel-Sitzungsprotokolldatei prüfen
fixtures/demo/chat_history.jsonl platziert einen gefälschten API-Schlüssel und einen verschlüsselten Thinking-Blob. Richten Sie masq auf dieses Verzeichnis - nicht auf Ihren echten Chat-Verlauf - um die Zeitleiste zu sehen.
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
Der eingepflanzte Schlüssel ist geschwärzt. Verschlüsselte Gedankenkette wird nach Länge gemeldet, nicht entschlüsselt.
5. Fixieren Sie einen von Ihnen geprüften Katalog und erkennen Sie dann Abweichungen
masq pin fixtures/clean_calculator.json -k calc
masq check fixtures/clean_calculator.json -k calc --trusted
pin schreibt .masq/pins.json. check schlägt später fehl, wenn sich die Tool-Liste oder die Hashes ändern (Rug-Pull).
Exit-Codes überall: 0 sauber · 2 Befunde ≥ --fail-on · 1 Fehler.
Statische MCP-Scanner prüfen Schemas per Linting. Health-Checks pingen initialize. Die Lücke ist der Sitzplatz: die Dateien, Listener und Handshakes, die das Modell bereits nutzt.
initialize ohne Authentifizierung. Wer diesen Handshake abschließen kann, ist bereits der Agent. masq bleibt passiv; es ruft keine Tools auf.11434, 8000 und Verwandte binden oft auf 0.0.0.0 ohne Bearer-Token. masq fingerprintet den Dienst (Ollama, vLLM, LiteLLM, …) mit GET-only-Probes und listet anschließend die Modelle auf.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
Erfordert aktuelles stabiles Rust (1.88+; Installation mit rustup). cargo test ist das öffentliche Gate. Python 3 wird nur für den Live-stdio-Mock in der Demo und in Tests benötigt.
Zum Bauen auf einem entfernten Unix-Host über SSH (nur Installation; scannt diesen Host nicht):
MASQ_REMOTE_HOST=user@host bash scripts/deploy_remote.sh
# on that host: masq --version
Die Demo verlässt dieses Repository nie. Diese Befehle tun es, und sie sind auf diese Maschine beschränkt, sofern Sie sich nicht für eine Lab-Allowlist entscheiden.
Exportieren oder speichern Sie ein tools/list-JSON und führen Sie dann aus:
masq path/to/tools.json
masq path/to/tools.json --json
masq path/to/tools.json --markdown
Nackte .json-Pfade werden zu scan umgeschrieben. Zwei oder mehr JSON-Dateien werden zu multi.
masq sit -- python3 -m your_mcp
masq sit --url http://127.0.0.1:PORT/mcp