
Разведка в реальном времени и аудит состояния защищённости инфраструктуры AI-агентов: сканирует конфигурации MCP, журналы сессий и API на предмет секретов, отравленных каталогов и утечек CoT.
Маскарад эпохи Возрождения. Сядьте в кресло агента.
Сядьте в кресло агента.
CLI, который говорит на MCP и OpenAI-совместимом языке так, как это делает модель, а затем формирует отчёт в стиле linpeas. Находки плюс рекомендации по исправлению. Никаких эксплойт-пейлоадов. Без расшифровки CoT.
| Что | Живая разведка инфраструктуры агентов: конфиги MCP, слушатели, журналы сессий, эхо зашифрованной цепочки рассуждений, API без аутентификации, отравление каталогов, деревья навыков. |
| Для кого | Операторы Hermes, Grok, Claude, Cursor, VS Code, Codex и локальных стеков моделей, которым нужно видеть то же, что видит агент. |
| Чем не является | Не генератор джейлбрейков. Не декодер слабых моделей из arXiv:2608.09867. Не runtime-шлюз. |
| Статус | Бета. Публичный контрольный рубеж — офлайн cargo test. Живой --lab — только для хостов, которыми вы владеете. |
| Лицензия | MIT |
Статические сканеры MCP (Invariant mcp-scan, mcp-security-scan) линтуют схемы и конфиги. Инструменты проверки здоровья пингуют initialize. Дыра — это кресло:
initialize, вы и есть агент.:11434, :8000) часто слушают на 0.0.0.0 без bearer-токена.Колёса, на которых мы едем, а не переписываем: существующие детекторы каталогов + pin/check, netstat, ureq только GET, таксономия находок 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:// из коробки нет. Через Stunnel к ws:// или используйте 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.
Плюс .mcp.json в текущем каталоге и MASQ_EXTRA_CONFIG (список путей ОС).
--lab)--lab — это allowlist, а не скан /24. Он настраивается оператором. Кроме loopback ничего не зашито в бинарник.
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. MASQ_SIT_URLS (или --mcp-url) задаёт MCP-URL для sit с --lab.
sit --url вне loopback требует --lab и хост из allowlist. initialize без аутентификации на loopback — High. Вне машины — Critical.
Не направляйте proxy на хост, на котором вы бы не стали выполнять sit.
Приоритет sniff: сначала chat_history.jsonl, затем Hermes request_dump_*, потом остальные jsonl. Обход завершается. Сохраняются не первые 300 результатов WalkDir. Чтобы копнуть глубже, укажите masq sniff <one-session-dir>.
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, а также + severity title и - severity title.
classify --llm и надстройка триажа в TUI — единственные POST-запросы completions (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 line-jump, T6 имена параметров, T8 ANSI, T13 дублирующиеся имена, rugpull при пиннинге, multi-list, живой NDJSON-мок в tests/mock_mcp_server.py.
Секреты не попадают в git (reports/, data/, .env, *.key, secrets/, .masq/).
MIT. Авторские права 2026 SamsonCyber.
| Команда | Что делает |
|---|
seat (по умолчанию) | Полная оценка состояния: recon + sniff + api + skills + опциональный sit. |
recon | Конфигурационные файлы, слушатели, теневые URL, sudo argv, npx/uvx без пиннинга. |
sniff | Журналы сессий на предмет секретов, открытых рассуждений, эха зашифрованного CoT. |
sniff --timeline | Строки T0001 в порядке файлов. Без расшифровки. Не более 200 событий на файл. |
api | Только GET /v1/models (и аналоги) на loopback; --lab добавляет хосты из allowlist. |
sit | Говорит на MCP: initialize, notifications/initialized, tools/list, prompts/list, resources/list. Никогда не инициирует tools/call. |
chameleon / mimic | Опросить живой или файловый каталог, записать catalog.json + aimock.json + calls.json. Примеры конвертов tools/call — только для aimock. |
discover | Вывести известные пути конфигов MCP агентов. Без запуска. |
proxy | Проксирует JSON-RPC агента. --block отклоняет параметры/результаты tools/call, похожие на секреты. По умолчанию слушает на 127.0.0.1:9877. |
sast | Локальные источники (sinks) в исходниках. Использует semgrep, если установлен. |
classify | Локальная проверка IPI/отравления живого tools/list. --llm спрашивает Grok (ключ оператора). |
overnight | Повторяет seat, пока не истечёт --hours. Пишет отчёты. Не изменяет конфиги. |
map | Текстовые запросы по путям атак над сохранённым JSON оценки. Без диаграмм. |
scan / multi | Статический линт каталога (голые пути .json переписываются сюда). |
pin / check | Хранилище пиннинга по хешу содержимого (.masq/pins.json) для CI против rug-pull. |
detectors | Вывести набор правил каталога. |
tui | Оконный seat. Работает до Ctrl+C. |
| Модуль | Покрытие |
|---|
| recon | MCP01 пути секретов, MCP04 npx/uvx без пиннинга, MCP07/09 слушатели и теневые URL, MCP05 sudo argv |
| catalog | MCP03 отравление схемы / затенение / rugpull |
| 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-rebinding |
| sniff | MCP01 + MCP10 + эхо зашифрованного CoT по arXiv:2608.09867 (включая thinkingSignature) |
| api | MCP07 /v1/models без аутентификации, MCP09 связка в LAN |
| watch | pin-diff по .masq/pins.json + навыкам. Включается в overnight. Не прокси. |
| fleet | Сводка по allowlist лаборатории в одной секции FLEET |
| map | Текстовые запросы по путям над отчётом о состоянии |
| Ограничение | Значение |
|---|
| файл tools/list | 8 МиБ |
| файл sniff | 8 МиБ (при большем размере берётся выборка первых 2 МиБ) |
| файлов sniff / корень | 300 (самые свежие по mtime в пределах приоритета) |
| событий timeline / файл | 200, затем timeline truncated |
| строк T в timeline | 500 (inspect и collapse всё равно выполняются) |
| глубина обхода схемы | 64 |
| инструментов на инвентаризацию | 5_000 |
| HTTP-проба | только GET, 2 с API / 5 с sit |
| рукопожатие sit | таймаут + kill |
| Этот инструмент | Не этот инструмент |
|---|
| Выступать в роли клиента агента (initialize + list) | Инициировать tools/call против живого сервера |
| Обнаруживать эхо зашифрованного CoT в журналах | Расшифровывать CoT или воспроизводить его в более слабой модели |
GET /v1/models | POST completions (кроме опционального триажа в TUI / classify --llm) |
| Проверка rugpull по пин-хешу каталога | Подписанная PKI / корпоративное хранилище пинов |
Проксировать tools/call агента в proxy --block | Полноценный DLP-шлюз времени выполнения / SaaS control plane |
| Локальный линт дерева навыков | Snyk / облачный SCA |
| Проверка | Ожидание |
|---|
masq fixtures/clean_calculator.json --trusted | код возврата 0 |
masq fixtures/t3_line_jump.json | код возврата 2 |
masq fixtures/t13_duplicate_names.json | код возврата 2 (затенение инструментов) |
masq sniff --timeline fixtures/ (non-TTY / --json) | T0001 только с этим флагом |
masq chameleon fixtures/clean_calculator.json -o <tmpdir> | catalog.json, aimock.json, calls.json |
Живой masq --no-color | токены скрыты (…, не полностью sk-) |