TITLE

Claude Codeの『今後確認しない』が平文パスワードを公開リポジトリに残す ― Apiiro調査で見た許可ルールの罠

投稿日:2026.11.09

CATEGORY

  • AI開発
Claude Codeの『今後確認しない』が平文パスワードを公開リポジトリに残す ― Apiiro調査で見た許可ルールの罠

Claude Codeの承認ダイアログで「Yes, and don't ask again(今後確認しない)」を選ぶと、そのとき承認したコマンドがそのまま許可ルールとして .claude/settings.local.json に保存されます。セキュリティ企業Apiiroの調査によると、このコマンドの中に平文のパスワードやトークンを書いたまま承認していたケースが多数あり、2026年11月1日から3日の調査期間で、公開GitHubリポジトリ上にこの設定ファイルの公開コピーが104,185件(約103,617リポジトリ)見つかりました。そのうち少なくとも1件の実際の秘密情報を含んでいたファイルは1,122件、全体の約1.1%です。調査結果は2026年11月7日前後に公表されました。

1.1%という割合は小さく見えますが、1,122件のファイルから見つかった重複を除いた秘密情報は1,379件に上ります。データベースのパスワードが379件、SSHのログイン情報が43件、GitHub・GitLab・npmのトークンが42件、AWSキーが23件という内訳です。Git履歴やフォーク、共有用の設定ファイル、保存されたエージェントのチャット記録まで調査範囲を広げると、合計2,539件の秘密情報が1,994リポジトリ・63組織に見つかっています。

「今後確認しない」が保存しているのは、コマンドそのもの

何が起きているかを理解するには、Claude Codeの承認機能がどう動いているかを知る必要があります。Claude Codeは、ファイルの削除やコマンドの実行など、一定の操作を行う前にユーザーへ確認を求めます。このとき「今後確認しない」を選ぶと、Claude Codeはそのコマンドを一般化せず、実行した文字列そのものを許可ルールとして .claude/settings.local.json に書き込みます。

この保存方式そのものは便利さのためのものです。npm test * のように汎用的なパターンであれば、再利用してもリスクは小さいです。問題は、コマンドの中に PGPASSWORD=xxxx や mysql -p xxxx、sshpass -p xxxx のような形で認証情報を直接書き込んでいた場合です。許可ルールはコマンドを丸ごと覚えるので、パスワードやトークンも一緒に平文で残ります。

概念図(L1ライトフラット・HTML2PNG): 「今後確認しない」が承認したコマンドを許可ルールとして丸ごと保存し、pushすると公開リポジトリにそのまま残る3段階の流れを示す図。STEP1承認(PGPASSWORD=xxxx psqlのようなコマンド実行)、STEP2保存(.claude/settings.local.jsonにコマンドそのものが許可ルールとして記録)、STEP3公開(git push origin mainで設定ファイルごと公開され、104,185件が確認された)。

このファイルはローカル専用の設定という位置づけで、Anthropicの公式ドキュメントによれば、Claude Codeは初回書き込み時にユーザーのグローバルな git exclude設定へこのファイルを自動で追加します。ただしこれはそのマシンのローカル設定にしか効かず、プロジェクトの .gitignore 自体を書き換えるものではありません。すでにコミットされてしまったファイルにも効果はありません。この3つのすり抜け方(別マシン・プロジェクトの.gitignore未設定・コミット済み)は、どれか1つに当てはまるだけでグローバルな除外設定が機能しなくなる条件です。10万件超という数字のうち、どの原因が何件を占めるかは調査されていませんが、公開GitHub上にこれだけの数が残っている一因だと私たちは考えています。

機械的なスキャナでも、2割近くを見逃す

見つかった秘密情報のうち、どれだけが既存のツールで検出できたかも調査されています。定番のシークレットスキャナであるgitleaksは1,122件中564件を検出し、TruffleHogは643件を検出しました。両方を使っても、どちらも検出できなかったものが215件残ります。

