Если вы пользуетесь Claude Code или любым другим ИИ-агентом для кодинга, сначала потратьте десять минут на свои репозитории. Найдите закоммиченные файлы настроек агента, смените все хранящиеся в них учётные данные и включите secret scanning на GitHub. Украденные ключи перепродают быстро (Unit 42 описывает случай, когда это заняло минуты), поэтому проверки идут раньше самой истории.
Сначала прогоните эти проверки в своих репозиториях
Начните с файла, вокруг которого строится история с Claude Code: .claude/settings.local.json. Компания Apiiro, занимающаяся безопасностью, нашла 104 185 его копий в 103 617 публичных репозиториях, и в 1122 из них был хотя бы один секрет (The Hacker News). Вот как поискать свои.
- Найдите этот файл по имени в своей организации на GitHub (подставьте название своей организации; нужен GitHub CLI).
- Проверьте, коммитился ли файл когда-либо в каждом из ваших репозиториев, включая старые ветки. История хранит то, что удалил последний коммит.
- Просмотрите сохранённые подтверждения: нет ли там чего-то похожего на пароль, токен или строку подключения.
- Просканируйте всю историю и добавьте правило для паролей, набранных прямо в командах: стандартные наборы правил их обычно пропускают.
# 1. Find the files across an organization
gh search code --owner YOUR-ORG --filename settings.local.json
# The same search in the GitHub web search box
# org:YOUR-ORG path:.claude/settings.local.json
# 2. Was it ever committed, on any branch?
git log --all --oneline -- .claude/settings.local.json .claude/settings.json
# 3. List what you have approved with "don't ask again"
jq -r '.permissions.allow[]' .claude/settings.local.json
# 4. Grep the folder and its history for the usual suspects
grep -rEn 'PGPASSWORD=|sshpass -p|mysql -p|AKIA[0-9A-Z]{16}|ghp_[A-Za-z0-9]{20,}' .claude/
git log --all -p -- .claude | grep -E 'PGPASSWORD=|sshpass -p|mysql -p|AKIA[0-9A-Z]{16}'Это обычные вызовы git, jq и grep, но относитесь к их выводу как к наводке, а не к приговору. Поиск кода на GitHub видит только то, что лежит в ветке сейчас, поэтому и нужен шаг 2.
Для сканирования Apiiro использовала Gitleaks и TruffleHog. Запустите их по истории, а затем добавьте своё правило: стандартные правила ловят ключ, но не пароль, стоящий после флага.
gitleaks git --redact -v .
trufflehog git file://.# .gitleaks.toml
[extend]
useDefault = true
[[rules]]
id = "password-inside-command"
description = "Password passed on a command line"
regex = '''(PGPASSWORD=|sshpass -p |mysql -p)\S+'''Своё правило здесь оправдано. Apiiro прогнала оба инструмента по всем найденным файлам: gitleaks отметил 564 из 1122 файлов с секретами, TruffleHog — 643, а 215 не поймал ни один, в основном это пароли после PGPASSWORD=, sshpass -p или mysql -p (The Hacker News).
Apiiro также советует командам безопасности считать .claude/, .cursor/, .gemini/, .specstory/ и файлы памяти агентов хранилищами секретов, как .env. Мы бы запустили такой же поиск по каждому агенту, установленному у вашей команды: сохранённый транскрипт Cursor, GitHub Copilot или Codex тоже может содержать вставленный ключ.
Как один клик по подтверждению кладёт пароль в ваш репозиторий
Claude Code спрашивает разрешения перед запуском большинства shell-команд. Если выбрать «Yes, and don't ask again», он запишет правило allow в .claude/settings.local.json. По документации Anthropic, подтверждение Bash, данное таким образом, действует «постоянно для репозитория и команды» (документация Claude Code). Загвоздка в форме правила. Это может быть шаблон вроде npm test *, а может быть точная команда, и если в ней есть пароль, он теперь лежит в открытом виде.

