秘密情報入りのClaude Code設定ファイル、公開GitHubに1,122件 Apiiro調査

秘密情報入りのClaude Code設定ファイル、公開GitHubに1,122件 Apiiro調査 ITニュース

Claude Code の許可確認で「Yes, and don’t ask again」を選ぶと、承認したコマンドが設定ファイルに保存され、コマンドに含めたパスワードなどの秘密情報もそのまま残る——Apiiro がこう報告し、公開 GitHub 上の .claude/settings.local.json のうち 1,122 ファイルに実在の秘密情報(キーの形式や接続先から判定したもので、有効かどうかは確かめていない)があったとしています。Apiiro の記事は 11 月上旬に公開され、11 月 8 日に追記されました。

これに対し、Anthropic の Claude Code チームの Boris Cherny 氏(Apiiro は Claude Code の責任者と紹介)が、2026 年 11 月 7 日(日本時間 8 日朝)に Hacker News のコメントで、防ぐために何ができるかを検討していると答えています。Claude Code を使う開発者は、自分のリポジトリと PC のファイルを一度見ておきたい話です。

結論を先に書くと、やっておきたいことは次の 3 つです。

  • 自分の GitHub で .claude/settings.local.json と .claude/settings.json を探し、削除済みでも git の履歴を確かめる
  • 見つかったら、まずそのファイルが持っていた資格情報をすべて変更(ローテーション)し、片付けはその後にする
  • コマンドに秘密情報を直接打たず、使っているシークレット管理の仕組みから $VAR の形で参照する

何が起きた?「don’t ask again」で秘密情報が残る仕組み

公式ドキュメント(Claude Code Docs: Settings、Permissions)によると、Bash コマンドの許可確認で「Yes, and don’t ask again」を選ぶと、その承認は allow ルールとして .claude/settings.local.json に保存されます。git リポジトリの中では、リポジトリのルートにあるこのファイルが使われます(git リポジトリの外や Windows など、一部の場合は別の場所に保存されます)。

Apiiro の調査によると、保存されるルールは承認したコマンドの文字列そのものです。たとえば PGPASSWORD= の後ろにパスワードを書いたコマンドを承認すると、パスワードごとファイルに残ります。Apiiro は、これはモデルではなく Claude Code 自体の動作で、Opus 5.5 と Fable 5.1 でも再現したとしています。

たとえるなら、レシピのメモに金庫の暗証番号まで書き写して、そのノートをみんなで回し読みするようなもの。メモ自体は便利でも、書いた中身が問題になります。

公開 GitHub で見つかった秘密情報の数(Apiiro 調査)

Apiiro は 2026 年 11 月 1〜3 日に、読み取り専用の GitHub のコード・コミット検索でデータを集めました。主な数字は次のとおりです。

項目 Apiiro の数字
公開 GitHub 上の .claude/settings.local.json 104,185 件(103,617 リポジトリ)
うち実在の秘密情報を含むファイル 1,122 件(1.1%)
異なる秘密情報の数 1,379 件(プロバイダー形式のキー 636、公開ホスト向けのパスワード/トークン 743)
内訳の一部 データベースのパスワード 379、Supabase の service-role キー 122、Supabase アカウントトークン 103、公開サーバーへの SSH ログイン 43、GitHub・GitLab・npm のトークン 42、AWS キー 23、秘密鍵 6
履歴・共有用 settings.json・会話記録まで含めた数 異なる実在の秘密情報 2,539 件・1,994 リポジトリ

ここでいう「実在の秘密情報」は、有効だと確かめたものではなく、既知のキーの形式に一致するか、公開ホストを指しているものです。Apiiro は資格情報を使ったりテストしたりはしていません。ただし、通知を受けた 1 組織は、キーが有効だったと確認したそうです。秘密情報の大半は個人の開発者のもので、影響を受けた組織は 63 だとしています。

ほかにも、次のような数字が出ています。

  • 消しても残る: ファイルの過去の版には、今のどのコピーにも無い秘密情報が 734 件(509 リポジトリ)。フォーク 211 件(74 リポジトリ)にも同じ秘密情報が残っていた
  • スキャナーの見逃し: Apiiro が 2 つのシークレットスキャナーを使ったところ、秘密情報を含む 1,122 ファイルのうち、一方のスキャナーが検出したのは 564、TruffleHog は 643、どちらも検出しなかったのが 215。Apiiro は、見逃しの多くは PGPASSWORD=、sshpass -p、mysql -p の後ろなど、コマンドの中のパスワードだとしています
  • Claude 自身のコミット: 秘密情報があったと追跡した 1,105 リポジトリのうち 539 件では、Claude を共同著者とするコミットがこのファイルを変更していた

