Из-за функции «Don't Ask Again» в Claude Code в открытый доступ утекли API-ключи, пароли и токены пользователей
Компания Apiiro, специализирующаяся на безопасности приложений, обнаружила критическую уязвимость в ИИ-ассистенте Claude Code от Anthropic. Опция автоматического одобрения команд «Yes,
and Don't Ask Again» («Да, и больше не спрашивать») сохраняет полные строки терминальных команд — включая пароли, API-ключи и SSH-логины в абсолютно открытом виде (plain text) — в локальный JSON-файл проекта.
Исследователи нашли на GitHub 1 122 публичных репозитория с утекшими файлами настроек ИИ, в которых содержались 2 539 работающих секретов. При этом в 539 случаях коммит с утекшим паролем на GitHub отправил сам Claude, выполняя автоматические действия с Git по просьбе пользователя. 🔍 Подробное описание: из-за чего и что конкретно утекло Как работает механизм фейла: 1. Топорное сохранение: По умолчанию Claude Code запрашивает у программиста разрешение на запуск shell-команд. Чтобы не кликать «ОК» перед каждым тестом, разработчики нажимают кнопку «Don't Ask Again».
2. Запись в plain-text: Вместо сохранения безопасного шаблона или хэша команды, Claude Code берет строку «как есть» (слово в слово) и записывает ее как разрешенное правило в файл конфигурации проекта по пути .claude/settings.local.json. Если вы вводили в терминале команду вида curl -H "Authorization: Bearer sk-live-key123", ваш секретный ключ попадает в JSON-файл открытым текстом.
3. Обход .gitignore: По задумке разработчиков из Anthropic, Claude Code при первом создании файла пытается закинуть его в глобальный список исключений Git на компьютере пользователя. Однако это правило не переносится вместе с кодом. Как только разработчик копирует папку проекта на другую машину, разворачивает её в чистом Docker-контейнере или передает коллеге — глобальный .gitignore перестает работать. Папка .claude/ мгновенно становится видимой для отслеживания Git.
4. Слепая автоматизация: Половину коммитов с секретами сделал сам Claude. Получив команду вроде git add . && git commit -m "update", ИИ-агент радостно закидывал файл конфигурации вместе со всеми токенами в репозиторий. Что конкретно утекло в сеть: В ходе сканирования обнаружили 1 379 уникальных секретов:
• Административные облачные ключи от провайдеров (AWS, Azure, Google Cloud); • Живые пароли от продакшн-баз данных (включая критические СУБД, такие как Azure PostgreSQL, Supabase и Square); • SSH-логины и доступы к закрытым серверам компаний; • Мастер-пароли от закрытых баз медицинских и финансовых организаций. Самое опасное: Традиционные сканеры уязвимостей типа TruffleHog или GitHub Secret Scanning пропустили 215 жестких утечек, поскольку пароли были вшиты внутрь текста нестандартных bash-команд, которые автоматические алгоритмы защиты не распознали как ключи. 🛑 Как защититься разработчикам Простое удаление файла .claude/settings.local.json из текущей папки не исправит ситуацию, если проект уже был отправлен в сеть: секреты навсегда останутся в истории коммитов (Git history) и форках репозитория.
Действуйте по жесткому регламенту:
1. Проведите ревизию и ротацию (Прямо сейчас): • Зайдите на GitHub организации/аккаунта и вбейте в поиск: path:**/.claude/settings.local.json. • Если нашли совпадения — немедленно отзывайте (ротируйте) все API-ключи, пароли и токены, которые там упоминаются. Только после выпуска новых ключей вычищайте историю Git.
2. Закройте секреты в ENV-переменные:
• Категорически запрещено передавать пароли явным текстом в аргументах команд терминала. • Заменяйте их на переменные окружения: curl -H "Authorization: Bearer $MY_SECRET_TOKEN". При нажатии «Don't Ask Again» Claude сохранит в файл строку $MY_SECRET_TOKEN, а не ваше реальное значение.
3. Забейте жесткий локальный .gitignore:
• Не полагайтесь на автоматику Anthropic. В корень каждого своего проекта в файл .gitignore руками пропишите строки:text .claude/ • Если папка уже отслеживается Git, принудительно удалите её из индекса командой:bash git rm --cached -r .claude/
4. Утверждайте маски, а не точные команды:
• Если Claude Code просит разрешение на запуск, не одобряйте конкретную строчку с параметрами. Настраивайте паттерны (например, разрешайте маску Bash(npm run:*) или Bash(python3 *)), чтобы утилита не записывала аргументы целиком.
5. Используйте внешние менеджеры секретов:
• Прогоняйте команды через CLI-инструменты вроде 1Password CLI (op run), Infisical или Doppler. Они подставляют ключи прямо в оперативную память процесса в момент исполнения, полностью скрывая их от логов и контекста ИИ-агента.