THINKINGOS
A I L a b o r a t o r y
Материалы блога отражают наш практический опыт и R&D-гипотезы. Там, где приведены эффекты, они зависят от контекста проекта, качества данных, архитектуры и процессов внедрения.
Назад к блогу
Безопасность
14 октября 2026 10 мин
MCP Безопасность AI-агенты Секреты TaoCoder GitGuardian

Как мы сделали кодовых агентов безопаснее : автоматическое извлечение секретов из MCP-конфигов

29 миллионов hardcoded секретов в GitHub, 24 000 — в MCP-конфигах. Мы реализовали автоматическое извлечение секретов на уровне IDE: пользователь вводит ключ → он автоматически защищён через OS-шифрование.

Как мы сделали кодовых агентов безопаснее: автоматическое извлечение секретов из MCP-конфигов

AI-кодовые агенты работают с внешними инструментами через MCP-серверы. Конфигурации этих серверов хранят API-ключи и токены — и почти всегда в открытом виде. По данным GitGuardian, в 2025 году в публичных GitHub-коммитах нашли 29 миллионов hardcoded секретов, из них около 24 000 — именно в MCP-конфигурационных файлах. Коммиты с AI-ассистентами утекают в два раза чаще, чем обычные.

Мы столкнулись с этой проблемой напрямую и реализовали автоматическое извлечение секретов — встроенный механизм защиты MCP-конфигов на уровне IDE. Ниже — разбор проблемы, сравнение с рынком и архитектура решения.

1) Масштаб проблемы: секреты в MCP — это не теоретический риск

MCP (Model Context Protocol) стал стандартом подключения AI-агентов к внешним инструментам. Каждый MCP-сервер может требовать API-ключ — для доступа к базе данных, поисковому движку, платёжной системе, облачному хранилищу.

Когда разработчик настраивает MCP-сервер, он вписывает ключ прямо в конфигурационный файл:

{
  "mcpServers": {
    "my-server": {
      "command": "npx",
      "args": ["-y", "@my/mcp-server"],
      "env": {
        "API_KEY": "sk-ant-api07-very-secret-key-here"
      }
    }
  }
}

Этот файл может:

  • попасть в Git вместе с проектом;
  • быть прочитан другим расширением VS Code;
  • лежать на диске в открытом виде;
  • быть синхронизирован через облачное хранилище.

Данные GitGuardian (отчёт «State of Secrets Sprawl 2026») показывают масштаб:

  • 28,65 млн новых hardcoded секретов в публичных GitHub-коммитах за 2025 год (+34% к предыдущему году)
  • 24 008 уникальных секретов найдены непосредственно в MCP-конфигурационных файлах
  • 2 117 из них — валидные учётные данные, которые реально работали
  • Секреты AI-сервисов: 1 275 105 утечек (+81% к предыдущему году)
  • 3,2% коммитов с AI-ассистентами содержат утечки — против 1,5% среднего показателя по всему GitHub

Отдельно показательно: документация MCP сама поощряет небезопасные паттерны. Гайды по настройке рекомендуют вписывать API-ключи прямо в конфигурационные файлы.

2) Как это сделано у других: plaintext везде

Мы проверили основные AI-кодовые агенты и IDE:

ИнструментФайл конфигурацииПодход к секретам
Cursor.cursor/mcp.json (проект) + ~/.cursor/mcp.json (пользователь)Plaintext в env/headers
Windsurfmcp_config.jsonPlaintext, аналогично
Cline (оригинал)mcp_settings.jsonPlaintext, нет механизма извлечения
Roo CodeФорк ClineБез улучшений в этой области
Claude Desktopclaude_desktop_config.jsonPlaintext; login-токен в OS keychain (macOS), но MCP-секреты — в файле
VS Code Copilot~/.copilot/mcp-config.jsonПоддержка inputs (prompt at runtime), но без автоматического извлечения из конфигов

