Файл .claude/settings.local.json в Claude Code задуман как хранилище локальных разрешений на команды, а на практике превратился в свалку учётных данных. Компания GitGuardian, специализирующаяся на безопасности кода, обнаружила в таких файлах 31 088 уникальных секретов — они лежали в 23 276 публичных репозиториях GitHub. На момент обнаружения 5343 учётных данных оставались рабочими.
Среди утёкшего — строки подключения к базам данных, токены облачных провайдеров, пароли SSH, ключи Google API и учётные данные сервисов AU. Отдельно GitGuardian проверила публичные образы Docker Hub: там нашлось 613 уникальных секретов в настройках Claude Code, из них 99 были действительны.
Как разрешение на команду становится хранилищем паролей
Claude Code спрашивает разрешение перед выполнением некоторых shell-команд. Если разработчик выбирает вариант «Yes, and don't ask again», инструмент сохраняет правило в .claude/settings.local.json — конфигурационный файл уровня проекта. Проблема в том, что сохранённое правило содержит саму строку команды целиком, вместе со всеми вписанными в неё учётными данными.
Простой пример: разработчик просит Claude Code обратиться к API и подтверждает curl-команду, в HTTP-заголовке которой лежит API-ключ. Claude Code записывает всю команду как одобренное правило — и ключ остаётся в конфигурационном файле.
Claude Code автоматически добавляет этот файл в локальные настройки Git ignore, но эта защита не обязательно переносится на другие машины и репозитории, пояснил исследователь GitGuardian Гийом Валадон. Файл может случайно попасть в коммит — особенно при работе с несколькими клонами репозитория или если файл уже был под контролем версий.
Что именно утекает
Из тех случаев в settings.local.json, для которых GitGuardian смогла установить действительность, 67% оказались рабочими учётными данными. Самая крупная категория — идентификаторы баз данных: 2280 уникальных секретов. Следом идут токены облачных провайдеров и токены AI-сервисов.
Обычные сканеры секретов пропускают значительную часть таких утечек. Пароли внутри аргументов командной строки и присваиваний переменных окружения часто не имеют узнаваемого формата, под который настроены правила обнаружения конкретных провайдеров.
Динамика по месяцам: пик утечек в settings.local.json пришёлся на апрель 2026 года — 12 535 случаев, к октябрю их стало 959. «Мы пока не знаем, что изменилось», — отметил Валадон.
Docker Hub: .gitignore здесь не работает
Секреты из настроек Claude Code нашлись в 543 репозиториях образов и 7625 тегах на Docker Hub. Причина — инструкция COPY . ., которой разработчики копируют в образ весь рабочий каталог проекта. В отличие от Git, Docker не учитывает .gitignore автоматически. Файл конфигурации Claude Code, исключённый из системы контроля версий, всё равно попадёт в образ, если его явно не исключить через .dockerignore.
Масштаб повторов показателен: один действующий API-токен Cloudflare встретился в 559 тегах образов, а пароль от базы данных — в 643 тегах в семи репозиториях образов.
Удаление файла из репозитория GitHub уже не помогает: учётные данные разошлись по опубликованным образам. Нужно менять сами секреты, убирать чувствительные конфигурационные файлы из контекста сборки и Git, а также проверять ранее опубликованные образы на остатки секретов.
Что делать администратору
GitGuardian рекомендует относиться к конфигурационным файлам AI-ассистентов для кодинга как к потенциальным носителям секретов: сканировать их наравне с обычными файлами окружения и использовать переменные окружения вместо жёстко вписанных в команды учётных данных.
Практический порядок действий для команды:
- Проверить, есть ли в рабочих клонах и в истории Git файлы
.claude/settings.local.jsonс командами, содержащими ключи и пароли. - Добавить
.claude/settings.local.jsonв.gitignoreи в.dockerignore— обе записи нужны, потому что Docker не читает.gitignore. - Считать скомпрометированными все секреты, которые попадали в такие файлы, и провести ротацию.
- Проверить опубликованные образы Docker Hub на наличие файла настроек.
- Передавать учётные данные через переменные окружения, а не через аргументы команд.
Близкий по механике случай уже разбирался на spbcomputers.ru: файл «Don't Ask Again» в Claude Code хранит пароли и ключи в открытом виде. А для тех, кто держит AI-агентов в изолированных окружениях, полезен разбор побега агента Claude Cowork из виртуальной машины: границы песочницы не спасают, если секрет лежит в конфиге рядом.
Реакция Anthropic
CSO обратилась к Anthropic за комментарием и не получила оперативного ответа. GitGuardian сообщила, что руководитель Claude Code Борис Черный признал проблему: компания разбирается и изучает дополнительные меры защиты, включая встроенное сканирование секретов и автоматический режим.
Частые вопросы
Кого касается эта история?
Всех, кто пользуется Claude Code и хоть раз нажимал «Yes, and don't ask again» на команде с ключом или паролем внутри. Особенно — команд, работающих с несколькими клонами репозитория или публикующих образы на Docker Hub.
Чем именно опасен файл .claude/settings.local.json?
В нём сохраняются одобренные строки команд целиком, включая вписанные в них учётные данные. Файл лежит в рабочем каталоге проекта и может попасть в Git или в образ контейнера.
Разве Claude Code не добавляет файл в .gitignore автоматически?
Добавляет, но только в локальные настройки Git ignore. На другие машины и клоны это не переносится, а если файл уже отслеживался, автоматическая запись не поможет.
Почему обычный сканер секретов не находит такие утечки?
Пароли в аргументах команд и присваиваниях переменных окружения не имеют узнаваемого формата, под который настроены правила обнаружения конкретных провайдеров. Значительная часть утечек остаётся незамеченной.
Почему секреты оказались на Docker Hub, если файл исключён из Git?
Docker не учитывает .gitignore. Инструкция COPY . . копирует в образ весь рабочий каталог, включая файл настроек, если его не исключить явно через .dockerignore.
Достаточно ли удалить файл из репозитория?
Нет. Учётные данные уже разошлись по опубликованным образам. Нужно провести ротацию секретов и проверить ранее опубликованные образы.
Что делать, если обновиться некуда или политика запрещает менять настройки?
Не подтверждать команды с секретами через «не спрашивать снова». Передавать ключи через переменные окружения, а сам файл держать вне контекста сборки — в .gitignore и .dockerignore.
Есть ли уже исправление от Anthropic?
На момент публикации конкретного исправления не было. Anthropic подтвердила, что изучает дополнительные меры, включая встроенное сканирование секретов и автоматический режим.
Насколько массова проблема?
GitGuardian насчитала 31 088 уникальных секретов в 23 276 публичных репозиториях GitHub; 5343 из них были действительны на момент обнаружения. На Docker Hub — 613 секретов, 99 действительных.
Источник: csoonline.com