Галоўная / Артыкулы

Кожны 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 знаходзіць процедуры рашэння інцыдэтаў за секунды.