Этот файл должен оставаться локальным. Согласно документации Anthropic по настройкам, когда Claude Code впервые записывает его в репозитории, где он ещё не игнорируется, он добавляет **/.claude/settings.local.json в ваш глобальный git excludes, а для файла, созданного вручную, нужна собственная строка в .gitignore (документация Claude Code). Это защищает один компьютер, но не свежий клон, не файл, созданный руками, и не файл, закоммиченный до появления правила игнорирования.
Больше трети найденных Apiiro секретов напрямую открывают доступ к базе данных, включая 379 паролей от баз. Среди остальных: 43 SSH-логина для публичных серверов, 42 токена для GitHub, GitLab и npm и 23 ключа AWS. Затронутые файлы принадлежали 63 организациям, а в половине репозиториев с секретом файл лежал там не меньше 217 дней. Apiiro не проверяла, работает ли что-то из этого до сих пор, хотя одна уведомлённая компания подтвердила, что её ключ был действующим.
Ответ Anthropic пока ограничился одним комментарием на Hacker News
Баг-репорт, поданный в 2025 году, автоматический бот закрыл как «not planned» после 60 дней без активности, а исследователи Apiiro говорят, что ни на один из связанных репортов, которые они приводят, Anthropic не ответила (The Hacker News). Публичный ответ появился на Hacker News от комментатора, представившегося как «Boris from the Claude Code team». Он написал, что «Historically Claude Code has not done secret scrubbing», что команда «looking into what we can do to prevent this», а в данном случае «the files were manually created and checked in». И добавил: «Permission rules are old hat. Everyone should be using auto mode instead».
Данные Apiiro плохо сочетаются с версией про ручное создание. В 539 из 1105 отслеженных репозиториев файл менял коммит, где Claude указан соавтором. Строка соавтора не доказывает, кто запускал git, но с файлами, созданными вручную это трудно увязать. Данные о коммитах кажутся нам убедительнее комментария, и пока Anthropic не скажет иного, мы бы считали, что Claude Code может закоммитить этот файл.
Grok Build протёк дважды, и по-разному
Две истории про Grok Build сейчас смешивают, а исправлять их нужно по-разному. (В материалах компанию называют SpaceXSI или SpaceXAI.)
Первая случилась в начале 2026 года. Исследователь, публикующийся под ником cereblab, проанализировал Grok Build 0.2.93 и сообщил, что он загружал в облачное хранилище целые отслеживаемые Git-репозитории вместе с историей коммитов, закоммиченными секретами и API-ключами (The Next Web). По этому анализу, загрузка была примерно в 27 800 раз больше, чем требовала задача, а переключатель приватности, по сообщениям, ничего не делал. xAI рекламировала инструмент заявлением «nothing from your codebase transmitted to xAI servers during a session». Илон Маск признал передачу данных и сказал, что прежние пользовательские данные будут удалены. TNW добавляет, что независимый аудит удаление не подтвердил.
Вторая история — та, что сейчас в новостях, и к репозиториям она отношения не имеет. Компания Claroc, занимающаяся безопасностью, обнаружила, что ссылки для шаринга в Grok Build могут найти люди, которым их никто не отправлял (Claroc). По данным Engadget, каждая ссылка использовала случайную фразу из четырёх слов с энтропией до 38 бит, размещённую «to the left of the domain» (Engadget). То есть она оказывается в имени хоста, а Claroc поясняет, что сервисы пассивного DNS собирают такие запросы. В расшаренных чатах ChatGPT и Gemini секрет лежит в пути URL, которого DNS не видит. «Nobody would guess one, — пишет Claroc, — and nobody needs to, because the dataset lists them».
В открытых приложениях лежали реальные данные. Claroc перечисляет карту торговых территорий с 594 стратегическими клиентами, восемь рекламных предложений для X, четыре живые панели рекламных аккаунтов, приложение для персонала больничной группы со списком более 3500 сотрудников и живую панель смен пожарной части с именем и номером жетона каждого пожарного. Из проверенных адресов 94,7% открывались без входа. По оценке Claroc, примерно в 2% приложений были данные, достаточно серьёзные для высокого или критического уровня.
Claroc сообщает, что SpaceXSI убрала 24 приложения, созданных её сотрудниками, «but not the apps of other Grok users and organizations». Engadget добавляет, что компания, по сообщениям, не реагировала, пока Claroc не отметила Маска и ещё одного представителя компании в X. В публикации Claroc сказано, что SpaceXSI ответила на вопросы журналиста, заявив, что приложения Grok приватны, пока их автор не решит поделиться, но на сам отчёт не ответила. Заявления о том, что остальные приложения уберут, мы не нашли.
Совет пользователям прямой. Считайте всё, что создано или расшарено через Grok Build, публичным, удалите ненужные ссылки и смените все учётные данные, которые касались расшаренного вами приложения. Строка в .gitignore тут не поможет.
Украденные ключи перепродают за считаные минуты
Команда Unit 42 из Palo Alto Networks описывает «token jacking»: украденные API-ключи ИИ перепродают через серые «transfer stations», которые продают доступ к топовым моделям со скидкой (Unit 42). Среди источников ключей названы открытые репозитории кода, инфостилеры и отравленные npm-пакеты. В одном случае злоумышленники за считаные минуты встроили утёкшие учётные данные в transfer station, и до обнаружения набежало «nearly a million dollars in charges». По словам Unit 42, у жертв «very little recourse to recover funds». Защита скучная: лимиты расходов с оповещениями, краткосрочные токены вместо долгоживущих ключей и ревизия всех привилегированных аккаунтов, которые могут менять лимиты.
Устраняем утечку: игнорировать, убрать из индекса, сменить ключи
Сначала смените ключи, потом наводите порядок. Отозванный ключ бесполезен во всех форках и кэшированных копиях, а ключ, который вы просто удалили из последнего коммита, по-прежнему действует в истории. GitHub советует немедленно менять утёкшие учётные данные и называет чистку истории «time-intensive and often unnecessary if you've already revoked the credential» (документация GitHub).
# Rotate the exposed credentials first (table below), then:
# Stop tracking the local file (keeps your copy on disk)
git rm --cached .claude/settings.local.json
# Add to the repo's OWN .gitignore, not just your global excludes
printf '%s\n' '.claude/settings.local.json' '.specstory/' >> .gitignore
git add .gitignore
git commit -m "Stop tracking agent local settings"
# Drop any allow rule that looks like it holds a secret, even if never committed
jq '.permissions.allow |= map(select(test("PGPASSWORD|password|token|secret|key"; "i") | not))' \
.claude/settings.local.json > .claude/settings.local.json.new \
&& mv .claude/settings.local.json.new .claude/settings.local.jsonПодумайте, прежде чем игнорировать .cursor/ или .gemini/ целиком: некоторые команды намеренно коммитят туда общие правила.
Как сменить ключи у крупных провайдеров
У каждого провайдера для этого есть кнопка в консоли, а безопасный порядок такой: создайте замену, раскатайте её, затем убейте старый ключ. Если удалить сначала, можно положить прод.
| Провайдер | Как сменить ключ | Примечания |
|---|---|---|
| AWS | Создайте второй IAM access key, обновите приложения, проверьте last-used, деактивируйте старый ключ, затем удалите его | aws iam create-access-key, get-access-key-last-used, update-access-key --status Inactive, delete-access-key (документация AWS) |
| GitHub | Удалите токен и создайте новый со сроком действия | GitHub автоматически отзывает токены, отправленные в публичный репозиторий или gist; при утечке в другом месте можно отправить запрос на отзыв через REST API (документация GitHub) |
| Stripe | Выполните roll ключа в Dashboard и в дальнейшем используйте restricted keys | Меняйте, даже если не уверены, что кто-то его видел; Stripe может деактивировать обнаруженный ключ (документация Stripe) |
| OpenAI | Создайте замену, обновите приложения, отзовите старый ключ, когда новый заработает | Задайте срок действия ключам проекта и используйте для приложений сервисный аккаунт проекта (документация OpenAI) |
Для провайдеров, которых нет в таблице, включая Anthropic и xAI, мы шаги по смене ключей не проверяли, так что следуйте их документации. Для паролей от баз данных и SSH-логинов, которые составляют основную часть находок Apiiro, смените пароль, завершите открытые сессии и проверьте логи доступа начиная со дня первого коммита файла.
Включите сканеры GitHub и узнайте их ограничения
Secret scanning проверяет всю историю каждой ветки, а также issues, pull requests, discussions и wiki. В публичных репозиториях он бесплатный и работает автоматически; для приватных и внутренних репозиториев в организации нужен GitHub Secret Protection (документация GitHub). Когда обнаруживается формат ключа партнёра, GitHub уведомляет этого провайдера, и тот может отозвать ключ без всякого оповещения в вашем репозитории.
Push protection — тот слой, который остановил бы многие из этих файлов до публикации. Он блокирует push с обнаруженным секретом. Согласно документации GitHub, пользовательская настройка по умолчанию включена для push в публичные репозитории на GitHub.com, а настройка на уровне репозитория по умолчанию выключена, и включить её может админ репозитория, владелец организации или security manager (документация GitHub). Она проверяет шаблоны провайдеров, общие шаблоны вроде приватных ключей и строк подключения, ваши собственные шаблоны, а также категорию на основе ИИ для неструктурированных секретов вроде паролей (в публичном превью). Эта последняя категория, похоже, нацелена на брешь, найденную Apiiro. Push через REST API её не получают; push из командной строки, коммиты через веб-интерфейс и загрузка файлов получают.
Знайте и про лазейку. По умолчанию любой с правом записи может обойти блокировку, выбрав причину, в том числе «I'll fix it later», после чего создаётся алерт и владельцам уходит письмо. Если ваши агенты коммитят от вашего имени, настройте delegated bypass, чтобы пропускать секрет могли только назначенные люди.
Настройки разрешений агента, которые стоит изменить сегодня
Три привычки уберегли бы пароль от попадания в файл. Подтверждайте шаблоны, а не буквальные команды с учётными данными. Храните секреты в переменных окружения, чтобы в команде было имя, а не значение. И с самого начала запретите агенту доступ к файлам, где лежат секреты. Как это выглядит, показывает документация Anthropic по настройкам:
{
"permissions": {
"allow": [
"Bash(npm run lint)",
"Bash(npm run test *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)"
]
}
}Команда, которую должен запускать ваш агент, выглядит как psql "$DATABASE_URL", так что правило подтверждения хранит только имя переменной. Загружайте переменную из менеджера секретов или профиля shell, а не из файла, который агент может прочитать.
Две детали из документации важны для команд: правила allow в закоммиченном .claude/settings.json ждут, пока каждый участник не доверит папку, а правила deny и ask применяются сразу, и режимы auto и bypassPermissions не вступают в силу из настроек проекта или локальных настроек. Организации могут зафиксировать правила allow через allowManagedPermissionRulesOnly. Упомянутый выше сотрудник команды Claude Code говорит, что режим auto делает правила разрешений ненужными. Мы всё равно оставили бы deny-правила для .env: две строки, которые действуют с момента коммита файла.
В других инструментах названия настроек отличаются, но вопрос тот же: где инструмент хранит подтверждения, историю или транскрипты и находится ли это место внутри репозитория? По документации, Apiiro обнаружила, что Claude Code — единственный из 16 сравниваемых агентов для кодинга, который, как подтверждено, по умолчанию сохраняет полную подтверждённую команду в файле проекта. Остальные пятнадцать всё равно могут протечь через транскрипты, вставленные ключи и файлы памяти. Что хранит каждый из них, разбирают наше сравнение терминальных агентов для кодинга и материал Cursor vs Copilot vs Windsurf.
Самая надёжная защита не зависит от промпта. Запускайте агентов в контейнере или песочнице только с теми учётными данными, которые нужны для задачи, с ограниченными правами и коротким сроком жизни. Механику мы описали в материале How to Contain an AI Agent.
Ротация на пользователе, настройки по умолчанию на вендоре
Вписать пароль в команду — ошибка пользователя, и ротация лежит на нём. Но инструмент, который сохраняет полную команду в файле проекта, а затем полагается на исключение в вашей домашней папке, чтобы она осталась приватной, даёт защиту, которая работает только на одном ноутбуке.