Сторонние решения (1Password, GitGuardian, Knostic) предлагают vault-менеджмент или обнаружение утечек постфактум. Но ни один IDE не извлекает секреты автоматически из MCP-конфигов на уровне редактора.

Проблема усугубляется тем, что существующие средства контроля (репозиторные сканеры, IdP/IAM/PAM, менеджеры секретов) не видят уровень конечных точек. Когда разработчик добавляет MCP-сервер за минуты, security review просто не успевает за скоростью изменений.

3) Наш подход: автоматическое извлечение секретов

Мы реализовали SecretExtractor — первый в индустрии встроенный механизм защиты MCP-конфигов на уровне IDE. Принцип простой: пользователь не должен ничего делать для защиты своих ключей. Ввёл ключ в конфиг → он автоматически защищён.

Как это работает

Пользователь вводит API-ключ в конфиг (plaintext)
    ↓
SecretExtractor автоматически сканирует env vars и headers
    ↓
Ключ сохраняется в VS Code SecretStorage (шифрование на уровне ОС)
    ↓
В конфиге остаётся плейсхолдер: {{SECRET:my-server_env_0}}
    ↓
UI показывает маску: [🔒 my-server_env_0]
    ↓
При подключении к серверу runtime resolver подставляет реальное значение
    ↓
MCP-сервер получает реальный ключ и работает нормально

Ключевые свойства

  1. Автоматичность — пользователю не нужно ничего делать. Ввёл ключ → он уже защищён.
  2. Дедупликация — если такое же значение уже сохранено, переиспользуется существующий ключ. Нет дубликатов в хранилище.
  3. Безопасное хранение — VS Code SecretStorage использует ОС-уровневое шифрование (Keychain на macOS, DPAPI на Windows).
  4. UI-маска — в JSON-редакторе видно [🔒 key_name] вместо реального значения. Ключ не виден при просмотре конфига.
  5. Runtime resolver — при подключении к серверу плейсхолдеры {{SECRET:KEY}} автоматически заменяются на реальные значения. MCP-сервер не знает о подстановке.
  6. Обратная совместимость — существующие plaintext-конфиги автоматически мигрируются при первом подключении.
  7. Логирование без утечек — в логи попадают только счётчики и имена серверов, никогда — значения секретов.

4) Архитектура: что под капотом

Система состоит из нескольких компонентов, каждый отвечает за свой участок pipeline:

┌─────────────────────────────────────────────────────┐
│  mcp_settings.json                                  │
│  "env": { "API_KEY": "{{SECRET:my-server_env_0}}" } │
└──────────────────────┬──────────────────────────────┘
                       │
          ┌────────────▼────────────┐
          │   SecretExtractor       │
          │   (извлечение + дедуп)  │
          └────────────┬────────────┘
                       │
          ┌────────────▼────────────┐
          │   VS Code SecretStorage │
          │   (ОС-шифрование)       │
          └────────────┬────────────┘
                       │
          ┌────────────▼────────────┐
          │   SecretsResolver       │
          │   (runtime подстановка) │
          └────────────┬────────────┘
                       │
          ┌────────────▼────────────┐
          │   MCP Server            │
          │   (получает реальный    │
          │    API-ключ)            │
          └─────────────────────────┘

SecretExtractor (331 строка) — сканирует env vars (stdio-транспорт) и headers (sse/streamableHttp-транспорт), генерирует имена ключей по шаблону ${serverName}_${fieldType}_${index}, дедуплицирует через StateManager.getSecretKey().

SecretsResolver — рекурсивная замена {{SECRET:KEY}} на реальные значения из StateManager. Работает прозрачно для MCP-сервера.

McpHub — точка интеграции: извлечение запускается при updateServerConnections() и connectToServer().

saveMcpSettingsJson — извлечение при записи конфига на диск. Если пользователь вручную добавил plaintext-ключ, он будет извлечён при следующем сохранении.

UI-компоненты — maskSecretsForDisplay() и unmaskSecretsForSave() для MCP и REST API JSON-редакторов. Пользователь видит маски, но при сохранении плейсхолдеры корректно обрабатываются.

