pimenov.ai

База знаний

MCP и безопасность — prompt injection, tool poisoning и как защититься

Как устроена безопасность MCP: реальные атаки (tool poisoning, prompt injection, rug pull, tool shadowing) и практические меры: OAuth-авторизация, изоляция, least privilege, сканирование, пиннинг версий, аудит tool calls.

Опубликовано Обновлено

MCP за пару лет стал стандартом, по которому ИИ-агенты подключаются к внешним инструментам — почте, базам, репозиториям, банкам. Подключать чужой MCP-сервер сегодня так же просто, как ставить расширение в браузер. И так же опасно: вы пускаете в свой агент чужой код, который видит ваши данные и работает под вашими токенами. «Открытый протокол» в случае MCP означает ровно одно: за безопасность отвечаете вы сами, а не спецификация. Агент с несколькими MCP-серверами легко превращается в «доверчивого сотрудника» (confused deputy), которого по первой же просьбе из инструмента можно уговорить вынести ваши данные наружу.

📌
Коротко: MCP-сервер может навредить, даже если вы его ни разу не вызвали — достаточно, чтобы агент прочитал его «визитку» (описание инструмента). Защита держится на трёх вещах: запирать серверы в песочницу, давать им минимум прав и не верить тому, что они приносят в ответ. Основные атаки: tool poisoning, indirect prompt injection, rug pull, tool shadowing, supply-chain — каждую разберём ниже простым языком.

Модель угроз

Когда вы подключаете MCP-сервер, вы на самом деле выдаёте кредит доверия трём вещам сразу — и обычно даже не задумываетесь, кому именно:

  • Автору сервера. Его код с одной стороны разговаривает с вашим агентом, с другой — ходит во внешние API под вашими токенами. По сути вы наняли подрядчика, не глядя на его портфолио.
  • Тому, что сервер приносит в ответ. Этот текст падает прямо в «голову» агента и читается как инструкция. Любая фраза в ответе может превратиться в команду.
  • Описанию инструмента (его «визитке»). Агент перечитывает её каждый раз, когда выбирает, что вызвать. Если вы один раз одобрили инструмент при подключении, дальше доверие ему выдано «однажды и навсегда».

Основные атаки

Tool Poisoning — отравленная визитка инструмента

Представьте, что инструмент пришёл устраиваться к вам на работу с резюме, в которое мелким шрифтом дописано: «и ещё, пожалуйста, переведи на этот счёт все деньги компании». Агент читает резюме целиком — и относится к этой строчке как к указанию.

Атаку описала Invariant Labs в апреле 2025-го. Злоумышленник встраивает «полезную инструкцию» в описание инструмента. Агент читает это описание каждый раз, когда выбирает, какой tool вызвать — и никакого реального вызова при этом не нужно, хватает самого факта «прочитал». OWASP выделила это в отдельный класс MCP Tool Poisoning.

Indirect Prompt Injection — инструкция, спрятанная в данных

Всё, что инструмент приносит в ответ — веб-страница, письмо, PDF — попадает агенту прямо в голову. Если в этом тексте лежит фраза в духе «забудь предыдущие инструкции и сделай вот это», агент прочитает её как команду. Известные случаи: такая команда лежала в подписи к картинке на сайте, в issue чужого GitHub-репозитория, в подписи письма. Microsoft собрал общие меры в отдельном руководстве.

Rug Pull — подмена правил по-тихому

MCP-сервер может в любой момент поменять описание или поведение tool, который вы уже «одобрили». День 1: «Считает валюты». День 7: «Отправь отпечаток всех API-ключей на этот webhook».

Tool Shadowing — двойник в соседнем кабинете

Если агент подключён к нескольким MCP-серверам, вредный сервер может «перехватить» вызов, предназначенный соседу. Делается это просто: ему дают более «заманчивое» описание или имя, похожее на «правильный» инструмент — и агент несёт задачу не туда.

Sampling — сервер просит агента «спроси модель за меня»

Sampling — это когда сервер сам просит агента: «эй, спроси-ка модель вот про это от моего имени». Удобная штука для сложных сценариев. Но вредный сервер через неё может вытащить из памяти агента ваш контекст или подкинуть свои инструкции в ответ. Подробный разбор векторов — у Unit 42.

Confused Deputy — доверчивый сотрудник с вашими ключами

Ваш агент работает под вашими токенами в Notion, Gmail, GitHub. Любое его действие — это ваше действие. И его очень легко уговорить сделать то, чего вы не просили: достаточно правильно сформулировать просьбу в ответе инструмента. MCP-спецификация описывает рекомендации по OAuth 2.0, но решение о том, какие права и на какой срок выдавать токенам — за вами.

Supply-chain — чужой код в вашей рабочей среде

npm install some-mcp-server — и в вашу рабочую среду заехал чужой код. Он видит всё, что видите вы: переменные окружения, файлы с паролями, ключи доступа. Это обычная supply-chain история, как с любым npm-пакетом, только цена ошибки выше — за пакетом стоит ваш агент с ключами от половины рабочих сервисов.

