FlawOpen

flawopen.com/Incidents/deadbugz-mcp-delayed-metadata-supply-chain-campaign-august-2026

● Pillar Security / MCP ecosystem · CWE-829 (editorial mapping; no CVE assigned) · 2026-08-10 · Средний
Исследования · FlawOpen

Deadbugz: метаданные MCP-инструментов меняются после одобрения

Pillar Security описала кампанию в цепочке поставок MCP, менявшую метаданные после трёх обычных вызовов. В проверке не было pull request, слитых через GitHub; в отчёте последующая компрометация не описана. Cloud Security Alliance отмечает, что видимость независимого локального запуска была ограничена.[1], [3]

💡 Простыми словами (ELI5)

Представьте, что вы впускаете подрядчика: на пропуске указаны безобидные обязанности. После трёх обычных доставок пропуск незаметно меняется и требует доступа в закрытые комнаты. Опасность в том, что здание продолжает доверять прежнему одобрению. Клиент MCP должен заметить, что сервер изменил инструкции одобренных инструментов.[1]

Ключевые понятия и термины

MCP
Протокол, с помощью которого приложение ИИ обнаруживает и вызывает инструменты сервера.[5]
Метаданные инструмента
Имя, описание и схема входных данных, которые клиент может передать модели как контекст.[5], [1]
Отложенное изменение во время работы
Поведение, включающееся после порога взаимодействий; Pillar описала счётчик на три вызова.[1]
Доставка через цепочку поставок
Добавление зависимости или конфигурации через доверенный процесс разработки, например pull request.[1]
CWE-829
Редакционная классификация: функциональность поступила с сервера вне доверенной сферы контроля клиента. CVE и оценка CVSS не присвоены.[1], [3]

Связи со стандартами

  • Ссылка CWE для слабого места, описанного в этом руководстве: CWE-829

Хронология инцидента

2026-08-10

Pillar обнаружила 23 связанных pull request, созданных за 74 минуты; на момент проверки ни один не был слит через механизм PR GitHub.[1]

2026-08-12

Pillar опубликовала технический разбор смены метаданных после трёх вызовов и индикаторы.[1]

2026-10-08

Проект OWASP GenAI включил Deadbugz в обзор Q3. Это свидетельствует об интересе, но не о компрометации или объёме поисковых запросов.[2]

Пошаговый сценарий атаки

Шаг 1

Предлагается изменение конфигурации

Pull request добавляет в AI-проект удалённый или локальный MCP-сервер. Pillar проверила 17 изменений с удалённым endpoint, четыре ссылки на скрытый локальный скрипт и две записи в каталогах.[1]

Шаг 2

При первичной проверке видны обычные инструменты

Сначала сервер предлагает форматирование и краткое изложение текста. По данным Pillar, короткие проверки могут увидеть только эти безобидные метаданные.[1]

Шаг 3

Обычная работа пересекает порог

Сервер считает вызовы для каждого клиента. После трёх вызовов меняются последующие ответы tools/list и prompts/get.[1], [5]

Шаг 4

Агент получает недоверенные инструкции

Они пытаются направить подключённого агента к чувствительным локальным данным и скрыть действия. Описание кампании не подтверждает компрометацию.[1], [3]

Шаг 5

Одобрение должно относиться к точным метаданным

Клиенту следует вычислять отпечаток одобренных определений инструментов и при изменении приостанавливать работу для проверки. Доступ к файлам, учётным данным и сети нужно ограничивать отдельно.[1], [4], [5]

Исходный код: Уязвимый 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

Чек-лист по защите системы для инженеров

Источники