Подключая MCP-сервер к агенту, вы даёте постороннему коду сразу два входа: он запускается на вашей машине и разговаривает с моделью, которая умеет выполнять команды. Поэтому атаки через MCP-серверы — это уже не раздел модели угроз «на будущее», а список зарегистрированных уязвимостей с номерами CVE: от подменённого mcp.json в Cursor летом 2025 года до атаки без единого клика, опубликованной в реестре уязвимостей в июне 2026-го. В англоязычных источниках эту тему обычно ищут как MCP security attacks.
- Коротко (TL;DR)
- Что такое MCP и почему это новая поверхность атаки на ИИ-агентов
- Четыре класса атак через MCP: от prompt injection до rug pull
- Кража токенов через MCP: почему mcp.json так нужен атакующим
- Как вредоносный mcp.json взломал Cursor: разбор MCPoison
- DuneSlide: как Cursor ломали без единого клика в 2026 году
- Доверенные MCP-серверы тоже сливают данные: кейс GitHub MCP
- Вредоносные MCP-серверы в дикой природе: таймлайн реальных инцидентов
- Масштаб проблемы: сколько MCP-серверов уязвимо на самом деле
- Как проверить MCP-сервер перед подключением
- Настройка защиты MCP в Cursor, Claude Code и Codex
- Остаточные риски: что allowlist и одобрения MCP не закрывают
- OWASP MCP Top 10 и рекомендации NSA для защиты
- Чек-лист защиты от атак через MCP за один вечер
- Что в защите от MCP-атак устареет первым
- FAQ
Главное, что стоит вынести до деталей: протокол сам по себе безопасность не обеспечивает. В официальных рекомендациях по безопасности MCP требования обращены к клиентам и серверам, а не к «протоколу»: защита живёт в программе, которой вы пользуетесь, и в ваших настройках. Ниже — четыре класса атак, разбор реальных кейсов, таймлайн инцидентов, масштаб проблемы и настройка ограничений в Cursor, Claude Code и Codex. Данные проверены на 26 сентября 2026 года.
Коротко (TL;DR)
- Опасен не только вредоносный сервер. Официальный GitHub MCP в мае 2025 года стал каналом утечки приватного кода: инструкцию агенту подложили в обычный issue публичного репозитория.
- Четыре класса атак: отравленное описание инструмента (tool poisoning), смена поведения после одобрения (rug pull), влияние на соседний доверенный инструмент (tool shadowing) и подмена конфига
mcp.json. - Cursor ломали дважды по-разному. MCPoison (CVE-2025-54136, 2025) — это буквально подмена команды в уже одобренном
mcp.json. DuneSlide (CVE-2026-50548/50549, 2026) — побег из песочницы, где конфиг не трогали вовсе. - Масштаб оценочный: OX Security в апреле 2026 года просканировала более 7000 серверов с открытым STDIO и экстраполировала до 200 000 уязвимых экземпляров. Это оценка, а не подсчёт.
- Защита — на стороне клиента: allowlist по команде или URL (не по имени), закреплённая версия сервера, токены с минимальными правами, изоляция и ручное одобрение действий на запись.
Что такое MCP и почему это новая поверхность атаки на ИИ-агентов
MCP (Model Context Protocol) — открытый протокол, через который ИИ-агент подключается к внешним инструментам и данным: GitHub, базам, почте, файловой системе. Как он устроен и зачем нужен, мы разбирали в материале MCP (Model Context Protocol): как ИИ подключается к вашим инструментам — здесь только то, что важно для безопасности.
Протокол вырос быстрее, чем практики его защиты. Anthropic представила MCP в ноябре 2024 года, OpenAI приняла стандарт в марте 2025-го, в декабре 2025-го Anthropic передала его Linux Foundation, а к апрелю 2026 года SDK протокола скачали более 150 млн раз (данные VentureBeat и The Agent Report).
Почему это отдельная поверхность атаки, а не ещё один плагин:
- Текст становится командой. Описание инструмента и ответ инструмента попадают прямо в контекст модели. Модель не отличает «данные» от «инструкций», поэтому фраза внутри описания или внутри ответа может изменить её поведение.
- Локальный сервер — это программа с вашими правами. Официальная документация протокола прямо предупреждает: MCP-серверы работают с теми же привилегиями, что и клиент.
- Конфиг исполняемый. Поле
commandвmcp.json— это строка, которую клиент запустит при старте. Кто может править конфиг, тот может запустить код. - Доверие выдаётся один раз. Пользователь одобряет сервер при подключении, а сервер может поменяться позже.
- Ответственность на реализации. В руководстве NSA процитирована сама документация MCP: протокол не может обеспечить эти принципы безопасности на уровне протокола.
Короткий словарик для дальнейшего текста. Инструмент (tool) — функция, которую сервер предлагает агенту (например, «прочитать issue»). Описание инструмента — текст для модели о том, что делает функция; пользователь его обычно не видит целиком. Непрямой prompt injection — инструкция, спрятанная не в вашем запросе, а в данных, которые агент читает по вашему заданию. STDIO — способ запуска локального сервера как процесса на вашей машине. CVSS — шкала опасности уязвимости от 0 до 10.
Четыре класса атак через MCP: от prompt injection до rug pull
Первые три класса публично описала компания Invariant Labs 1 апреля 2025 года; уязвимыми она назвала Cursor, а также системы Anthropic, OpenAI и Zapier. У них общий механизм — непрямой prompt injection, различается только точка, куда атакующий кладёт инструкцию. Четвёртый класс, подмену конфига, показала Check Point Research в июле 2025 года: здесь модель не нужна, атакующий меняет команду, которую клиент исполнит сам.
| Класс | Как работает | Почему пользователь не замечает | Пример | Как называют в отчётах |
|---|---|---|---|---|
| Отравленное описание | Сервер прячет в описании инструмента указание модели: прочитать файл, передать данные в параметр | Интерфейс показывает короткое имя функции, а модель видит весь текст | Демонстрация Invariant Labs, апрель 2025 | MCP tool poisoning attacks |
| Смена поведения после одобрения | Сервер одобрен в безобидном виде, затем меняет описание или команду | Большинство клиентов не спрашивают повторного согласия | WhatsApp MCP, апрель 2025 | MCP rug pull attacks |
| Затенение соседа | Второй сервер описанием своего инструмента меняет поведение чужого доверенного инструмента | Вредоносный инструмент может ни разу не вызываться | Подмена получателя у send_email в демо на Cursor | tool shadowing |
| Подмена конфига | Меняется запись в mcp.json: вместо безобидной команды — вредоносная | Одобрение привязано к имени записи, а не к её содержимому | MCPoison, CVE-2025-54136 | MCPoison-подобные атаки |
У атак есть и обратное направление. Уязвимость CVE-2025-6514 в клиенте mcp-remote (CVSS 9.6, опубликована 9 июля 2025 года) позволяла вредоносному серверу внедрить команду операционной системы через адрес авторизации, который сервер сам присылает клиенту. Здесь модель не нужна вовсе: сервер атакует программу-клиента напрямую. Документация протокола закрывает этот сценарий отдельным разделом о проверке OAuth-адресов.
Смежный вектор с той же природой — вредоносные навыки агента. Как отличить безопасный скилл от опасного, разобрано в материале Skills для Claude: где брать и как не установить вредоносный скилл.
Кража токенов через MCP: почему mcp.json так нужен атакующим
Одна из главных целей атак через MCP (MCP attacks) — не ваш код, а ваши ключи. Конфиг клиента хранит токены доступа ко всем подключённым сервисам: GitHub, базе данных, почте. Поэтому один скомпрометированный сервер открывает доступ ко всем остальным.
Ровно это показала демонстрация Invariant Labs. Отравленный инструмент «сложения чисел» содержал скрытое указание прочитать ~/.cursor/mcp.json и приватный SSH-ключ ~/.ssh/id_rsa, а содержимое передать как дополнительный параметр вызова. Пользователь видел математическое объяснение, а ключи уходили на сервер атакующего.
Документация протокола закрывает две смежные дыры на уровне требований:
- Проброс токена запрещён. Сервер не должен принимать токен клиента и передавать его дальше чужому API: такой приём в спецификации авторизации назван явно запрещённым.
- Проблема «сбитого с толку посредника» (confused deputy). Прокси-сервер со статическим идентификатором клиента, динамической регистрацией клиентов и сохранённым согласием у стороннего сервиса позволяет злоумышленнику получить код авторизации без согласия пользователя.
Не случайно первая строка в OWASP MCP Top 10 — «Token Mismanagement & Secret Exposure». Практический вывод: у каждого сервера свой токен с минимальными правами, а не общий ключ «на всё», и авторизация через OAuth там, где сервер её поддерживает.
Как вредоносный mcp.json взломал Cursor: разбор MCPoison
Если нужен один кейс, который объясняет всю тему, то это MCPoison. Уязвимость CVE-2025-54136 нашли исследователи Check Point Research в июле 2025 года; она затрагивала Cursor до версии 1.2.4 включительно.
Сценарий выглядел так. В общем репозитории лежит .cursor/mcp.json с безобидной записью. Коллега открывает проект, Cursor спрашивает, запускать ли сервер, и тот его одобряет. После этого атакующий с правом записи в репозиторий меняет команду внутри той же записи. Одобрение было привязано к имени записи, а не к её содержимому, поэтому повторного вопроса не было: новая команда запускалась при каждом открытии проекта.
Рядом стоит соседняя уязвимость того же месяца, CurXecute (CVE-2025-54135), и их часто путают.
| Параметр | CurXecute, CVE-2025-54135 | MCPoison, CVE-2025-54136 |
|---|---|---|
| Кто нашёл | Aim Security (Aim Labs), август 2025 | Check Point Research, июль 2025 |
| Вектор | Непрямой prompt injection заставляет агента создать .cursor/mcp.json | Атакующий правит уже одобренную запись в mcp.json |
| Нужен ли клик жертвы | Нет: создание нового dot-файла не требовало одобрения | Один раз — на безобидную версию записи |
| CVSS | 8.6 (v3.1) | 8.8 по NVD, 7.2 по GitHub |
| Публикация | 5 августа 2025 | 1 августа 2025 (MITRE), 2 августа (NVD) |
| Исправлено | Cursor 1.3.9 | Cursor 1.3 |
В CurXecute клик жертвы не нужен: инструкция приходит в данных, которые агент читает по заданию пользователя, а новый конфиг создаётся без вопроса. Если .cursor/mcp.json в проекте ещё не было, агент мог создать его сам — и сервер из этого файла запускался.
Отдельно о расхождении оценок MCPoison. Карточка NVD даёт 8.8, а GitHub как организация, присвоившая номер, — 7.2. Разница в одном параметре вектора: NVD считает, что атакующему нужны низкие привилегии, GitHub — высокие. По сути спорят о том, насколько сложно получить право записи в чужой репозиторий. Для команды с десятками внешних контрибьюторов ближе оценка NVD.
Урок MCPoison шире Cursor: любое изменение MCP-конфига — это изменение исполняемого кода, и его нужно проверять как код в pull request. Исправление вышло в Cursor 1.3 (29 июля 2025 года): по данным Check Point Research, с этой версии любая правка MCP-конфига, даже добавленный пробел, снова требует ручного одобрения.
DuneSlide: как Cursor ломали без единого клика в 2026 году
DuneSlide — следующая ступень, и по механике это уже не атака на mcp.json. Две уязвимости, CVE-2026-50548 и CVE-2026-50549, затрагивают Cursor Desktop до версии 3.0. В реестре уязвимостей обе опубликованы 25 июня 2026 года с оценкой 9.3 по CVSS 4.0. Публичный технический разбор Cato AI Labs вторичные источники относят к июлю 2026-го — расхождение дат между реестром и отчётом исследователей обычное.
| Параметр | CVE-2026-50548 | CVE-2026-50549 |
|---|---|---|
| Что сломано | Агент сам задавал параметр working_directory, и песочница без проверки разрешала запись в этот путь | При неудачной проверке символической ссылки песочница доверяла пути внутри проекта (fail-open) |
| Результат | Запись файлов вне проекта: .zshrc, LaunchAgents — они выполнятся при следующем входе | Запись любых файлов вне проекта, включая вспомогательные файлы самой песочницы |
| CVSS | 9.3 (v4.0) | 9.3 (v4.0) |
| Исправлено | Cursor 3.0 | Cursor 3.0 |
Связь с MCP здесь в доставке. По разбору The Agent Report, инструкция приходила в ответе MCP-инструмента или в результате веб-поиска, который агент читал по заданию пользователя. Атакующий не трогал ни редактор, ни конфиг. NVD для CVE-2026-50548 дополнительно даёт 9.8 по CVSS 3.1 — это та же уязвимость в другой версии шкалы, а не другая цифра риска.
Важный вывод из сравнения двух кейсов: одобрение изменений конфига закрывает MCPoison, но против DuneSlide бесполезно. Против инструкции в ответе инструмента помогают изоляция, своевременное обновление клиента и ручное одобрение действий на запись.
Доверенные MCP-серверы тоже сливают данные: кейс GitHub MCP
26 мая 2025 года Invariant Labs показала атаку на официальный GitHub MCP-сервер. Злоумышленник создавал issue в публичном репозитории жертвы с инструкцией для агента. Пользователь просил агента «посмотреть открытые issue», агент читал вредоносный текст, собирал данные из приватных репозиториев и публиковал их в pull request публичного репозитория.
Три детали делают этот кейс учебным:
- Сервер не был вредоносным. Invariant подчёркивает, что это не ошибка в коде GitHub MCP, а архитектурная проблема агентной системы: GitHub не может закрыть её патчем на своей стороне.
- Модель была из самых защищённых. В эксперименте использовалась Claude 4 Opus, и простая инъекция всё равно сработала.
- Подтверждения выключили сами пользователи. Claude Desktop по умолчанию спрашивает разрешение на каждый вызов, но многие включают режим «Always Allow» и перестают следить за действиями.
Рекомендация Invariant — жёстко ограничивать, с чем агент работает за одну сессию, например один репозиторий на сессию. Шире это правило сформулировал исследователь Саймон Уиллисон под названием «смертельная тройка» (lethal trifecta): опасно, когда в одном агенте сходятся доступ к приватным данным, чтение недоверенного текста и канал наружу. Уберите любое из трёх — и цепочка рвётся.
Вредоносные MCP-серверы в дикой природе: таймлайн реальных инцидентов
Cursor в новостях чаще других, но проблема не про один продукт. В таблице — датированные случаи, где злоумышленником или каналом был сам сервер (в англоязычных отчётах — MCP server attacks).
| Дата | Инцидент | Что произошло | Источник |
|---|---|---|---|
| 1 апреля 2025 | Tool poisoning, rug pull, shadowing | Первое публичное описание классов атак | Invariant Labs |
| 7 апреля 2025 | WhatsApp MCP | Вредоносный сервер в одной сессии с доверенным WhatsApp MCP выгрузил всю историю переписки; во втором эксперименте контакты утекли через вредоносное сообщение, без стороннего сервера | Invariant Labs |
| Апрель 2025 | Asana | Ошибка в MCP-интеграции могла показывать данные одной организации пользователям другой; функцию отключили почти на две недели | Checkmarx |
| 26 мая 2025 | GitHub MCP | Утечка приватных репозиториев через публичный issue | Invariant Labs |
| 9 июля 2025 | mcp-remote, CVE-2025-6514 | Сервер внедряет команду в клиент через адрес авторизации, CVSS 9.6 | MITRE, исследователь JFrog |
| 17 сентября 2025 | postmark-mcp 1.0.16 | Бэкдор тайно ставил скрытую копию каждого письма на адрес в домене giftshop[.]club | Postmark, Qualys |
| Ноябрь 2025 | Git MCP-сервер Anthropic | Обход проверки путей, внедрение аргументов, небезопасная инициализация репозитория | Checkmarx |
Две строки стоит прочитать внимательнее. postmark-mcp, по оценке Koi Security, — первый вредоносный MCP-сервер, замеченный в реальной атаке: npm-пакет выдавал себя за инструмент Postmark, хотя компания к нему отношения не имела, и 15 версий подряд вёл себя честно. Бэкдор появился только в 16-й. Это классическая схема атаки на цепочку поставок: сначала набрать доверие и установки, потом поменять код.
Вторая — WhatsApp MCP. В обзоре Checkmarx этот случай датирован ноябрём 2025 года, но оригинальная публикация Invariant Labs вышла 7 апреля 2025-го; мы берём дату первоисточника. Механика первого эксперимента та же, что у rug pull: сервер сначала вёл себя безобидно и переключался после одобрения. Второй эксперимент показательнее: вредоносный сервер там не понадобился вовсе, хватило обычного сообщения с инструкцией, которое агент прочитал через доверенный WhatsApp MCP.
Масштаб проблемы: сколько MCP-серверов уязвимо на самом деле
Точного числа уязвимых серверов не знает никто: все цифры ниже — либо выборки, либо экстраполяции. Поэтому у каждой указаны источник и метод.
| Показатель | Значение | Источник и дата | Что это на самом деле |
|---|---|---|---|
| Серверы с открытым STDIO на публичных IP | 7000+ | Блог OX Security, 15 апреля 2026; повторено VentureBeat 1 мая 2026 | Реальный скан |
| Уязвимые экземпляры во всей экосистеме | до 200 000 | Блог OX Security, 15 апреля 2026; повторено VentureBeat 1 мая 2026 | Экстраполяция по доле из скана |
| Платформы с подтверждённым удалённым выполнением кода | 6 | Блог OX Security, 15 апреля 2026; повторено VentureBeat 1 мая 2026 | Проверено на живых продакшн-системах |
| CVE по итогам разбора | 10+ | OX Security, апрель 2026 | LiteLLM, LangFlow, Flowise и другие |
| Доля серверов с эксплуатируемыми слабостями | ~40% из 10 000 | Lakera, по пересказу eSecurityPlanet | Один источник, методика не раскрыта |
| Рост отчётов о prompt injection | +540% год к году | HackerOne, 18 марта 2026 | Про prompt injection вообще, не только MCP |
Разбор OX Security — самый системный. Исследователи показали, что STDIO-транспорт в официальных SDK на Python, TypeScript, Java и Rust запускает переданную команду без санитизации. Уязвимыми оказались приложения, которые позволяют пользователю или атакующему добавить MCP-сервер с произвольной командой. Это атаки на MCP как на инфраструктуру (attacks on MCP), а не на конкретную модель.
Позиция Anthropic, по словам исследователей OX в пересказе The Register от 16 апреля 2026 года: менять архитектуру протокола компания отказалась, назвав поведение «ожидаемым». Документация протокола при этом отдельно описывает риск STDIO в прокси-архитектурах.
Из IDE в том же разборе без участия пользователя ломался только Windsurf: CVE-2026-30615 срабатывала при простом открытии репозитория с вредоносным MCP-конфигом. Cursor, Claude Code и Gemini-CLI отнесены к семейству, где инъекция меняет локальный конфиг, но нужно хотя бы одно действие пользователя. Производители, включая Google, Microsoft и Anthropic, назвали это известной проблемой или не уязвимостью, раз правка файла требует явного разрешения. Это важно понимать, когда вы нажимаете «Разрешить».
Цифру HackerOne часто подают как «рост MCP-атак на 540%». В пресс-релизе речь о валидированных отчётах о prompt injection на платформе в целом. MCP в пресс-релизе не упоминается вовсе, так что долю MCP-атак из этой цифры не вывести.
Как проверить MCP-сервер перед подключением
Проверка занимает 10–15 минут и отсекает большую часть рисков из таймлайна выше.
- Проверьте издателя. Совпадает ли автор пакета с компанией, чьё имя в названии?
postmark-mcpвыдавал себя за Postmark. Учтите: каталог коннекторов Anthropic проверяет их на соответствие критериям листинга, но, по документации Claude Code, аудит безопасности серверов не проводит. - Прочитайте описания инструментов целиком. Не в интерфейсе клиента, а в исходниках или в полном ответе сервера со списком инструментов. Тревожные признаки: упоминания файлов (
~/.ssh,mcp.json,.env), указания «перед использованием сделай…», служебные теги вроде<IMPORTANT>. - Посмотрите точную команду запуска. Для установки в один клик документация протокола требует от клиентов показывать команду полностью, с аргументами. Команда без версии пакета означает, что завтра запустится другой код.
- Закрепите версию. Укажите конкретную версию пакета, по возможности — с проверкой хэша. Invariant Labs называет закрепление версии одной из главных мер против rug pull.
- Выдайте минимальный токен. Отдельный токен для каждого сервера, только на нужные ресурсы, лучше только на чтение. Кейс GitHub MCP сработал потому, что у токена был доступ ко всем репозиториям.
- Решите, что сервер читает извне. Веб-страницы, issue, письма — это канал инъекции. Такой сервер не стоит держать в одной сессии с сервером, у которого есть доступ к приватным данным и выход наружу.
- Проверьте историю уязвимостей. Поиск по имени пакета в базе GitHub Advisory и NVD занимает минуту.
- Запускайте в изоляции, если сомневаетесь. Контейнер или отдельный пользователь без доступа к домашнему каталогу — рекомендация и документации протокола, и NSA.
Настройка защиты MCP в Cursor, Claude Code и Codex
Механику подключения здесь не повторяем — только настройки, которые ограничивают атаку. Чем три инструмента различаются по подходу в целом, разобрано в сравнении Claude Code, Cursor и Codex. У всех трёх инструментов защита строится в два слоя: что пользователь одобряет в интерфейсе и что администратор запрещает политикой.
| Мера | Cursor | Claude Code | Codex |
|---|---|---|---|
| Минимальная версия по известным CVE | 3.0 (DuneSlide), 1.3.9 (CurXecute) | Актуальная; следите за advisory | Актуальная; см. CVE-2025-61260 |
| Одобрение проектных серверов | Повторное при изменении конфига, с 1.3 | Обязательное для .mcp.json проекта | Диалог доверия рабочей папке |
| Политика администратора | Allowlist серверов по команде и URL в панели администратора | allowedMcpServers / deniedMcpServers в managed settings | mcp_servers в requirements.toml |
| Ограничение инструментов сервера | Allowlist команд (по словам Cursor, не гарантия) | Правила разрешений на инструменты | enabled_tools / disabled_tools |
Cursor: версия 3.0 и проверка mcp.json как кода
Обновление — первый и главный шаг: MCPoison закрыт в 1.3, CurXecute — в 1.3.9, DuneSlide — в 3.0. Подключение серверов в Cursor подробно разобрано в гайде MCP в Cursor: как подключить базу данных, Figma и свои инструменты; с точки зрения безопасности важно другое:
- проверяйте изменения в
.cursor/mcp.jsonи~/.cursor/mcp.jsonтак же, как изменения кода — через ревью; - в команде задайте allowlist в панели администратора Cursor (Team Settings → MCP Configuration): локальные серверы разрешаются по шаблону команды, удалённые — по шаблону URL, а для одобренного сервера можно ограничить инструменты, которые запускаются автоматически;
- не включайте режим, в котором агент выполняет всё без подтверждения. Сам Cursor в документации пишет, что allowlist команд — это не гарантия безопасности, обход возможен.
Claude Code: managed settings и allowlist по команде
Проектные серверы из .mcp.json Claude Code запускает только после одобрения в интерактивной сессии. Склонированный репозиторий не может одобрить свои серверы сам: ключи enableAllProjectMcpServers и enabledMcpjsonServers в его .claude/settings.json игнорируются, пока вы не подтвердили доверие папке (в v2.1.196 это правило распространили и на claude mcp list и claude mcp get). Сбросить сделанные выборы можно командой claude mcp reset-project-choices. Как подключать серверы в целом, разобрано в материале MCP в Claude Code: как подключить серверы, не сжечь контекст и когда он не нужен.
Для команды главное — managed settings: они имеют приоритет над пользовательскими и проектными настройками. Пример из документации Anthropic, сокращённый:
{
"allowedMcpServers": [
{ "serverUrl": "https://mcp.sentry.dev/*" },
{ "serverCommand": ["python", "/usr/local/bin/approved-server.py"] }
],
"deniedMcpServers": [
{ "serverCommand": ["npx", "-y", "unapproved-package"] }
]
}
Три нюанса, которые легко пропустить:
- Имя сервера — не защита. Документация прямо говорит:
serverNameзадаёт пользователь, и любой сервер можно назватьgithub. Разрешайте поserverCommand(точная команда с аргументами) илиserverUrl. - Пустой список и отсутствие списка — разные вещи.
allowedMcpServers: []запрещает всё, а не заданный ключ разрешает всё. - Чтобы пользователь не расширил список сам, нужен ещё
allowManagedMcpServersOnly: true. Запрет изdeniedMcpServersдействует всегда.
И одна ловушка для CI: в запусках claude -p, в Agent SDK и в облачных сессиях Claude Code не может показать запрос на одобрение и загружает проектные серверы без вопроса. Чужой репозиторий в таком конвейере стоит запускать только с managed-политикой.
Codex: requirements.toml и список разрешённых инструментов
Администратор задаёт allowlist в requirements.toml (на macOS и Linux — /etc/codex/requirements.toml). Сервер включится, только если совпадут и имя, и «идентичность»: для локального сервера — команда, для удалённого — URL. Пример из документации OpenAI:
[mcp_servers.docs]
identity = { command = "codex-mcp" }
[mcp_servers.remote]
identity = { url = "https://example.com/mcp" }
На уровне пользователя в config.toml у каждого сервера есть enabled_tools (какие инструменты вообще видны модели), disabled_tools (запрет поверх), default_tools_approval_mode и tools.<имя>.approval_mode — режим одобрения для сервера и отдельных инструментов. Как работают транспорты и config.toml, подробно — в материале MCP-серверы в Codex: config.toml, транспорты и отладка молчащего сервера.
У Codex уже была уязвимость этого класса: CVE-2025-61260 позволяла выполнить код из MCP-секции проектного конфига при простом запуске в чужом репозитории — разбор в статье Песочница Codex не закрывает чтение: модель угроз и чек-лист.
Остаточные риски: что allowlist и одобрения MCP не закрывают
Allowlist и диалоги одобрения закрывают вопрос «какой сервер запустится». Вопрос «что сделает агент, прочитав недоверенный текст» они не закрывают. Сводка сильных и слабых сторон мер:
| Мера | Что закрывает | Где не помогает |
|---|---|---|
| Allowlist серверов по команде или URL | Случайные и подменённые серверы, MCPoison-подобные атаки | Инъекция через ответ одобренного сервера (GitHub MCP, DuneSlide) |
| Закрепление версии | Rug pull через обновление пакета | Rug pull, когда сервер удалённый и меняет поведение на своей стороне |
| Повторное одобрение изменений конфига | Тихую подмену команды | Усталость от диалогов: пользователь нажимает «Разрешить» не читая |
| Allowlist команд агента | Случайные опасные команды | Обход через встроенные команды оболочки (CVE-2026-22708 в Cursor) |
| Песочница | Запись вне проекта | Ошибки самой песочницы (DuneSlide) и утечку через разрешённую сеть |
| Минимальные токены | Масштаб утечки | Сам факт утечки того, что токену доступно |
Кейс CVE-2026-22708, найденный Pillar Security, показателен: встроенные команды оболочки вроде export выполнялись без подтверждения даже при пустом allowlist и позволяли подготовить окружение так, что следующая безобидная команда запускала вредоносный код. Cursor после этого стал запрашивать одобрение для всего, что не может классифицировать, но вывод остаётся: allowlist — один слой, а не граница.
Отсюда практическое правило: действия с необратимыми последствиями (запись в репозиторий, отправка писем, платежи, публикация) агент должен делать только после вашего явного подтверждения, даже если это неудобно.
OWASP MCP Top 10 и рекомендации NSA для защиты
Строить модель угроз с нуля не нужно — есть два формальных фреймворка. OWASP MCP Top 10 описывает десять категорий риска и пока находится на стадии бета-версии. NSA вместе с партнёрами Five Eyes выпустила руководство «Model Context Protocol (MCP): Security Design Considerations for AI-Driven Automation» (PP-26-1834, версия 1.0, май 2026; опубликовано 2 июня 2026 года). Ниже категории OWASP привязаны к кейсам из этой статьи.
| Категория OWASP | Кейс из статьи | Главная мера |
|---|---|---|
| MCP01 Token Mismanagement & Secret Exposure | Чтение mcp.json и SSH-ключа в демо Invariant | Отдельный минимальный токен на сервер |
| MCP02 Privilege Escalation via Scope Creep | Токен GitHub MCP с доступом ко всем репозиториям | Узкие права и один ресурс на сессию |
| MCP03 Tool Poisoning | Скрытые инструкции в описании инструмента | Чтение описаний, закрепление версии |
| MCP04 Software Supply Chain Attacks & Dependency Tampering | postmark-mcp 1.0.16 | Проверка издателя, закрепление версии |
| MCP05 Command Injection & Execution | STDIO-разбор OX, CVE-2025-6514 | Обновления, изоляция процесса |
| MCP06 Prompt Injection via Contextual Payloads | Issue в GitHub MCP, доставка DuneSlide | Одобрение действий, разделение ролей |
| MCP07 Insufficient Authentication & Authorization | Сценарий confused deputy из документации протокола | OAuth с согласием, без проброса токенов |
| MCP08 Lack of Audit and Telemetry | Невозможно восстановить, что делал агент | Журнал вызовов инструментов |
| MCP09 Shadow MCP Servers | Серверы, подключённые разработчиками без ведома команды | Реестр серверов и allowlist |
| MCP10 Context Injection & Over-Sharing | Asana: данные одной организации видны другой | Разделение контекстов и арендаторов |
Руководство NSA добавляет то, чего нет в OWASP: организационный слой. Главные тезисы:
- Любой вызов инструмента через MCP — потенциально высокорисковое действие. Его стоит запускать в песочнице средствами ОС: AppContainers на Windows, seccomp, AppArmor или SELinux на Linux.
- Наименьшие привилегии. Если серверу не нужен доступ к файловой системе или сети, этот доступ явно запрещается во время выполнения.
- Границы доверия. Агент, плагины, модель и пользователь — разные зоны доверия со своими проверками.
- Проверка кода сервера. Если в организации есть аудит кода, MCP-серверы проходят его по самому строгому профилю.
- Журналы в общий мониторинг. Логи MCP-вызовов стоит отправлять в SIEM, а не хранить только на машине разработчика.
Чек-лист защиты от атак через MCP за один вечер
- Инвентаризация. Выпишите все подключённые серверы из
~/.cursor/mcp.json, проектных.cursor/mcp.jsonи.mcp.json, а также изconfig.tomlCodex. Лишние удалите. - Обновление клиентов. Cursor — не ниже 3.0, Claude Code и Codex — до актуальных версий.
- Закрепление версий. В каждой команде запуска — конкретная версия пакета вместо «последней».
- Ротация токенов. Для серверов, которые стояли без закреплённой версии или из неизвестного источника, выпустите новые токены с минимальными правами.
- Allowlist. В команде —
allowedMcpServersпоserverCommand/serverUrlв Claude Code,requirements.tomlв Codex, allowlist по команде и URL в панели администратора Cursor. - Инструменты на запись. Оставьте ручное одобрение для всего, что пишет, отправляет или публикует. Режим «Always Allow» — только для инструментов на чтение.
- Правило для репозиториев. Изменения MCP-конфигов проходят ревью в pull request, как код.
- Разделение сессий. Серверы, читающие веб или чужие issue, не держите в одной сессии с серверами, у которых есть приватные данные и выход наружу.
- Изоляция. Непроверенные серверы запускайте в контейнере или под отдельным пользователем.
- Журнал. Включите логирование вызовов инструментов, чтобы потом можно было понять, что делал агент.
Что в защите от MCP-атак устареет первым
Быстрее всего меняются номера версий клиентов, ключи настроек и список CVE: только за 2025–2026 годы Cursor прошёл путь от исправлений в 1.3 до 3.0, а в документации Claude Code поведение одобрений менялось на уровне патч-версий. Медленнее — сама модель угроз: пока модель не умеет отличать данные от инструкций, инъекция через описание или ответ инструмента остаётся рабочим вектором. Свежие данные проверяйте по первоисточникам: документации протокола MCP, карточкам NVD и advisory вашего клиента.
FAQ
Может ли вредоносный MCP-сервер украсть мои файлы, даже если я его не одобрял явно? Да, если он действует через другой, уже одобренный канал. В CurXecute инструкция приходила в данных, которые агент читал сам, и заставляла Cursor создать новый MCP-конфиг без вопроса. В DuneSlide инструкция приходила в ответе инструмента или результате веб-поиска. Одобрение защищает от запуска конкретного сервера, но не от текста, который агент читает.
Чем rug pull отличается от tool poisoning? Tool poisoning — вредоносная инструкция в описании инструмента с самого начала. Rug pull — смена поведения после того, как вы сервер одобрили: сначала безобидное описание или команда, потом вредоносные. На практике они сочетаются, как в демонстрации с WhatsApp MCP. От первого защищает чтение описаний до подключения, от второго — закрепление версии и повторное одобрение изменений.
Достаточно ли обновить Cursor до последней версии, чтобы закрыть все известные MCP-атаки? Нет. Обновление до 3.0 закрывает известные уязвимости самого Cursor — CurXecute, MCPoison и DuneSlide. Но атаки вроде GitHub MCP используют не ошибку клиента, а то, что модель выполняет инструкции из прочитанных данных. Против них нужны минимальные права токенов, разделение сессий и ручное одобрение действий на запись.
Как понять, что MCP-сервер, который я уже использую, безопасен? Гарантии нет, но есть проверка: издатель совпадает с компанией, версия закреплена, описания инструментов не содержат указаний про файлы и «перед использованием», по имени пакета нет открытых advisory, токен выдан с минимальными правами. Если сервер стоял на «последней версии» из неизвестного источника, стоит сменить токены, которые ему были доступны.
Защищает ли allowlist MCP-серверов от rug pull, если сервер не меняется, а меняется только его поведение? Частично. Allowlist по точной команде с закреплённой версией не даст запуститься новой версии локального пакета. Но удалённый сервер по разрешённому URL может поменять поведение на своей стороне, и allowlist этого не увидит. Здесь помогают только ограничение прав токена, ручное одобрение действий и журнал вызовов.
Нужно ли бояться MCP вообще или отказаться от сторонних серверов? Отказываться не обязательно: MCP — стандарт, который поддерживают крупные клиенты, и без него агенты теряют большую часть пользы. Разумный подход — относиться к серверу как к зависимости с правом выполнять код: брать у официальных издателей, закреплять версию, давать минимальные права. Непроверенные серверы запускать только в изоляции.
