Как мы сделали кодовых агентов безопаснее : автоматическое извлечение секретов из 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 |
| Windsurf | mcp_config.json | Plaintext, аналогично |
| Cline (оригинал) | mcp_settings.json | Plaintext, нет механизма извлечения |
| Roo Code | Форк Cline | Без улучшений в этой области |
| Claude Desktop | claude_desktop_config.json | Plaintext; 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-сервер получает реальный ключ и работает нормально
Ключевые свойства
- Автоматичность — пользователю не нужно ничего делать. Ввёл ключ → он уже защищён.
- Дедупликация — если такое же значение уже сохранено, переиспользуется существующий ключ. Нет дубликатов в хранилище.
- Безопасное хранение — VS Code SecretStorage использует ОС-уровневое шифрование (Keychain на macOS, DPAPI на Windows).
- UI-маска — в JSON-редакторе видно
[🔒 key_name]вместо реального значения. Ключ не виден при просмотре конфига. - Runtime resolver — при подключении к серверу плейсхолдеры
{{SECRET:KEY}}автоматически заменяются на реальные значения. MCP-сервер не знает о подстановке. - Обратная совместимость — существующие plaintext-конфиги автоматически мигрируются при первом подключении.
- Логирование без утечек — в логи попадают только счётчики и имена серверов, никогда — значения секретов.
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) выделяет пять слоёв рисков:
- Транспорт и коммуникации — отсутствие TLS/mTLS, DNS rebinding, replay-атаки
- Аутентификация и идентичность — статические API-ключи, long-lived токены в конфигах, hardcoded секреты
- Целостность контекста — отравление контекста агента, утечка данных в нерелевантные workflow
- Авторизация и привилегии — избыточные разрешения, эскалация привилегий
- Цепочка поставок — вредоносные дескрипторы инструментов, загрязнение репозиториев, теневые серверы
Наше решение закрывает второй слой — аутентификацию и идентичность. Это критический участок: именно здесь секреты попадают в конфиги и оттуда — в 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
Источники
Нужен похожий проект?
Опишите задачу, и мы предложим архитектуру, контур контроля и способ запуска.
Обсудить проект