Главная / Статьи

Каждый сервер MCP — это ещё один секрет, который может быть утечкой вашим агентом.

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

Издатель: REACTAPP.TOP4 мин чтения950 слов

Источники: 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. Он решил проблему с интеграцией, из-за которой агенты казались просто игрушками. Суть в том, что каждый добавляемый сервер также добавляет учетные данные, и к этим учетным данным следует относиться с такой же осторожностью, как и к любому другому ключу, используемому в производственной среде.

Связанные материалы

  • Рабочий процесс локального агента LLM, построенный на папках и файлах Markdown — Создайте многоэтапную локальную систему агентов с контролируемым доступом, при которой каждый этап представляет собой папку, запросы формируются в формате Markdown и могут быть редактированы, а человек проверяет результаты перед выполнением дорогостоящих действий.
  • Личный сервер MCP, позволяющий Claude искать руководства вашей команды — Индексируйте руководства и отчеты о результатах работы в формате Markdown в ChromaDB, предоставляйте возможность семантического поиска через сервер MCP и позволяйте Claude находить процедуры реагирования на инциденты за секунды.