Tech Threat Lab
TTL

Apiiro обнаружила тысячи секретов в настройках Claude Code на GitHub

Apiiro обнаружила тысячи секретов в настройках Claude Code на GitHub

Исследователи Apiiro обнаружили в общедоступных репозиториях GitHub 1 122 копии файла настроек Claude Code, содержащие как минимум один пароль, токен или ключ. В выборку вошли 104 185 копий .claude/settings.local.json из 103 617 репозиториев: секреты нашлись примерно в 1,1% файлов.

Исследователи не устанавливали, остаются ли все найденные учётные данные действительными. Одна из организаций, уведомлённых в начале недели, подтвердила работоспособность своего ключа. Доказательств использования найденных секретов третьими лицами в исследовании не приводится.

Как секреты попадают в настройки

Claude Code обычно запрашивает разрешение на выполнение команд оболочки. Если выбрать вариант «Да, и больше не спрашивать», инструмент создаёт правило, позволяющее запускать одобренную команду в следующих сессиях без нового запроса.

Правило может содержать шаблон, например npm test *, или конкретную командную строку. Во втором случае Claude Code сохраняет команду целиком. Если разработчик передал в ней пароль, API-ключ либо токен, это значение записывается в .claude/settings.local.json в открытом виде.

Apiiro нашла в публичных файлах сохранённые команды с такими данными и воспроизвела это поведение в актуальных моделях Opus 5.5 и Fable 5.1. Claude Code пытается не допустить попадания локального файла в репозиторий: при первом создании .claude/settings.local.json в git-репозитории файл добавляется в глобальный список исключений git пользователя.

Однако эта настройка действует только для конкретного пользователя и компьютера. Она не защитит проект, если файл уже закоммичен, и не создаёт правила в .gitignore самого репозитория. В 539 из 1 105 изученных репозиториев файл менялся в коммите, где Claude был указан соавтором. По оценке исследователей, это может указывать, что Claude Code нередко сам включает файл в коммит.

Что нашли в GitHub

В 1 122 публичных копиях .claude/settings.local.json выявили 1 379 различных секретов. Значение относили к секретам, если оно соответствовало известному формату ключа либо если пароль или токен находился рядом с адресом публичного сервера; затем вывод должен был подтвердить ИИ-рецензент.

Более трети значений дают прямой доступ к базам данных. В числе находок:

  • 379 паролей к базам данных;
  • 43 SSH-учётные данные для публичных серверов;
  • 42 токена GitHub, GitLab и npm;
  • 23 ключа AWS.

Файлы принадлежали 63 организациям, преимущественно разработчикам ПО разных масштабов. К наиболее серьёзным примерам Apiiro отнесла облачный ключ с правами администратора у поставщика СУБД и пароль владельца базы данных с медицинскими записями.

По состоянию на понедельник все файлы с секретами оставались в ветке по умолчанию соответствующих репозиториев. В половине случаев они находились там не менее 217 дней. Удаление файла из актуальной версии проекта само по себе не устраняет утечку: в истории git 509 репозиториев сохранились старые версии ещё с 734 секретами, отсутствующими в текущих файлах, обычно из-за удаления самого файла. Ещё 211 форков 74 репозиториев содержали те же секреты, что и исходные проекты.

Секреты были и в общем файле .claude/settings.json, который команды обычно коммитят намеренно для хранения правил разрешений: их нашли в 298 из 76 011 копий. С учётом этих данных, прежних версий файлов и сохранённых журналов чатов агентов исследователи оценили общий объём утечек в 2 539 секретов из 1 994 репозиториев.

При выборе SIEM-платформы можно отдельно изучить Security Capsule SIEM и сопоставить её с требованиями своей инфраструктуры.

Telegram · TTL NewsПродолжайте следить за темой в Telegram

Новости информационной безопасности, технологий и государственного регулирования, а также анонсы новых исследований Tech Threat Lab.

Подписаться на TTL News

Apiiro также сравнила документацию 16 ИИ-агентов для разработки. По результатам этого сравнения, Claude Code — единственный продукт, для которого подтверждено сохранение полной одобренной команды в файле проекта по умолчанию.

Почему сканеры видят не всё

Исследователи проверили все 1 122 файла с выявленными секретами с помощью gitleaks и TruffleHog, минуя этап верификации самих инструментов. Gitleaks нашёл секреты в 564 файлах, TruffleHog — в 643, а оба сканера одновременно пропустили 215 файлов.

Проблема не ограничивается GitHub. .claude/settings.local.json — обычный JSON-файл в каталоге проекта, поэтому он может попасть в npm-пакет, Docker-образ, ZIP-архив или синхронизируемую папку. Исследователи также отмечают, что вредоносное ПО уже искало секреты на рабочих станциях разработчиков: в сентябре 2025 года червь Shai-Hulud запускал на заражённых системах сканер TruffleHog, который пометил как содержащие секреты более половины файлов.

Что проверить разработчикам и ИБ-командам

Организациям, использующим Claude Code, исследователи рекомендуют искать .claude/settings.local.json и .claude/settings.json во всех репозиториях GitHub организации и отдельно проверять историю git. Проверка нужна и для файлов, удалённых из актуальной ветки.

До очистки необходимо заменить все пароли, токены и ключи, которые когда-либо находились в этих файлах. Только после ротации следует прекратить отслеживание локального файла командой git rm --cached .claude/settings.local.json и добавить его в .gitignore репозитория.

Проверить нужно и локальные копии, даже если они никогда не попадали в git: из правил следует удалить команды с секретными значениями. Вместо передачи учётных данных в командной строке исследователи предлагают использовать переменные, получаемые из менеджера секретов, например $DB_URL. В сохранённом правиле в таком случае останется имя переменной, а не значение. Вместо одобрения единичных команд также рекомендуется разрешать шаблоны, например Bash(npm run:*).

Для ИБ-команд каталоги ИИ-агентов — .claude/, .cursor/, .gemini/, .specstory/ — и файлы памяти агентов следует рассматривать как потенциальные носители секретов наравне с .env. Это относится и к рабочим станциям, и к репозиториям.

Такие пути стоит включить в pre-commit-проверки и сканирование в CI, причём с анализом истории git. Сканер должен распознавать пароли внутри команд, а не ограничиваться известными форматами ключей. .claude/settings.local.json также рекомендовано добавить в корпоративные шаблоны .gitignore. В первую очередь следует проверять учётные данные, связанные с публично доступными серверами: именно они могут обеспечить прямой доступ извне.

О проблеме сообщали с 2025 года

Пользователи Claude Code сообщали о таком поведении ранее. В отчёте об ошибке от 11 августа 2025 года указывалось, что одобренные команды с API-ключами и токенами сохраняются в settings.local.json дословно.

3 января, после 60 дней без активности, автоматический бот закрыл этот отчёт со статусом «не запланировано». По данным Apiiro, все четыре связанных отчёта были закрыты тем же ботом, последний — вчера. Как утверждается в исследовании, Anthropic не ответила на эти обращения.

Практический вывод: настройки и файлы памяти ИИ-агентов нужно включить в инвентаризацию секретов и правила контроля исходного кода. Если .claude/settings.local.json или .claude/settings.json уже публиковались, приоритетная мера — ротация всех когда-либо записанных в них учётных данных, а не только удаление файлов из текущей версии репозитория.

Security Capsule SIEM · Этап 0

Риски выявлены. Проверьте обнаружение угроз

Проверьте на своей инфраструктуре сбор событий, корреляцию и расследование подозрительной активности.

Этапы тест-драйваСостав проверки и критерии пилота согласуем заранее.