Эфир 18.11 · Поток 318 ноября в 19:00 МСК — бесплатный практический эфир по ИИ-агентам · Живой Поток 3 стартует 23.11Эфир 18 ноября →Поток 3 (23.11)
РелизРазбор · На радарQodo Blog→ оригинал

Claude Code оставил секреты в 1122 публичных файлах GitHub из-за «Don't ask again»

Когда вы нажимаете в Claude Code «Don't ask again», агент записывает разрешение в файл настроек проекта. Если в команде был токен или пароль, он уезжает в файл вместе с ней. Аналитики Qodo нашли такие секреты в 1122 публичных файлах настроек на GitHub. Настройки агента — это уже код, и ревьюить их нужно как любой другой коммит.

AI-обработка оригинала Qodo Blog; редакция Hamidun News
Claude Code оставил секреты в 1122 публичных файлах GitHub из-за «Don't ask again»
Источник: Qodo Blog. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникQodo Blog ↗
Главный редактор
Ключевой факт #1Добавьте .claude/settings.local.json в .gitignore до первого коммита
Не вставляйте токены в командыберите их из переменных окружения
Ключевой факт #3Подключите secret-сканер в pre-commit и CI на папку .claude

Вы просите агента дёрнуть API, он спрашивает разрешения на команду, а вы устали нажимать «Yes» в десятый раз и выбираете «Don't ask again». Удобно. Но Qodo выяснил, что у этой кнопки есть побочный эффект: в 1122 публичных файлах настроек на GitHub нашлись секреты, которые туда сохранил сам Claude Code.

Как секрет попадает в конфиг

У Claude Code есть система разрешений. Когда вы соглашаетесь «больше не спрашивать» про конкретную команду, агент дописывает правило в файл настроек внутри папки .claude. Есть общий settings.json, который обычно коммитят вместе с проектом, и локальный settings.local.json для личных правил.

Проблема в том, что правило описывает команду буквально, со всеми аргументами. Допустим, вы попросили агента сделать запрос через curl, а токен вставили прямо в заголовок. Агент запомнит эту строку целиком, и токен окажется в файле открытым текстом. Это иллюстрация механизма, а не цитата из отчёта. Но логика именно такая: вы ничего не «сохраняли», вы нажали кнопку удобства.

Дальше работает обычная человеческая инерция. Папку .claude кто-то коммитит целиком, потому что там «полезные настройки для команды». Репозиторий оказывается публичным, и секрет лежит на виду.

Почему это не мелочь

Мы привыкли, что секреты утекают из .env, из конфигов облака, из захардкоженных строк в коде. Файлы настроек агента в эту картину не вписывались: их воспринимали как «личные предпочтения редактора», вроде темы оформления. Но там уже лежат исполняемые разрешения: что агенту можно запускать без вопросов. Значит, у файла две роли сразу: политика безопасности и потенциальное хранилище секретов.

Ещё важнее другое. Эти файлы пишет не человек, а инструмент, причём в ответ на клик, а не на осознанное решение «сохранить конфиг». Никто не перечитывает то, что не писал сам. Отсюда и вывод Qodo: настройки агента надо ревьюить как код.

Что делать прямо сейчас

  • Проверьте свои репозитории. Поищите по .claude/ строки, похожие на ключи, токены и пароли, в том числе в истории git. Удаления файла из последнего коммита недостаточно: история остаётся.
  • Ротируйте всё, что нашли. Если токен хоть раз был в публичном репозитории, считайте его скомпрометированным.
  • Закройте локальный файл. settings.local.json должен быть в .gitignore. Не надейтесь, что кто-то это уже сделал.
  • Уберите секреты из самих команд. Передавайте их через переменные окружения или менеджер секретов, тогда в правило попадёт имя переменной, а не значение.
  • Включите автоматику. Secret-сканер в pre-commit и CI, а на GitHub ещё и push protection. Добавьте .claude в CODEOWNERS, чтобы изменения разрешений агента не проходили мимо ревью.
  • Не злоупотребляйте «Don't ask again». Для команд с чувствительными аргументами лучше подтверждать каждый раз или писать узкое правило вручную.

Ограничения и оговорки

Отчёт опубликовал Qodo, а это вендор инструментов для код-ревью. Тема для него родная, и подаёт он её соответственно. Кроме того, из анонса не видно, сколько из найденных секретов были действующими. И 1122 файла — это то, что нашлось в публичном поиске, а не полная картина: приватные репозитории никто не считал.

При этом претензия не только к одному продукту. Тот же механизм «запомнить команду» есть и в других агентских инструментах, и к ним применимы те же вопросы. Разумное ожидание от разработчиков агентов: маскировать или не сохранять значения, похожие на секреты, и предупреждать перед записью.

Итог

Агентные инструменты создают новый класс артефактов: конфиги, которые пишутся сами, исполняются с вашими правами и легко уезжают в git. Относитесь к ним как к коду: ревью, сканирование, .gitignore. Это дешевле, чем разбираться с последствиями утёкшего ключа.

Сюжет

Вопросы и ответы по материалу

Что известно по теме: как секрет попадает в конфиг?

У Claude Code есть система разрешений. Когда вы соглашаетесь «больше не спрашивать» про конкретную команду, агент дописывает правило в файл настроек внутри папки .claude. Есть общий settings.json, который обычно коммитят вместе с проектом, и локальный settings.local.json для личных правил. Проблема в том, что правило описывает команду буквально, со всеми аргументами. Допустим, вы попросили агента сделать запрос через curl, а токен вставили прямо в заголовок.

Что известно по теме: почему это не мелочь?

Мы привыкли, что секреты утекают из .env, из конфигов облака, из захардкоженных строк в коде. Файлы настроек агента в эту картину не вписывались: их воспринимали как «личные предпочтения редактора», вроде темы оформления. Но там уже лежат исполняемые разрешения: что агенту можно запускать без вопросов. Значит, у файла две роли сразу: политика безопасности и потенциальное хранилище секретов. Ещё важнее другое.

Что известно по теме: что делать прямо сейчас?

Проверьте свои репозитории. Поищите по .claude/ строки, похожие на ключи, токены и пароли, в том числе в истории git. Удаления файла из последнего коммита недостаточно: история остаётся. Ротируйте всё, что нашли. Если токен хоть раз был в публичном репозитории, считайте его скомпрометированным. Закройте локальный файл. settings.local.json должен быть в .gitignore. Не надейтесь, что кто-то это уже сделал. Уберите секреты из самих команд.

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Практика · Hamidun Academy

Соберите рабочего ИИ-агента или сервис своими руками без ручного кода

В Академии Жемала Хамидуна (academy.hamidun.com) открыт бесплатный 72-часовой тест-драйв: интерактивные скетч-уроки по Claude Code и Cursor, живой Tech Radar и готовые шаблоны агентов.

Открыть 72ч бесплатный доступ →Интенсив по Вайб-кодингу
Что вы думаете?
Загружаем комментарии…