5) Пять слоёв рисков MCP и где здесь защита

Aembit в своём гайде по безопасности MCP (2026) выделяет пять слоёв рисков:

  1. Транспорт и коммуникации — отсутствие TLS/mTLS, DNS rebinding, replay-атаки
  2. Аутентификация и идентичность — статические API-ключи, long-lived токены в конфигах, hardcoded секреты
  3. Целостность контекста — отравление контекста агента, утечка данных в нерелевантные workflow
  4. Авторизация и привилегии — избыточные разрешения, эскалация привилегий
  5. Цепочка поставок — вредоносные дескрипторы инструментов, загрязнение репозиториев, теневые серверы

Наше решение закрывает второй слой — аутентификацию и идентичность. Это критический участок: именно здесь секреты попадают в конфиги и оттуда — в Git, логи, облачные синхронизации.

Но важно понимать: извлечение секретов — это необходимо, но недостаточно. Полная защита MCP требует:

  • контроля транспорта (TLS, mTLS);
  • валидации контекста на каждой границе;
  • минимальных привилегий для каждого MCP-сервера;
  • мониторинга аномалий в runtime;
  • проверки цепочки поставок (подписанные артефакты, хеши целостности).

Мы работаем над расширением защиты в этих направлениях — в рамках общей архитектуры execution layer (подробнее см. разбор TaoBridge как execution layer).

6) Тестовое покрытие

Мы не доверяем безопасности без тестов. SecretExtractor покрыт:

  • 46 unit-тестов для SecretExtractor — все сценарии извлечения, дедупликации, генерации имён
  • 14 интеграционных тестов для MCP secrets pipeline — полный цикл от записи конфига до runtime-разрешения
  • 232 строки интеграционных тестов для StateManager custom secrets
  • Полный цикл: Сохранение → Извлечение → Плейсхолдеры → Загрузка → Разрешение → Реальные значения → Обратная проверка

Каждый коммит проходит CI с этими тестами. Если что-то ломается — деплой блокируется.

7) Почему это важно

Три фактора, которые делают эту проблему актуальной именно сейчас:

MCP — это новый стандарт. Каждый AI-агент подключается к внешним инструментам через MCP. Каждый MCP-сервер может требовать API-ключ. Количество секретов в конфигах растёт линейно с количеством интеграций.

Конфиги попадают в Git. Разработчики часто коммитят mcp.json вместе с проектом. Даже если файл в .gitignore, он может быть прочитан другим расширением, синхронизирован через облако или просто лежать на диске в открытом виде.

AI-агенты удваивают риск. По данным GitGuardian, коммиты с AI-ассистентами утекают в два раза чаще. Теневой AI масштабируется быстрее, чем политика безопасности: команды добавляют агентов и MCP-серверы за минуты, а security review работает в другом таймскейле.

Вывод

TAO·CODER — первый кодовый агент, который встроенно предотвращает утечку секретов из MCP-конфигов. Пользователь получает защиту из коробки, без необходимости настраивать vault, hooks или сторонние инструменты.

Это не маркетинг — это инженерия. Секреты не должны лежать в plaintext. Точка.

Ключевые цифры:

  • 29 млн hardcoded секретов в публичных GitHub-коммитах за 2025
  • 24 000 секретов в MCP-конфигах
  • 46 unit-тестов + 14 интеграционных тестов
  • 0 строк plaintext после автоматического извлечения

Технические детали:

  • SecretExtractor: vendor/cline/src/services/mcp/SecretExtractor.ts
  • SecretsResolver: vendor/cline/src/taocoder/runtime/secretsResolver.ts
  • StateManager custom secrets: vendor/cline/src/core/storage/StateManager.ts
  • UI маска: vendor/cline/webview-ui/src/components/mcp/configuration/tabs/JsonEditorScreen.tsx

Источники

Безопасность AI

Нужен похожий проект?

Опишите задачу, и мы предложим архитектуру, контур контроля и способ запуска.

Обсудить проект