
Разведка в реальном времени и аудит состояния защищённости инфраструктуры AI-агентов: сканирует конфигурации MCP, журналы сессий и API на предмет секретов, отравленных каталогов и утечек CoT.
Займи место модели. Увидь то, что видит она.
MASQ — это локальный CLI для проверки безопасности стеков ИИ-агентов. Он занимает то же место, что и модель: читает каталоги инструментов MCP, завершает рукопожатие MCP, просматривает журналы сессий и проверяет локальные HTTP-порты моделей. Затем он выводит обнаруженные проблемы и рекомендации по их устранению.
Он общается по MCP и через HTTP, совместимый с OpenAI, так же, как это делает клиент. Он отчитывается так, как это делает инструмент разведки хоста. Он не вызывает инструменты на работающем сервере, не расшифровывает цепочки рассуждений и не генерирует джейлбрейки.
| Когда использовать | Вы запускаете Cursor, VS Code, Claude, Codex или локальный стек моделей и хотите увидеть серверы MCP, навыки, журналы и API, к которым имеет доступ агент. |
| С чего начать | С двухминутной демонстрации ниже. Она не выходит за пределы этого репозитория. |
| Статус | Бета. cargo test — публичный критерий. Живые проверки предназначены для хостов, которыми вы владеете. |
| Лицензия | MIT |
Вам понадобится стабильная версия Rust (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, в описании которого модели предписывается обращаться к нему в первую очередь в каждой сессии и добавлять к shell-командам префикс в виде канареечного 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 так, как это делает модель
Встроенный мок общается по MCP через stdio. 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-ключ и зашифрованный блок размышлений. Укажите 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 проверяют схемы. Проверки работоспособности пингуют initialize. Пробел — это место: файлы, слушатели и рукопожатия, которые модель уже использует.
initialize без аутентификации. Если вы можете завершить это рукопожатие, вы уже являетесь агентом. masq просто присутствует; он не вызывает инструменты.11434, 8000 и подобные часто привязываются к 0.0.0.0 без bearer-токена. masq определяет сервис (Ollama, vLLM, LiteLLM, …) с помощью GET-запросов, затем перечисляет модели.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 (1.88+; установка через rustup). cargo test — это публичный критерий проверки. Python 3 требуется только для живого stdio-мока в демонстрации и в тестах.
Для сборки на удалённом Unix-хосте по SSH (только установка; сканирование этого хоста не выполняется):
MASQ_REMOTE_HOST=user@host bash scripts/deploy_remote.sh
# on that host: masq --version
Демонстрация никогда не покидает этот репозиторий. Эти команды — покидают, и они ограничены этой машиной, если вы не подключите allowlist лаборатории.
Экспортируйте или сохраните JSON tools/list, затем:
masq path/to/tools.json
masq path/to/tools.json --json
masq path/to/tools.json --markdown
Пути .json без префикса переписываются в scan. Два или более JSON-файла становятся multi.
masq sit -- python3 -m your_mcp
masq sit --url http://127.0.0.1:PORT/mcp
Loopback достаточно. Для URL вне loopback также нужны --lab и хост из белого списка (см. ниже). Аутентификация, если она требуется серверу: