Разрешение на выполнение команды, призванное избавить разработчиков от нескольких запросов подтверждения, может заодно сохранить их пароли в файле проекта. Apiiro обнаружила 2 539 действующих секретов в 1 994 публичных репозиториях GitHub, содержащих копии файла настроек Claude Code, включая пароли баз данных, API-токены и ключи доступа к облачным сервисам с правами администратора.
Как разрешение превращается в сохранённый секрет
Claude Code может запоминать разрешение на выполнение команды. Когда разработчик выбирает «Да, и больше не спрашивать», агент сохраняет одобренную команду в файле настроек внутри папки проекта. Если команда содержит пароль или токен доступа, эти учётные данные сохраняются вместе с ней.
Удобство очевидно. Разработчик может одобрить команду один раз, вместо того чтобы снова и снова отвечать на один и тот же запрос разрешения. Риск возникает, когда файл настроек попадает в публичный репозиторий вместе с кодом.
Apiiro обнаружила 104 185 общедоступных копий этих файлов в 103 617 репозиториях GitHub. Из этих репозиториев 1 994 содержали действующие секреты. Эти результаты не означают, что Claude Code создал все раскрытые учётные данные или все коммиты, в которых они были опубликованы.
В 539 из 1 105 репозиториев, в которых исследователи нашли реальные секреты, Claude участвовал в создании коммита, содержавшего конфиденциальный файл. В опубликованных данных не объясняется, как эта группа из 1 105 репозиториев соотносится с более широкой выборкой из 1 994 репозиториев.
Большинство затронутых проектов принадлежали отдельным разработчикам, но Apiiro также выявила 63 затронутые организации, включая стартапы, компании-разработчики и крупных поставщиков программного обеспечения. Среди раскрытых учётных данных были административный ключ доступа к облаку, принадлежавший провайдеру баз данных, пароль от базы данных Azure PostgreSQL в продакшене, действующий токен Square и пароль владельца базы данных с медицинскими записями.
У правила игнорирования есть ограничения
При создании файла настроек Claude Code пытается исключить его из системы контроля версий, добавляя его в глобальный .gitignore разработчика. Этот файл указывает Git, какие файлы игнорировать, однако глобальное правило хранится в личной конфигурации разработчика, а не в .gitignore проекта.
Это различие важно, когда проект переносят между компьютерами или передают другим участникам. Глобальное правило не переносится вместе с репозиторием. Оно также не охватывает все описанные в отчёте сценарии, в том числе репозитории, созданные позднее внутри существующей папки, и файлы, которые разработчик уже добавил в репозиторий.
Борис Черни, руководящий разработкой Claude Code, сообщил, что Anthropic изучает способы предотвращения подобных утечек. По его словам, файл настроек не предназначен для публикации в системе контроля версий, а в выявленных случаях разработчики вручную создавали его и добавляли в репозитории.
Почему сканеры могут пропускать учётные данные
Сканер секретов может искать узнаваемые префиксы ключей сервисов или длинные строки, похожие на случайные последовательности символов. Учётные данные, встроенные в обычные на вид команды оболочки, не обязательно соответствуют таким шаблонам.
Apiiro сообщила, что такие инструменты, как Gitleaks и TruffleHog, могут пропускать пароли, переданные через PGPASSWORD=, sshpass -p или mysql -p. Токены, указанные в заголовках авторизации в командах curl, тоже могут остаться незамеченными. Поэтому сканирование без находок — полезный сигнал, но не гарантия того, что в репозитории нет раскрытых учётных данных.
Исследователи также обнаружили конфиденциальную информацию в других артефактах, связанных с ИИ-агентами, включая истории диалогов, файлы памяти, заметки для передачи контекста, заметки о развёртывании и настройки VS Code Copilot для автоматического разрешения команд. Подобные файлы обнаружились в репозиториях на Hugging Face и GitLab. Apiiro предупредила, что информация такого же рода может попадать в публикуемые пакеты, образы Docker и архивы проектов.
Что могут сделать разработчики
Apiiro рекомендует удалить правила разрешений, содержащие секреты в открытом виде, и немедленно заменить каждый скомпрометированный пароль или ключ. Одного удаления текущего файла недостаточно, поскольку его содержимое может сохраниться в истории Git, версиях и локальных копиях репозитория.
Компания также советует не указывать учётные данные непосредственно в командах. Вместо этого она рекомендует использовать переменные окружения, ссылающиеся на секреты, которые хранятся в специализированных менеджерах секретов.
Разработчикам следует считать папки с именами claude, cursor, gemini и specstory, а также файлы памяти ИИ-агентов потенциально конфиденциальными — так же, как файлы .env. Черни также рекомендовал использовать режим Auto вместо ручного управления списками разрешённых и запрещённых команд и включать сканирование секретов в GitHub независимо от того, какой ИИ-агент используется.
Главный вывод связан с файлом, который казался слишком обыденным, чтобы его проверять. Сохранённое разрешение может оказаться сохранённой командой, а сохранённая команда может содержать ключи доступа к базе данных в продакшене.