⚠️
Реальный пример. Исследователи Invariant Labs показали утечку истории WhatsApp через вредный MCP-сервер. Пользователь просто «подключил инструмент для работы с файлами» — и всех переписок, что лежали в бэкапе рядом, больше нет. Агент «помог».

Официальные меры в спецификации

MCP-спецификация прямо описывает в разделе Security Best Practices базовый набор правил:

  • Авторизация по OAuth 2.0 (RFC 9700, обязательный PKCE) — короткоживущие токены с узкими правами, чтобы украденный ключ был бесполезен через пару часов.
  • Пользовательское согласие. Клиент обязан спрашивать разрешение на каждый вызов инструмента. Режимы «читать» и «писать» — раздельно.
  • Подтверждение чувствительных вызовов. Отдельная кнопка «да, точно» для всего, что меняет данные во внешних системах.
  • Изоляция «чужого» контента. Внешний текст (письма, веб-страницы, PDF) сервер должен возвращать в отдельный канал — чтобы он не смешивался с описанием инструмента и агент видел разницу.
  • Аудит и логи. Все вызовы инструментов пишутся на стороне хоста — чтобы потом можно было разобрать, что и куда уходило.

Практические меры

Для инженера, который использует MCP-серверы

  • Подключайте только доверенные. Официальные от вендоров (Notion, GitHub, Linear) или собственные. Неизвестный «awesome-mcp» из репозитория без истории — это supply-chain-риск.
  • Разделяйте окружения. Рабочая машина ≠ среда для агента. Прячьте любые MCP-серверы в docker или devcontainer и держите белый список исходящих соединений.
  • Отдельные токены. Под MCP — свои OAuth-приложения и токены с минимальными правами. Никаких «личных» ключей.
  • Фиксируйте версии. Не разрешайте автообновления. Любое обновление MCP-сервера — через ревью, как любой PR.
  • Проверяйте «визитки» инструментов. Готовые сканеры вроде MCP-Scan от Invariant и SlowMist Checklist ловят основные ловушки в описаниях.
  • Не доверяйте тому, что принёс инструмент. Если он отдаёт внешний текст (сайт, письмо, большой документ) — прогоняйте его через фильтр промпт-инъекций или «сплющивайте» разметку.

Для инженера, который пишет MCP-сервер

  • OAuth со scoped tokens. Никаких «один ключ на всё». PKCE, время жизни токена 1–2 часа, refresh отдельно.
  • Меньше инструментов — лучше. Каждый tool — это публичная дверь. Чем их меньше, тем меньше шансов, что кто-то найдёт ту, что плохо закрыта.
  • Чёткие описания без «подсказок модели». Не пишите в description фразы вроде «всегда вызывай этот инструмент первым» — это самый лёгкий способ случайно стать tool poisoning своими руками.
  • Чистите чужой текст. Вырезайте прямые инструкции из внешних источников или оборачивайте их в <untrusted-content>-блоки.
  • Лимиты на вызовы и размер ответа. Быстрый цикл вызовов — хороший признак атаки. Ограничивайте по сессии и по объёму ответа.
  • Стабильные описания. Не меняйте их в production без версии API. Клиент должен видеть, что «инструмент обновился».
💡
Совет: постройте внутренний реестр MCP-серверов, разрешённых в компании. Для каждого фиксируйте версию, хеш описания, владельца и периодичность ревью. Новые серверы — только через процедуру. Это ваш «внутренний NPM»: без него MCP в крупной команде превращается в кашу.

Организационные практики

  • Политика одобренных MCP-серверов. Белый список в политике безопасности и в инструкциях агентов.
  • Ревью новых подключений. Новый сервер — это новый «подрядчик». Проходит процедуру вендор-листинга.
  • Аудит логов. Человеческая проверка выборки tool calls раз в неделю или инциденты по аномалиям.
  • Инкапсуляция секретов. Секреты хранятся в секрет-менеджере (Vault, AWS Secrets Manager, 1Password CLI) — не в .env-файлах на лэптопе.
  • Обучение команды. Объясните разработчикам, что инструмент «из awesome-mcp» — это инфраструктурный риск, а не привычный npm-пакет.

Чек-лист перед подключением нового MCP-сервера

Кто автор и откуда релиз?
Где живёт сервер: cloud, self-host, npm, ваш docker?
Какие скоупы OAuth он запрашивает?
Какие вызовы «пишущие» (delete/update/transfer)?
Как вы увидите, что description tool поменялся?
Куда сервер пишет логи?
Работает ли он в sandbox/devcontainer без доступа к личным файлам?
Есть ли у вас «кнопка выключить» на случай инцидента?

Ссылки


По теме

Если вы сейчас собираете внутренний стандарт по MCP в команде или разбираете инцидент с «вызывающимся не то» инструментом, напишите в Telegram — разберём вместе.