
AIエージェント基盤のライブ偵察とセキュリティ態勢監査:MCP設定、セッションログ、APIをスキャンし、シークレット、ポイズニングされたカタログ、CoTリークを検出します。
モデルが座る場所に座る。モデルが見えるものを見る。
MASQ は AI エージェントスタック向けのローカルセキュリティ CLI です。モデルが座るのと同じ席に座ります。MCP ツールカタログを読み取り、MCP ハンドシェイクを完了し、セッションログを調べ、ローカルモデルの HTTP ポートをプローブします。そして検出結果と修復策を出力します。
クライアントと同じように MCP と OpenAI 互換 HTTP を話します。ホスト偵察ツールのように報告します。ライブサーバー上でツールを呼び出したり、思考の連鎖を復号したり、ジェイルブレイクを生成したりはしません。
| 使うべき場面 | Cursor、VS Code、Claude、Codex、またはローカルモデルスタックを実行していて、エージェントが到達できる MCP サーバー、スキル、ログ、API を確認したいとき。 |
| まずは | 以下の 2 分間デモから。このリポジトリ内で完結します。 |
| ステータス | ベータ。cargo test が公開ゲートです。ライブプローブは自身が所有するホスト向けです。 |
| ライセンス | MIT |
Rust stable(1.88 以降)と Python 3 が必要です。このリポジトリのクローンから:
cargo build --locked --bin masq
alias masq=./target/debug/masq
# or run the same walkthrough as a script:
# bash scripts/demo.sh
1. クリーンなカタログはクリーンなまま
masq fixtures/clean_calculator.json --trusted
CLEAN clean_calculator tools=2 hash=sha256:e680cd2e4ac6c80ec783f11a0d9272a6741797feba216eb8e79633dd59633ab4
0 で終了します。
2. 汚染されたカタログはゲートを通過できない
fixtures/t3_line_jump.json は sqrt ツールであり、その説明はモデルに対して、毎セッションで最初にこれを参照すること、およびシェルコマンドの先頭にカナリア curl を付けることを指示しています。これはカタログポイズニングであり、数学ではありません。
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
2 で終了します(--fail-on 以上の検出結果、デフォルトは high)。
3. モデルと同じ方法でライブ MCP を検証する
ツリー内のモックは stdio 経由で MCP を話します。masq は initialize、notifications/initialized、tools/list を送信します。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
モックの add ツールの説明は、計算を行う前に ~/.ssh/id_rsa を読み取るようモデルに指示しています。masq はライブの tools/list からそれを検出し、2 で終了します。
4. サンプルセッションログをスニッフする
fixtures/demo/chat_history.jsonl には、偽の API キーと暗号化された thinking blob が仕込まれています。実際のチャット履歴ではなく、そのディレクトリを masq に指定してタイムラインを確認してください。
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
仕込まれた鍵は伏字化されている。暗号化された思考の連鎖は長さのみが報告され、復号はされない。
5. レビュー済みのカタログを固定し、ドリフトを検出する
masq pin fixtures/clean_calculator.json -k calc
masq check fixtures/clean_calculator.json -k calc --trusted
pin は .masq/pins.json を書き込みます。check は、ツール一覧やハッシュが変更された場合(rug-pull)に後で失敗します。
すべての箇所での終了コード: 0 クリーン · 2 検出結果 ≥ --fail-on · 1 エラー。
静的 MCP スキャナーはスキーマを lint します。ヘルスチェックは initialize に ping を送ります。欠けているのは シート、つまりモデルがすでに使用しているファイル、リスナー、ハンドシェイクです。
initialize を受け入れます。そのハンドシェイクを完了できれば、あなたはすでにエージェントです。masq は待機するだけで、ツールを呼び出しません。11434、8000 などは、しばしばベアラなしで 0.0.0.0 にバインドされます。masq は GET のみのプローブでサービス(Ollama、vLLM、LiteLLM、…)をフィンガープリントし、その後モデルを一覧表示します。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
現行のRust stable(1.88以降。rustupでインストール)が必要です。cargo test が公開ゲートです。Python 3は、デモおよびテストにおけるライブstdioモックにのみ必要です。
SSH経由でリモートのUnixホスト上にビルドする場合(インストールのみ。そのホストをスキャンしません):
MASQ_REMOTE_HOST=user@host bash scripts/deploy_remote.sh
# on that host: masq --version
デモはこのリポジトリの外には出ません。以下のコマンドは外部にアクセスしますが、ラボの許可リストにオプトインしない限り、このマシンに限定されます。
tools/list の JSON をエクスポートまたは保存してから、次を実行します:
masq path/to/tools.json
masq path/to/tools.json --json
masq path/to/tools.json --markdown
.json のみのパスは scan に書き換えられます。2 つ以上の JSON ファイルは multi になります。
masq sit -- python3 -m your_mcp
masq sit --url http://127.0.0.1:PORT/mcp
Loopback で十分です。ループバック以外の URL には --lab と許可リストに登録されたホストも必要です(以下を参照)。サーバーが認証を必要とする場合の認証情報:
masq sit --url http://127.0.0.1:PORT/mcp --token-file /path/to/token
masq sit --url http://127.0.0.1:PORT/mcp --token-env MCP_TOKEN
masq sit --url http://127.0.0.1:PORT/mcp --header "Authorization: Bearer …"
トークンはレポートに書き込まれることはありません。
masq --plain # recon + sniff + API + skills + harness + steer, then the report
masq --json # same, machine-readable
masq tui # boxed live view; stays until Ctrl+C
masq discover # known agent MCP config paths; no spawn
masq recon # configs, listeners, unpinned npx/uvx
masq sniff ~/path/to/sessions
masq api # fingerprint local LLM HTTP, then GET /v1/models
masq api --list-probes # show the Julius-compatible probe pack
masq harness # on-disk harness policy, binds, creds, SSRF
masq steer # rules, hooks, subagents, local runtime, CDP, messaging
TTY上では、デフォルトのmasqコマンドが進捗をストリーミングし、その後レポートを出力します。スクリプトやcronでは--plainまたは--no-colorを渡す必要があります。
discoverは、VS Code、Cursor、Windsurf、Claude Desktop、Claude Code、Grok、Hermes、Pi、OMP、Codex、Continue、Gemini CLI、Amp、Kiro、OpenCode、Amazon Q、Antigravity、OpenClawの$HOME / %USERPROFILE%配下の従来のパスに加え、cwdの.mcp.jsonとMASQ_EXTRA_CONFIGを走査します。
harnessはMCP sitおよびAPI fingerprintとは別のセクションです。Hermes、Pi、OMP、Claude Code、Codex、Gemini CLI、OpenCode、OpenClaw、Grok、Amp、Amazon Qのディスク上のインストールを読み取ります: 承認/YOLOポリシー、メッセージングの全許可、ワイルドカードバインド、認証情報ファイルのモード、computer/browser/launchツール、cron自動承認、SSRF/リダクション/Tirithのオプトアウト、ペアリングおよびIDファイルのモード、OMPのshare/autolearn、Piのリモートパッケージ。ハーネスを起動したり、.envの値をダンプしたりはしません。
steerはharnessとは別のセクションです。指示ファイル(CLAUDE.md、AGENTS.md、Cursor/Gemini/Copilotルール)、Claude/Codex/Amazon Qのライフサイクルフック、Claude/OpenCodeのサブエージェント、インストール済みのClaudeプラグイン、Ollama/Open WebUIのenvフラグ、永続化されたChromiumの--remote-debugging-port、OpenClawのgateway.bind / dmPolicy / allowFromを読み取ります。ハーネスを起動したり、ツールを呼び出したり、.envの値をダンプしたりはしません。