挿絵(L1ソフト塗り・imagin、文字なし・人物なし): 緑色の金属製ざる(ふるい)を木製のまな板の上で傾け、大きな不揃いの石はふるいの網目に引っかかって残り、小さな丸い粒だけが網目をすり抜けて下に落ちていく様子。シークレットスキャナが定型的なパターンは検出できても、コマンドライン形式に埋め込まれた認証情報をすり抜けさせてしまうことの比喩。

見逃しが多い理由について、Apiiroは PGPASSWORD= や sshpass -p のようなコマンドライン形式が、既知のAPIキーの正規表現パターン(「このプレフィックスで始まる32文字の英数字」のような形)に合致しないことを挙げています。シークレットスキャナは「鍵らしい文字列」を探す設計のため、シェルコマンドの引数に埋め込まれたパスワードは、その型にはまりにくいと考えられます。

もう一つ分かっているのは、漏えいした認証情報の有効性そのものは、全体としては検証されていないという点です。Apiiroはこの点を実証していません(侵害を試したわけではない)。影響を受けた組織には2026年11月2日・3日に通知が行われ、そのうち少なくとも1社では露出していたキーが実際に有効だったことが確認されています。「何件が今も使える鍵か」という全体数は、この1社の事実だけでは分かりません。

Anthropicからの公式な直接声明は、今回の調査結果に対して確認できていません。関連するGitHub Issue(2025年8月以降に報告されたもの)がいくつかありますが、返信がなく、一部は非活動として自動的にクローズされています。この部分は「対応していない」と断定できる根拠もなく、「確認できていない」という状態そのものを事実として書いておきます。

今日からできること

次の3点を確認します:

  • 自分のリポジトリの .claude/settings.local.json がコミットされていないか(git log --all --full-history -- .claude/settings.local.json で履歴ごと確認します)
  • フォークされたリポジトリにも同じファイルが残っていないか
  • 共有用の .claude/settings.json(個人用の.local.jsonとは別のファイル)に認証情報入りのコマンドを許可ルールとして保存していないか

見つかった場合にやること、優先順位は次の順です。

  1. 削除より先に、漏えいした認証情報を無効化・ローテーションします。削除だけではGit履歴やフォークから秘密情報は消えません
  2. git rm --cached で個人用設定ファイルの追跡を外します
  3. .claude/ ディレクトリを .gitignore に追加します
  4. コマンドに生のパスワード・トークンを直接書かず、環境変数参照($DB_URL 等)やシークレットマネージャー経由にします
  5. ローカル専用の設定(.local.json)と、意図的に共有する設定(.json)を区別して扱います
  6. pre-commitのシークレットスキャナを、コマンドライン引数に埋め込まれた認証情報も検出できるものに見直します

この調査を受けて、私たちも使っているリポジトリの .gitignore を確認しました。メインの開発リポジトリでは .claude/settings.local.json はもともと除外対象に入っていました(2026年11月時点)。ただし、除外していることと安全であることは別の話です。Apiiroの調査が指摘しているのは、除外していても一度コミットした履歴やフォークには残り続けるという点で、私たちの確認も「履歴にコミットされた事実が無いか」まで含めて見直す必要があります(私たちの全リポジトリの履歴精査はこの記事の執筆時点では完了していません)。

まとめ

この記事を読んで仕組みを理解するだけでは、自分のリポジトリから秘密情報は一件も減りません。確認して、無効化・ローテーションして、初めて意味を持ちます。

それでも、一度直しただけでは終わりません。次に「今後確認しない」を押すコマンドに、また生のパスワードを書けば、同じ形の許可ルールがもう一度残ります。見るべきは個々の設定ファイルではなく、コマンドに認証情報を直接書くという書き方そのものです。

関連

自社サイトの状態が気になったときは、URL を入れるだけで使える無料の診断ツールを公開しています。

出典

※ この記事は AI を使用しています。Leadeas が自社開発した AI エージェント基盤で下書きを作成し、人間のレビューを経て公開しています。AI ネイティブ開発会社として自社の技術をそのまま実演する目的で、この手法を用いています。(詳しくは AI 利用ポリシー)

AI導入のご相談

AI導入やシステム開発の ご相談を承っています。

お気軽にお問い合わせください

無料相談する

お問い合わせには1営業日以内にご返信します