
Плагин Volatility 3, который извлекает кандидатов на сообщения MCP/JSON-RPC из дампов памяти Windows и Linux, сохраняя необработанные байты, адреса и SHA-256 для проверки.
MCPTrace — это плагин Volatility 3 для извлечения кандидатов сообщений MCP/JSON-RPC из дампов памяти Windows и Linux. Он исследует память процессов на предмет запросов, ответов, уведомлений, имён инструментов и аргументов вызовов, а затем записывает восстановленное содержимое вместе с его расположением в памяти.
Проект сосредоточен на доказательствах, которые аналитик может проверить и верифицировать. Каждый артефакт сохраняет исходные байты, идентификатор процесса, виртуальный адрес, кодировку, длину и хеш SHA-256. Результаты можно экспортировать в формате JSONL для дальнейшего анализа или сравнения с другими журналами. MCPTrace работает с полученным образом памяти и не требует LLM или внешнего AI API.
tools/call.Текущие цели анализа — Windows x64 и Linux x86-64. Название плагина относится к операционной системе в образе памяти, независимо от ОС, используемой для запуска Volatility.
MCPTrace использует перечисление процессов и трансляцию адресов Volatility. В Windows он обходит Virtual Address Descriptors (VAD) процессов; в Linux — Virtual Memory Areas (VMA). Эти отображения определяют, какие диапазоны адресов процессов исследуются. Оба адаптера используют общий код вырезания сообщений, корреляции, политик и экспорта.
В пределах читаемых диапазонов сканер ищет литеральные маркеры версии JSON-RPC и находит вокруг них кандидаты в объекты JSON. Он обрабатывает вложенные объекты, экранированные символы, фигурные скобки внутри строк и сообщения, охватывающие смежные блоки чтения. JSON с дублирующимися ключами или неподдерживаемыми идентификаторами отклоняется, а не молча переинтерпретируется. Релевантность MCP определяется по известным именам методов, формам ответов и связанным ID запросов; это не полная валидация схемы MCP.
Отсутствующая память остаётся отсутствующей. Читатель не заполняет пробелы нулями и не объединяет
байты из разных VAD/VMA. С --include-partial неразобранные фрагменты могут быть
показаны отдельно, без изобретения отсутствующих ID или аргументов. Большие немаппированные диапазоны
можно пропускать с использованием информации таблиц страниц, а нечитаемые диапазоны адресов остаются
видимыми в статистике сканирования.
Корреляция намеренно консервативна. Числовой ID, такой как 1, отличается от
строкового ID "1", и сообщения в разных процессах не связываются автоматически.
Несколько различных представлений, связанных с одним ID, помечаются как неоднозначные.
Кандидатные связи сами по себе не восстанавливают сессию, направление сообщений или
временную шкалу выполнения.
Требуется Python 3.10+. Установка включает закреплённую зависимость фреймворка,
volatility3==2.28.2. Держите каталог plugins/ репозитория доступным: Python-пакет
устанавливается через pip, а -p plugins загружает адаптеры Volatility.
git clone https://github.com/Kowntaewook/MCPTrace.git
cd MCPTrace
python -m venv .venv
Активируйте окружение для вашей оболочки:
.\.venv\Scripts\Activate.ps1source .venv/bin/activateЗатем установите MCPTrace:
python -m pip install .
Запускайте следующие примеры из корня репозитория с активированным виртуальным окружением. Замените пути к образам и PID на ваши доказательства и целевые процессы. Клиенты и серверы MCP могут работать в отдельных процессах, поэтому при необходимости проверяйте оба.
Windows
Убедитесь, что Volatility может интерпретировать образ и перечислять его процессы, прежде чем запускать MCPTrace. Подготовка символов Windows может потребовать доступа к сети.
vol -f windows.raw windows.info.Info
vol -f windows.raw windows.pslist.PsList
mkdir output-windows
vol -p plugins -f windows.raw -o output-windows windows.mcptrace.MCPTrace --pid 4242 5252 --dump
Linux
Поместите символы ISF, соответствующие точной сборке ядра дампа, в symbols/linux/.
Если linux.pslist.PsList не может разрешить требования к ядру или слою, устраните
настройку образа/символов, прежде чем интерпретировать вывод MCPTrace.
vol -s symbols -f linux.lime linux.pslist.PsList
mkdir output-linux
vol -p plugins -s symbols -f linux.lime -o output-linux linux.mcptrace.MCPTrace --pid 4242 --dump
--pid, чтобы просканировать все процессы, или передайте несколько PID: --pid 4242 5252.--dump экспортирует JSONL-файлы по каждому процессу в каталог, указанный в -o.vol -p plugins windows.mcptrace.MCPTrace -h (или эквивалент для Linux), чтобы увидеть все параметры.Для JSON-представления полной таблицы результатов поместите глобальный параметр -r json перед
именем плагина. Это отдельно от экспорта JSONL по каждому процессу, создаваемого с помощью --dump.
vol -p plugins -f windows.raw -r json windows.mcptrace.MCPTrace --pid 4242 > findings.json
| Параметр | Назначение |
|---|---|
--pid 4242 5252 | Выбрать идентификаторы процессов; если не указано, проверяются все процессы, перечисленные адаптером. |
--dump | Экспортировать отображаемые артефакты и сводки сканирования в формате JSONL в глобальный каталог -o. |
--include-partial | Включить необработанные, неразобранные фрагменты без восстановления отсутствующих полей. |
--include-rpc | Также отображать общие кандидаты JSON-RPC без подтверждённой связи с MCP. |
--policy PATH | Применить локальные правила к аргументам инструментов; см. примеры для Windows и Linux. |
--suspicious-only | Показывать совпадения с политикой и сводки; требует непустой политики. |
--max-records N | Ограничить число записей-кандидатов на процесс перед фильтрацией; по умолчанию: 10000. |
--max-object-bytes N | Ограничить размер одного полного объекта JSON; по умолчанию: 65536 байт. |
--max-bytes N | Ограничить число байт диапазона адресов, проверяемых на процесс; 0 означает отсутствие ограничения. |
Результаты проверки политики описывают совпадения с правилами, заданными аналитиком. Совпадение не означает вредоносную активность. Перед применением к другому случаю проверьте примеры путей, хостов и имён инструментов.
Файл, например mcptrace.pid-4242.jsonl, содержит запись метаданных, записи артефактов
и итоговую сводку сканирования. Метаданные определяют процесс, целевую ОС и адресное
пространство. Записи артефактов сохраняют как разобранное сообщение, так и точные восстановленные байты.
| Поля | Значение |
|---|---|
pid, virtual_address, region_start | Процесс и местоположение доказательства. Адреса — это виртуальные адреса процесса, а не смещения в файле образа. |
message, method, tool, request_id | Содержимое разобранного сообщения и выбранные поля, если доступны. |
raw_base64, byte_length, raw_sha256 | Исходные байты, их длина и SHA-256 для проверки. |
state, encoding | Является ли запись полной или фрагментом, и как закодированы её байты. |
relation, candidate_virtual_addresses | Местоположения кандидатов-аналогов и является ли связь неоднозначной. |
findings | Результаты необязательных проверок политики аргументов. |