Каждый сервер MCP — это ещё один секрет, который может быть утечкой вашим агентом.
Каждый сервер MCP представляет собой ещё одну скрытую угрозу, увеличивающую возможности воздействия вредоносных данных. Проведите аудит диапазонов использования токенов и примените четыре исправления, которые сократят зону поражения.
Источники: Every MCP Server You Add Gives Your Agent Another Credential
Всё начинается невинно. В понедельник подключается GitHub, во вторник — Slack, затем Postgres, потом Notion, а ещё — внутренний сервер биллинга, написанный коллегой за один день и так и не задокументированный. Каждое новое добавление делает агента более функциональным. Каждое из них также добавляет ещё один ключ к кольцу, которое он носит с собой.
Проблемы обычно возникают случайно, когда кто-то отлаживает что-то не связанное и открывает файл конфигурации. Шесть серверов, шесть секретов в активном состоянии, все в простом текстовом формате в личном каталоге, без срока действия и без владельца. В этот момент MCP перестаёт казаться удобным инструментом и начинает выглядеть как источник рисков.
Арифметика
После нескольких месяцев энтузиазма типичная конфигурация выглядит так:
{
"mcpServers": {
"gh": { "cmd": "gh-mcp", "env": { "GH_TOKEN": "ghp_live_9f2a" } },
"db": { "cmd": "pg-mcp", "env": { "PG_URL": "postgres://app:hunter2@prod/main" } },
"sl": { "cmd": "slk-mcp", "env": { "SLACK_TOKEN": "xoxb-live-771" } }
}
}
Три сервера, три секрета, один файл и отсутствие ротации. Вы можете проверить свой собственный компьютер за несколько секунд, ища в стандартных папках конфигурации строки, похожие на токены.
grep -rIl "ghp_\|xoxb-\|sk-" ~/.config ~/.claude ~/Library 2>/dev/null | wc -l
Люди, которые им пользуются, часто находят больше, чем ожидали. Когда вы ожидали трех, а находите одиннадцать, это совсем не редкость.
Та часть, которая действительно причиняет проблемы
Учетные данные, хранящиеся на диске, — это менее серьезная сторона проблемы. Более серьезной является та обстоятельство, что каждый из этих ключей теперь находится в руках одного лица, принимающего решения, и это лицо читает текст с Интернета.
one agent loop
|
+---------+---------+---------+---------+
| | | | |
github slack postgres notion billing
(14 scp) (9 scp) (rw all) (rw ws) (rw all)
| | | | |
+---------+---------+---------+---------+
|
one poisoned input
Комментарий к проблеме, страница в Notion или строка в таблице могут каждая предложить действие, и агент обладает всеми необходимыми инструментами для его выполнения. Это своего рода «проблема сбитого с толку помощника» в новом обличии. Агент не нарушает правила — он просто помогает, и не может отличить ваше указание от текста, который лишь к нему похож.
Оценка разрыва
Полезным упражнением будет зафиксировать каждый вызов инструмента в течение двух недель, а затем сравнить то, что каждый токен может делать по замыслу, с тем, что он на самом деле делает. Результат одной такой проверки:
| Service | Granted Scopes | Scopes Used | Utilization |
| -------- | --------------: | ------------------: | ----------: |
| GitHub | 14 | 3 | 21.4% |
| Slack | 9 | 2 | 22.2% |
| Postgres | Full RW | 1 table, reads only | Minimal |
| Notion | Whole workspace | 2 pages | Minimal |
Примерно четыре пятых предоставленных прав на доступ остались невостребованными. Эта проблема связана не с неудобством, а с рисками, которые вы несете, не получая ничего взамен.
Решения, отсортированные по эффективности
Один токен на сервер, соответствующий его конкретным задачам. Общие токены означают общую ответственность: когда что-то идет не так, журнал аудита должен указывать на сервер, а не на конкретного человека.
По умолчанию любые объекты, хранящие данные, должны иметь режим только для чтения. Два строки SQL, специальная роль и права на чтение только тех таблиц, которые действительно используются агентом, позволяют превратить самый худший сценарий — потерю таблицы — в утечку запроса.
create role agent login password 'rotate_me';
grant usage on schema public to agent;
grant select on orders, users to agent;
Краткосрочные токены вместо постоянных. Пусть хранилище выдает учетные данные по запросу с сроком действия, измеряемым в минутах. Секрет, украденный утром во вторник, становится бесполезным к послеобеденному времени того же дня.
async function tok(srv) {
const r = await fetch(`${VAULT}/issue/${srv}`, { method: "POST" });
const { token, ttl } = await r.json();
return { token, exp: Date.now() + ttl * 1000 };
}
Логирование происходит не только для чата, но и для звонков. Тонкий оберточный код, записывающий информацию о сервере, аргументах и временной метке для каждой функции инструмента, состоит всего из нескольких строк. В упомянутом выше аудите это позволило обнаружить, что сервер вызывал конечную точку, к которой ему никто не просил обращаться.
function wrap(name, fn) {
return async (args) => {
log({ srv: name, args, at: Date.now() });
return fn(args);
};
}
Правило, которое следует принять
Прежде чем подключать сервер, представьте его как враждебный элемент и спросите себя, к чему он может получить доступ без какой-либо помощи. Если честный ответ вызывает дискомфорт, ужесточьте условия доступа или вообще не подключайте сервер. Не обещайте исправить ситуацию позже, ведь «позже» редко наступает, тем более в пятницу.
Всё это не является критикой MCP. Он решил проблему с интеграцией, из-за которой агенты казались просто игрушками. Суть в том, что каждый добавляемый сервер также добавляет учетные данные, и к этим учетным данным следует относиться с такой же осторожностью, как и к любому другому ключу, используемому в производственной среде.
Связанные материалы
- Практические заметки: Создание финансового агента на основе ИИ с использованием сервера MCP от EODHD — Пошаговое руководство по использованию Практических заметок: Создание финансового агента на основе ИИ с использованием сервера MCP от EODHD: контракты, проверки и блоки кода для команд, разрабатывающих системы MCP без него.
- Практические заметки: Может ли ваш агент искать MCP-сервисы — Пошаговое руководство по использованию Практических заметок: Может ли ваш агент искать MCP-сервисы: контракты, проверки и блоки кода для команд, использующих эту схему.