
AI 에이전트 인프라를 위한 실시간 정찰 및 보안 상태 감사: MCP 구성, 세션 로그, API를 스캔하여 비밀 정보, 오염된 카탈로그, CoT 유출을 탐지합니다.
르네상스 가장무도회. 에이전트의 자리에 앉으세요.
에이전트의 자리에 앉으세요.
모델과 같은 방식으로 MCP와 OpenAI 호환 프로토콜을 구사한 뒤, linpeas처럼 보고하는 CLI입니다. 발견 사항과 수정 조치를 함께 제공합니다. 익스플로잇 페이로드 없음. CoT 복호화 없음.
| 개요 | 에이전트 인프라의 실시간 정찰: MCP 구성, 리스너, 세션 로그, 암호화된 chain-of-thought 에코, 인증 없는 API, 카탈로그 포이즈닝, 스킬 트리. |
| 대상 | Hermes, Grok, Claude, Cursor, VS Code, Codex 및 로컬 모델 스택 운영자 중 에이전트가 볼 수 있는 것을 확인해야 하는 사람. |
| 이 도구가 아닌 것 | 제일브레이크 생성기가 아닙니다. arXiv:2608.09867 약한 모델 디코더가 아닙니다. 런타임 게이트웨이가 아닙니다. |
| 상태 | 베타. 오프라인 cargo test가 공개 게이트입니다. 라이브 --lab은 본인이 소유한 호스트용입니다. |
| 라이선스 | MIT |
정적 MCP 스캐너(Invariant mcp-scan, mcp-security-scan)는 스키마와 구성을 린트합니다. 상태 점검 도구는 initialize를 핑합니다. 빈틈은 바로 seat입니다:
initialize를 할 수 있다면, 당신이 바로 에이전트입니다.:11434, :8000)는 종종 bearer 없이 0.0.0.0에 바인딩됩니다.우리가 다시 만들지 않고 그대로 활용하는 것들: 기존 카탈로그 탐지기 + pin/check, netstat, GET 전용 ureq, 발견 사항 분류 체계로서의 OWASP MCP Top 10. 우리는 mcp-scan이나 mcp-security-scan을 복제하지 않았습니다.
git clone https://gitlab.com/WattoCyber/masq.git
cd masq
cargo install --path .
# binary: masq
cargo test
# expect: exit 0
월드 스위트(픽스처, 로컬 목, 이 호스트 정찰에 대한 바이너리 기반):
python scripts/world_suite.py
# field = ~/.grok/sessions lab = allowlisted hosts bench = frozen-corpus wall
python scripts/world_suite.py --lanes all
데스크톱에서 Kali 스타일 원격 박스로 배포:
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
종료 코드: 0 깨끗함 · 2 발견 사항 ≥ --fail-on(기본값 high) · 1 오류.
TUI는 옵트인입니다(masq tui 또는 --tui). tty에서는 기본적으로 linpeas 라이브 스트림 후 보고서가 표시됩니다. Cron에서는 --plain / --no-color를 사용합니다.
별칭: doctor / audit → scan. chameleon → mimic. posture → seat.
sit / chameleon이 구사하는 프로토콜:
http://)ws://unix: 및 npipe:--framing auto는 NDJSON을 시도한 후 Content-Length)인증(보고서에 덤프되지 않음):
--token-file PATH(첫 번째 줄이 Authorization: Bearer …가 됨)--token-env VAR--header "Name: value"(반복 가능)wss://는 내장되어 있지 않습니다. ws://로 Stunnel을 쓰거나 HTTP를 사용하세요. HTTP는 리다이렉트를 전혀 따르지 않습니다.
Stdio initialize는 sampling을 광고하지 않습니다. 서버의 sampling / elicitation을 플래그로 표시하세요. 문서 URL(model-catalog.json, /docs/)은 의도적으로 무시됩니다.
$HOME / %USERPROFILE% 아래의 구성 + 스킬 루트:
VS Code, Cursor, Windsurf, Claude Desktop, Claude Code, Grok, Hermes, Codex, Continue, Gemini CLI, Amp, Kiro, OpenCode, Amazon Q, Antigravity, OpenClaw.
추가로 cwd의 .mcp.json 및 MASQ_EXTRA_CONFIG(OS 경로 목록).
--lab)--lab은 /24 스캔이 아니라 허용 목록입니다. 운영자가 구성합니다. 루프백 외에는 아무것도 컴파일되어 있지 않습니다.
MASQ_LAB_HOSTS 환경 변수: 쉼표, 공백 또는 줄바꿈으로 구분된 host:port 또는 호스트 목록..masq/lab-hosts 파일: 줄마다 호스트 하나, #는 주석.예:
export MASQ_LAB_HOSTS="192.0.2.10,192.0.2.11"
masq --lab
MASQ_LAB_HOSTS는 API 프로브와 TUI fleet 롤업에 사용됩니다. MASQ_SIT_URLS(또는 --mcp-url)는 --lab과 함께 sit할 MCP URL을 제공합니다.
루프백이 아닌 sit --url에는 --lab과 허용 목록에 등록된 호스트가 필요합니다. 루프백에서 인증 없는 initialize는 High입니다. 박스 외부에서는 Critical입니다.
sit하지 않을 호스트를 proxy에 지정하지 마세요.
sniff 우선순위: chat_history.jsonl 먼저, 그다음 Hermes request_dump_*, 그다음 기타 jsonl. 전체 탐색은 끝까지 수행됩니다. 처음 300개의 WalkDir 적중 항목만 취하지 않습니다. 더 깊이 조사하려면 masq sniff <세션-디렉터리-하나>를 지정하세요.
masq overnight --lab --hours 6 --interval-mins 20
# writes <cwd>/reports/overnight-YYYYMMDD/{latest.json,latest.md,latest.txt,delta.txt}
구성을 변경하지 않습니다. 라이브 서버에 tools/call을 하지 않습니다. delta.txt는 baseline / no_change / CHANGE에 + 심각도 제목과 - 심각도 제목을 더한 형태입니다.
classify --llm과 TUI 트리아지 애드온만이 유일한 completions POST입니다(Grok /v1/chat/completions, 운영자 확인). 키가 없으면 로컬 수정 조치만 제공됩니다. 키는 XAI_API_KEY 또는 ~/.secrets/xai.txt에서 가져옵니다. 절대 덤프되지 않습니다.
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
라이브러리 크레이트: masq(scan_from_tools_list, scan_stdio, run_seat, PostureReport).
~/.secrets를 덤프하지 마세요. Recon은 파일 수를 셉니다. 경로 + "loaded"만 표시합니다.
cargo test
cargo clippy --all-targets -- -D warnings
종료 코드 0을 기대합니다.
픽스처: T1 설명 포이즈닝, T3 라인 점프, T6 파라미터 이름, T8 ANSI, T13 중복 이름, 핀 러그풀, 다중 목록, tests/mock_mcp_server.py의 라이브 NDJSON 목.
시크릿은 git에 포함되지 않습니다(reports/, data/, .env, *.key, secrets/, .masq/).
MIT. Copyright 2026 SamsonCyber.
| Command | 설명 |
|---|
seat (default) | 전체 포스처: recon + sniff + api + skills + 선택적 sit. |
recon | 구성 파일, 리스너, 섀도 URL, sudo argv, 고정되지 않은 npx/uvx. |
sniff | 시크릿, 평문 추론, 암호화된 CoT 에코에 대한 세션 로그 검사. |
sniff --timeline | 파일 순서대로 T0001 라인. 복호화 없음. 파일당 200개 이벤트로 제한. |
api | 루프백에서 GET 전용 /v1/models(및 유사 엔드포인트); --lab은 허용 목록의 피어를 추가합니다. |
sit | MCP 구사: initialize, notifications/initialized, tools/list, prompts/list, resources/list. tools/call을 자체적으로 시작하지 않습니다. |
chameleon / mimic | 라이브 또는 파일 카탈로그에 sit하여 catalog.json + aimock.json + calls.json을 작성합니다. 예제 tools/call 봉투는 aimock 전용입니다. |
discover | 알려진 에이전트 MCP 구성 경로를 출력합니다. 프로세스를 생성하지 않습니다. |
proxy | 에이전트의 JSON-RPC를 전달합니다. --block은 시크릿 형태의 tools/call 파라미터/결과를 거부합니다. 기본 리슨 주소는 127.0.0.1:9877입니다. |
sast | 로컬 소스 싱크. 설치된 경우 semgrep을 사용합니다. |
classify | 라이브 tools/list에 대한 로컬 IPI / 포이즈닝 검토. --llm은 Grok에 질문합니다(운영자 키). |
overnight | --hours 경과까지 seat 반복. 보고서를 작성합니다. 구성을 변경하지 않습니다. |
map | 저장된 포스처 JSON에 대한 텍스트 공격 경로 쿼리. 다이어그램 없음. |
scan / multi | 정적 카탈로그 린트(베어 .json 경로는 이 명령으로 리라이트됨). |
pin / check | 러그풀 CI를 위한 콘텐츠 해시 핀 저장소(.masq/pins.json). |
detectors | 카탈로그 규칙 팩을 출력합니다. |
tui | 박스형 seat. Ctrl+C까지 유지됩니다. |
| Module | 담당 |
|---|
| recon | MCP01 시크릿 경로, MCP04 고정되지 않은 npx/uvx, MCP07/09 리스너 및 섀도 URL, MCP05 sudo argv |
| catalog | MCP03 스키마 포이즈닝 / 섀도잉 / 러그풀 |
| skills | SKILL.md(Hermes, Grok, Claude, Cursor, Codex, Gemini, Amp, Kiro, OpenCode, OpenClaw)에 동일한 카탈로그 탐지기 적용. Snyk 클라우드 없음. |
| sit | MCP02 범위 확장, MCP03 라이브 tools/list, MCP07 인증 없는 initialize, 서버의 sampling/elicitation 광고, Streamable HTTP(2025-06-18) 이후 HTTP+SSE(2024-11-05), Origin DNS-리바인딩 |
| sniff | MCP01 + MCP10 + arXiv:2608.09867 암호화 CoT 에코(thinkingSignature 포함) |
| api | MCP07 인증 없는 /v1/models, MCP09 LAN 바인드 |
| watch | .masq/pins.json + 스킬에 대한 핀 diff. Overnight가 설정합니다. 프록시가 아닙니다. |
| fleet | 하나의 FLEET 섹션에 lab 허용 목록 롤업 |
| map | 포스처 보고서에 대한 텍스트 경로 쿼리 |
| 한도 | 값 |
|---|
| tools/list 파일 | 8 MiB |
| sniff 파일 | 8 MiB(더 크면 처음 2 MiB만 샘플링) |
| 루트당 sniff 파일 수 | 300(우선순위 내 최신 mtime 기준) |
| 파일당 타임라인 이벤트 수 | 200, 초과 시 timeline truncated |
| 타임라인 T-라인 | 500(inspect와 collapse는 계속 실행) |
| 스키마 탐색 깊이 | 64 |
| 인벤토리당 도구 수 | 5_000 |
| HTTP 프로브 | GET 전용, API 2초 / sit 5초 |
| sit 핸드셰이크 | 타임아웃 + 종료 |
| 이 도구 | 이 도구가 아닌 것 |
|---|
| 에이전트 클라이언트로 sit(initialize + list) | 라이브 서버에 tools/call 자체 발신 |
| 로그에서 암호화된 CoT 에코 탐지 | CoT 복호화 또는 약한 모델로의 재생 |
GET /v1/models | POST completions(옵트인 TUI 트리아지 / classify --llm 제외) |
| 카탈로그에 대한 핀 해시 러그풀 감지 | 서명된 PKI / 엔터프라이즈 핀 볼트 |
proxy --block에서 에이전트의 tools/call 전달 | 전체 런타임 DLP 게이트웨이 / SaaS 컨트롤 플레인 |
| 로컬 스킬 트리 린트 | Snyk / 클라우드 SCA |
| 검사 | 기대 결과 |
|---|
masq fixtures/clean_calculator.json --trusted | exit 0 |
masq fixtures/t3_line_jump.json | exit 2 |
masq fixtures/t13_duplicate_names.json | exit 2(도구 섀도잉) |
masq sniff --timeline fixtures/(비-TTY / --json) | 플래그 사용 시 T0001만 |
masq chameleon fixtures/clean_calculator.json -o <tmpdir> | catalog.json, aimock.json, calls.json |
라이브 masq --no-color | 토큰 마스킹(…, 전체 sk- 아님) |