AI-агенти для коду · Ризик · CWE-798 · OWASP LLM02

Твій AI-агент може прочитати твої API-ключі

Ключ, вставлений у конфіг MCP, .env, який вантажить скіл, тека на кшталт ~/.aws, яку агенту можна відкривати: кожен на відстані одного читання від агента і від усього, що ним керує.

.mcp.json (Claude Code) −ключ у файлі+ключ зі сховища
 {   "mcpServers": { "github": {−    "env": { "GITHUB_TOKEN": "ghp_••••••••••••" }+    "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }   } } }

Чому це важливо

Агент читає файли, щоб працювати. Ключ у файлі, який він може прочитати, може потрапити в промпт, лог, коміт чи запит на сервер, а інструкція, схована в README чи на сторінці, може попросити саме цього. Ключ у сховищі читає лише програма, яку ти з ним запускаєш.

Де NeuroShield знаходить ключі

МісцеЯк це виглядає
Конфіг MCP-сервераТокен в env, в аргументах сервера, в його URL чи заголовку.
.env, який вантажить скіл чи скриптsource .env або grep / cut одного рядка з чужого .env.
Теки з ключамиПравила читання, що відкривають агенту ~/.ssh, ~/.aws, ~/.gnupg, ~/.kube, .npmrc чи .netrc.
Самотній файл із ключамиФайл із ключами в теці агента, який уже ніхто не читає.

Як виправити

Збережи ключ один раз

macOS: security add-generic-password -a "$USER" -s NAME -w · Windows: Set-Secret -Name NAME · Linux: secret-tool store --label=NAME service NAME. Кожна команда спитає значення.

Читай його там, де треба

У профілі shell чи скрипті: export NAME="$(security find-generic-password -a "$USER" -s NAME -w)", а в конфігу на місці ключа постав посилання: ${NAME} у Claude Code, ${env:NAME} у VS Code і Cursor. Для Claude Desktop запускай сервер через маленький скрипт, що читає ключ зі сховища.

Закрий теки

Видали правила, що відкривають теки з ключами, або звузь їх до однієї потрібної теки; тоді агент питатиме перед читанням ключів.

Fix It for Me

На Маку NeuroShield може сам перенести ключ із .env скіла в Keychain і переписати рядок, з копією і Undo.

NeuroShield показує ключ за назвою, а не значенням

Він читає налаштування кожного агента, конфіги MCP, скіли й .env, які вони вантажать, і називає ключ, файл і рядок. Значення не покидає файл.

Питання

Хіба .env у .gitignore не досить?

Це тримає ключ поза git, а не поза досяжністю агента. Агент читає файли на диску, ігноровані чи ні.

NeuroShield кудись надсилає мої ключі?

Ні. Він читає локально і показує лише назви ключів.

Подивись на своїх агентів

Перевірка безкоштовна: скільки в тебе агентів і що вони можуть. Деталі й виправлення - у Shields.