flawopen.com/Incidents/deadbugz-mcp-delayed-metadata-supply-chain-campaign-august-2026
Deadbugz: метаданные MCP-инструментов меняются после одобрения
Pillar Security описала кампанию в цепочке поставок MCP, менявшую метаданные после трёх обычных вызовов. В проверке не было pull request, слитых через GitHub; в отчёте последующая компрометация не описана. Cloud Security Alliance отмечает, что видимость независимого локального запуска была ограничена.[1], [3]
Представьте, что вы впускаете подрядчика: на пропуске указаны безобидные обязанности. После трёх обычных доставок пропуск незаметно меняется и требует доступа в закрытые комнаты. Опасность в том, что здание продолжает доверять прежнему одобрению. Клиент MCP должен заметить, что сервер изменил инструкции одобренных инструментов.[1]
Ключевые понятия и термины
MCP- Протокол, с помощью которого приложение ИИ обнаруживает и вызывает инструменты сервера.[5]
Метаданные инструмента- Имя, описание и схема входных данных, которые клиент может передать модели как контекст.[5], [1]
Отложенное изменение во время работы- Поведение, включающееся после порога взаимодействий; Pillar описала счётчик на три вызова.[1]
Доставка через цепочку поставок- Добавление зависимости или конфигурации через доверенный процесс разработки, например pull request.[1]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-829
Хронология инцидента
Pillar обнаружила 23 связанных pull request, созданных за 74 минуты; на момент проверки ни один не был слит через механизм PR GitHub.[1]
Pillar опубликовала технический разбор смены метаданных после трёх вызовов и индикаторы.[1]
Проект OWASP GenAI включил Deadbugz в обзор Q3. Это свидетельствует об интересе, но не о компрометации или объёме поисковых запросов.[2]
Пошаговый сценарий атаки
Предлагается изменение конфигурации
Pull request добавляет в AI-проект удалённый или локальный MCP-сервер. Pillar проверила 17 изменений с удалённым endpoint, четыре ссылки на скрытый локальный скрипт и две записи в каталогах.[1]
При первичной проверке видны обычные инструменты
Сначала сервер предлагает форматирование и краткое изложение текста. По данным Pillar, короткие проверки могут увидеть только эти безобидные метаданные.[1]
Исходный код: Уязвимый vs Защищённый вариант
В отчёте описаны отравление метаданных и доставка через pull request, а не CVE в спецификации MCP. Риск возникает, если клиент продолжает доверять изменяемым описаниям сервера после первоначального одобрения. Pillar связала кампанию с публичной учётной записью GitHub; здесь это атрибутированное Pillar наблюдение, а не подтверждённая личность. Pillar сообщила, что проверенные PR на тот момент не были слиты через GitHub; последующая компрометация не установлена. Ссылка на исходный репозиторий сейчас возвращает 404, поэтому технические утверждения основаны на опубликованном анализе Pillar, а не на повторной независимой проверке кода. Пример Python иллюстрирует защитную политику клиента и не является готовой заменой библиотеке MCP. CWE-829 — редакционная классификация; CVE и CVSS нет. Адаптер должен обновлять данные после уведомлений об изменении MCP и включать tools/list и prompts/get; metadata_snapshot — иллюстративный метод адаптера, а не API MCP SDK. Создавайте approved_digest только после проверки оператором. Снимок должен включать все важные метаданные сервера: определения tools/list и полное содержимое prompts/get для одобренных prompt. Запрашивайте его повторно перед действием и останавливайте действие при несовпадении. Такая проверка не обнаружит изменение поведения сервера или изменение между проверкой и использованием, поэтому необходимы отдельные ограничения действий.[1], [4], [5]
def agent_metadata(session):
# Адаптер возвращает текущие инструменты и prompts сервера в виде данных JSON.
return session.metadata_snapshot()
import hashlib
import hmac
import json
def fingerprint(snapshot):
normalized = dict(snapshot)
for key in ("tools", "prompts"):
normalized[key] = sorted(
snapshot[key],
key=lambda item: json.dumps(item, sort_keys=True, separators=(",", ":")),
)
canonical = json.dumps(normalized, sort_keys=True, separators=(",", ":"))
return hashlib.sha256(canonical.encode()).hexdigest()
def agent_metadata(session, approved_digest):
current = session.metadata_snapshot()
if not hmac.compare_digest(fingerprint(current), approved_digest):
raise PermissionError("MCP metadata changed; require operator approval")
return current
Чек-лист по защите системы для инженеров
- ✓Храните канонический отпечаток имён, описаний и схем входных данных одобренных MCP-инструментов.[1], [4]
- ✓Приостанавливайте инструменты и требуйте проверки оператором, если после одобрения изменились
tools/listилиprompts/get.[1], [5], [4] - ✓Отдельно ограничивайте файлы, учётные данные, процессы и исходящую сеть; не полагайтесь на инструкции модели.[1], [4]
- ✓Проверяйте изменения репозитория с новыми MCP endpoint или локальными скриптами; устанавливайте их происхождение.[1]
- ✓Сохраняйте журналы клиента и сопоставляйте изменения определений с действиями агента при необычном поведении сервера.[1], [3]
Источники
- Pillar Security — Deadbugz: Currently Active MCP Supply-Chain Campaign (12 August 2026)
- OWASP GenAI Security Project — GenAI and Agentic AI Exploit Roundup Q3 2026 (8 October 2026)
- Cloud Security Alliance — Deadbugz: Runtime-Gated MCP Metadata Poisoning as Supply-Chain Attack
- OWASP MCP Security Cheat Sheet
- MCP specification: Tools