Настройки по умолчанию — это политика, и здесь именно они решили исход. Claude Code, который чистил бы секреты перед сохранением правила или записывал строку игнорирования в собственный .gitignore репозитория, закрыл бы дыру у источника. Anthropic говорит, что изучает вопрос (мы бы хотели увидеть дату). Баг-репорт, закрытый ботом по неактивности, не внушает доверия, а данные о коммитах не сходятся с версией «создано вручную».
Grok Build в истории со ссылками — худший случай, потому что пользователь ничего не сделал неправильно. Ссылка, которую может найти любой через пассивный DNS, не приватна, что бы ни подразумевало меню шаринга. А прежняя загрузка противоречила маркетинговой фразе, утверждавшей обратное. Мы бы не стали помещать в Grok Build список клиентов, карту торговых территорий или боевые учётные данные, пока не исправят проблему со ссылками и внешний аудит не подтвердит удаление. Если ситуация изменится, изменится и наша позиция.
Относитесь к папкам агентов как к файлам .env и выделите один вечер на описанную настройку. Сами инструменты можно сравнить в нашем рейтинге ИИ-ассистентов для кодинга, а сторону безопасности экосистемы — в рейтинге инструментов ИИ для кибербезопасности.
Чек-лист для всей команды
Отметьте то, что верно уже сегодня, и итог покажет, с чего начать. Пункты за два балла мы бы сделали до обеда.
Часто задаваемые вопросы
Можно ли коммитить .claude/settings.local.json?
Нет. В нём лежат ваши личные подтверждения, и он может содержать учётные данные. По документации Anthropic, Claude Code при создании файла убирает его из git через глобальный exclude, а для файла, созданного вручную, нужна ваша собственная строка игнорирования. Добавьте файл в .gitignore каждого репозитория и уберите из индекса через git rm --cached, если он когда-либо коммитился.
Нужно ли менять ключи, если репозиторий приватный?
Да, если в файле когда-либо были учётные данные. Приватные репозитории клонируют на ноутбуки и CI-раннеры, форкают в чужие аккаунты, а иногда и открывают для всех. Secret scanning на GitHub для приватных репозиториев организаций требует платного плана, так что автоматической проверки у вас могло и не быть.
Удалит ли секрет удаление файла из репозитория?
Он исчезнет только из последнего коммита, и всё. История, форки и кэши хранят старую версию, а Apiiro нашла 734 секрета, которые встречаются только в старых версиях файла. Сначала смените ключ, а историю переписывайте, только если хотите аккуратный репозиторий.
У GitHub Copilot, Cursor и Codex та же проблема?
Apiiro подтвердила такое поведение, то есть сохранение полной подтверждённой команды в файле проекта по умолчанию, только для Claude Code из 16 сравниваемых агентов. Это не снимает вопросов к остальным. Любому агенту, который пишет транскрипты или память в вашу рабочую папку, нужны те же правила игнорирования.