なぜ git に入ったのか、双方の主張

ここは Apiiro と Anthropic 側で説明が分かれています。

立場 主張
公式ドキュメント Claude Code は、まだ除外されていない git リポジトリでこのファイルを初めて書くとき、どの階層の .claude/settings.local.json にも当てはまる除外の行を、ユーザーのグローバルな git 除外ファイルに追加する。手で作った場合は、自分で .gitignore に追加するよう書かれている
Apiiro グローバルな除外は一般的なケースはカバーするが、後から git リポジトリになったフォルダ、別の PC での clone、すでにコミット済みのファイルはカバーしない。リポジトリ自身の .gitignore には追加されない
Cherny 氏 settings.local.json はローカルに置くファイルで、ソース管理に入れるものではない。Claude が作るときは自動で gitignore するので、今回のファイルは手で作られてコミットされたものだ、という見方

どちらの説明が今回の 1,122 ファイルに当てはまるのかは、双方の主張として受け止めておくのがよさそうです。どちらの場合でも、公開リポジトリにコミットされたファイルは誰でも読めるので、自分のリポジトリを確かめる価値は変わりません。

なお Apiiro によると、この仕組みは 2025 年 8 月から GitHub の issue(#5544 など 4 件)で報告されていましたが、Anthropic からの返信はなく、3 件は inactive または duplicate として自動でクローズされたとしています。

Anthropic 側の対応と、秘密情報スキャンの勧め

Cherny 氏は Hacker News のコメントで、これまで Claude Code は秘密情報の除去(secret scrubbing)をしてこなかったが、防ぐために何ができるかを検討していると述べました。あわせて、許可ルールより auto mode を使うほうが安全だとして auto mode を勧め、どのエージェントを使う場合でも、GitHub などが提供するシークレットスキャンを有効にしておくべきだとしています。

続くコメントでは、auto mode でこれを検出できるようにする、基本的なシークレットスキャンを組み込む、といった案を挙げ、何かを出荷する前にいくつか試作してトレードオフを確かめると述べています。修正版の提供時期やバージョンは公表されていません。

Apiiro の調査は、Hacker News にも投稿されています。

秘密情報を守るためにやっておきたいこと

Apiiro が勧める確認手順は次の 3 つです。

  1. 公開されていないか: GitHub の組織で .claude/settings.local.json と .claude/settings.json を検索する
  2. 一度でもコミットしたか: 今は消えていても、各リポジトリの git 履歴にこのファイルがないか確かめる
  3. 中身は何か: 自分の PC にあるこのファイルの allow リストを読み、パスワード・トークン・キー・接続文字列がないか見る

見つかったら、Apiiro の言葉どおり「まずローテーション、片付けは後」です。ファイルを消しても、履歴やフォーク、clone には残るためです。

開発者向けには、次の 5 つが挙げられています。

やること 内容
追跡を外す リポジトリで追跡されていれば、下のコマンドで外し、リポジトリ自身の .gitignore に追加する
資格情報を変える ファイルが一度でも持っていた資格情報を、すべてローテーションする
ルールを消す コミットしていなくても、ファイルを開いて秘密情報を含むルールを削除する
直接打たない コマンドに秘密情報を直接書かず、$VAR の形で参照する
パターンで承認 個別のコマンドではなく、Bash(npm run:*) のようなパターンで承認する

追跡を外すコマンドは次のとおりです。

git rm --cached .claude/settings.local.json

このコマンドは git の追跡を外すだけで、過去のコミットに残った秘密情報は消えません。先に資格情報を変えておくのが順番です。ほかの技術の話は、技術ネタの記事一覧からどうぞ。

まとめ

  • Apiiro によると、「Yes, and don’t ask again」で承認したコマンドは文字列のまま .claude/settings.local.json に保存され、コマンド内の秘密情報も残る
  • 公開 GitHub 上では 104,185 件のうち 1,122 件に、Apiiro のいう実在の秘密情報(有効性は確かめていない)があった
  • git に入った理由は、Apiiro(グローバル除外がカバーしないケースがある)と Cherny 氏(手で作られてコミットされたものという見方)で主張が分かれている
  • Anthropic 側は防止策を検討中で、修正版の時期・バージョンは公表されていない
  • まずは自分のリポジトリと PC のファイルを確かめ、見つかったら資格情報の変更を先に

2026 年 11 月 9 日時点の情報です。

参考:

ITもごはんも、腹八分目が長続きのコツ!

コメント