本文へスキップ
>_ITDITDセキュリティ対策プラットフォーム

セキュリティ対策

GitHubに公開された認証情報54万件が今も有効(2026年の調査):削除ではなく失効が必要な理由と、開発者がやること

公開リポジトリに書かれたAPIキーやDB接続文字列のうち約54万件が、調査時点でまだ使える状態でした。セキュリティ企業の調査の数字と限界を整理し、漏らしたときの手順(失効→利用履歴の確認→差し替え→履歴の掃除)と、プッシュ保護だけに頼らない防ぎ方を解説します。

公開日 2026-10-04 更新日 2026-10-04 最終確認 2026-10-04 19分で読める

対象:GitHubなどの公開リポジトリにコードを置いている開発者と、APIを提供している事業者。本記事はセキュリティ企業が公開した調査の数字を、当サイトの言葉で整理し直したものです。他人の認証情報を探す方法は扱いません。

この調査は何か(GitHubの公式調査ではない)

2026年9月29日、シークレット検出ツールを販売するセキュリティ企業Truffle Securityが、公開リポジトリに残る認証情報の調査結果を公開しました。調査した側は検出ツールの提供元なので、結果を自社製品の宣伝にも使える立場にあります。本記事では数字をそのまま使い、解釈は当サイトの判断として書き分けます。

GitHubが何かを漏らしたわけではありません。認証情報をコードに書いて公開したのは、それぞれのリポジトリの持ち主です。GitHubの役割は、プッシュ保護(秘密を含むpushを止める機能)などの防止機能を提供することで、その対象には後で見るとおり限りがあります。

調べ方と、数字の読み方の注意

約2.2億件
調べたリポジトリ(The Stack v3)
2026年7月27〜28日
有効かどうかを確認した日
既定ブランチのみ
コミット履歴は含まない
認証に通った
「有効」の意味(権限・悪用は未調査)
  • 元データは、LLM(大規模言語モデル)の学習用に第三者が公開リポジトリを集めたデータセット「The Stack v3」です。収集は2025年8月7日に締め切られています。
  • 調べたのは収集時点の既定ブランチ(main など)だけです。過去のコミット、別のブランチ、それ以前に消されたものは含まれません。GitHub上のすべての公開コードを調べたものではありません。
  • 「有効」とは、見つけた認証情報を発行元のサービスに実際に問い合わせて、2026年7月27〜28日の時点で認証に通ったという意味です。その後に失効されたものもあり得ます。
  • 漏れてからの期間は、認証情報を含むファイルの最終更新日から数えています。調査側は、実際より短めに出る測り方だと説明しています。
  • 種類によっては一部の集計から外されています。Google APIキーはGeminiでしか有効性を確かめておらず、秘密鍵は使い先のサーバーがないと確かめられないため、種類ごとの残存率の集計には入っていません。

数字で見る:何が、どれだけ残っていたか

543,699件
調査時点で有効だった認証情報(重複を除く)
約110万か所
同じ認証情報が複数のファイル・リポジトリに出た延べ数
784日
漏れてからの期間の中央値
6.3年以上
上位10%の古さ(最も古いものは2009年)

GitHubは2024年2月29日の週から、公開リポジトリへのpushに対するプッシュ保護を全利用者で既定で有効にし始めました。調査によると、有効だった543,699件のうち199,843件(36.8%)は、その日以降に入ったものです。

さらに、有効だった認証情報の51.8%は、接続文字列・Google APIキー・秘密鍵といった、プッシュ保護が既定では止めない種類でした。プッシュ保護の対象になっている種類は、既定化の前後12か月で比べると、100万ファイルあたりの漏れの数が約53%減っていました。対象外の種類は約7%の減少にとどまります。ただし調査側も、同じ時期にクラウド各社が短時間だけ有効な認証情報への移行を進めていたことなど、ほかの要因が混ざる可能性を認めています。

種類ごとに、どれだけ生き残っていたか

下の表は、調査が公開した件数から当サイトで割合を計算し直したものです。「見つかった数」は既定ブランチで見つかった認証情報の数、「有効だった数」はそのうち調査時点で認証に通った数です。

種類見つかった数有効だった数有効な割合
npmトークン101,88610.001%
Hugging Faceトークン30,437150.05%
GitHubトークン73,0482600.4%
Slackトークン8,9031982.2%
Stripeキー(テスト用キーを含む)124,1324,4933.6%
AWSアクセスキー82,4116,8198.3%
Docker Hubトークン3,7901,24432.8%
SendGridキー22,8009,18940.3%
Google Cloud サービスアカウントキー126,96369,04154.4%
MySQL接続文字列2,4211,80674.6%
PostgreSQL接続文字列12,98511,46588.3%
MongoDB接続文字列集計対象外51,067—

MongoDBは、調査に使った検出器が接続に成功したものしか記録しないため、割合が計算できず集計から外されています。有効な件数だけが報告されています。

なぜ種類によってこれほど差が出るのか

差を生んでいるのは、見つかりやすさよりも、見つかった後に誰かが止めるかどうかです。各社の公式ドキュメントで確認できた範囲では、次のようになっています。

発行元が自動で止める

  • GitHubトークン:公開リポジトリやGistにpushされた有効なトークンは自動で失効すると公式に説明
  • npmトークン:2019年から、GitHub経由で見つかった有効なトークンを失効させ、持ち主にメールで知らせている
  • Hugging Face:漏れたトークンを、持ち主以外でも無効化できる公式の仕組みがある

止めるのは自分だけ

  • DBの接続文字列:発行元という仕組みがなく、パスワードを変えるまで有効
  • 多くのAPIキー:GitHubから通知を受けた発行元がどう対応するかは発行元しだい
  • 自前のサーバーの秘密鍵:使い先を知っているのは持ち主だけ

GitHubの秘密スキャンのパートナープログラムは、公開リポジトリで見つかった認証情報を発行元に知らせる仕組みです。GitHubのドキュメントは、通知された秘密は公開済み・侵害済みとして扱うよう勧めつつ、どう実装するかは発行元に任せるとしています。失効、再発行、利用者への連絡のどれを選ぶかは発行元が決めます。

クラウドの2社は、完全な失効とは違う対応をとっています。

  • AWS:公開された疑いのあるアクセスキーを持つIAMユーザーに、AWSが「AWSCompromisedKeyQuarantineV3」という管理ポリシーを付けます。これはインスタンスの起動やIAMの変更など一部の操作を拒否するもので、キーそのものを削除するものではありません。AWSはこのポリシーを外さず、作成されたサポートケースの指示に従うよう求めています。
  • Google Cloud:2024年6月16日から、公開リポジトリなどで見つかったサービスアカウントキーを既定で自動的に無効化しています。組織ポリシーの制約 iam.serviceAccountKeyExposureResponse で、この動作をやめる(WAIT_FOR_ABUSE)こともできます。調査ではそれでも半数以上が有効でしたが、その理由は調査では示されていません。

当サイトの視点:消しても、別の場所にコピーが残る

この調査自体が、2025年8月に作られたデータセットを使っています。その後に持ち主がファイルを消しても、データセットの中の認証情報は消えません。フォーク、他人のクローン、ミラー、検索エンジンやAIの学習データも同じです。

だから「公開リポジトリにpushした=漏れた」と考えて、発行元の側で無効にするしかありません。履歴の書き換えは、これ以上広げないための後片付けです。

自分のリポジトリ

削除・履歴の書き換えで消せる

→

フォーク・クローン・ミラー

他人の手元にあり消せない

→

データセット・アーカイブ

収集時点のコピーが残る

→

発行元で失効

どのコピーも使えなくなる

公開リポジトリにpushした認証情報が残る場所。自分のリポジトリから消せるのは左端だけ。

漏らしたと気づいたときの手順

1

発行元でキーを失効させる

管理画面やCLIで、そのキー・トークンを無効にします。DBの接続文字列なら、そのユーザーのパスワードを変えるか、ユーザーごと作り直します。サービスが一時的に止まっても、悪用されるよりは被害が小さいので後回しにしません。
2

使われた形跡と請求を確かめる

漏れてから失効までの間に、身に覚えのない利用がないかを見ます。AWSならCloudTrail、Google CloudならCloud Audit Logs、メール送信や決済のサービスならダッシュボードの利用履歴と請求額です。AWSから隔離ポリシーやサポートケースの連絡が来ていたら、その指示に従います。
3

新しいキーを発行して差し替える

新しいキーはコードに書かず、環境変数やシークレット管理の仕組みから読み込みます。同じ機会に、権限の範囲・接続元IP・有効期限を絞ります。
4

最後に履歴を掃除する

git filter-repo などで履歴から取り除き、強制pushします。フォークや他人の手元のコピーは消えないので、これは失効の代わりにはなりません。

他人のキーを見つけたら、試さない

他人のリポジトリで認証情報を見つけても、使えるかどうかを試してはいけません。持ち主か発行元に知らせてください。GitHubの公開リポジトリなら、対応している種類はGitHubが発行元に通知します。

漏らさないための備え

プッシュ保護は役に立ちますが、それだけでは足りません。調査の数字が示すとおり、既定で止める種類以外は素通りし、利用者が理由を選んで通過させることもできます。次のものを組み合わせます。

  • pre-commitでスキャンする:gitleaksなどの検出器で、pushより前の手元で止めます(→ gitleaksでコミット前に秘密を止める)。
  • 古いリポジトリの履歴をスキャンする:プッシュ保護は既定化より前のコミットには効きません。放置しているリポジトリやアーカイブ済みのリポジトリも、一度は全履歴を検査します。
  • 短時間だけ有効な認証情報を使う:GitHub ActionsからAWSやGoogle Cloudへは、OIDC(実行のたびに短時間だけ有効な認証情報を受け取る仕組み)で、長く有効なキーを置かずに接続できます。Hugging Faceも同じ方式の仕組みを用意しています。
  • キーの範囲を絞る:読み取り専用、特定のAPIだけ、接続元IPやリファラーの制限、有効期限を設定します。漏れたときに困ることの範囲が小さくなります。
  • データベースをインターネットに出さない:接続文字列が漏れても、外からつながらなければ使えません。表の中で最も生き残っていたのがDBの接続文字列でした。

秘密をコードに書かない基本は .envとAPIキーの超入門 に、Webサーバー上の置き忘れは 公開ディレクトリの棚卸し にまとめています。

APIを提供している事業者へ

表の上位と下位を分けたのは、発行元が漏れたキーを自動で止めるかどうかでした。利用者のキーを守る側として、次を検討する価値があります。

  • GitHubの秘密スキャンのパートナープログラムに参加し、通知を受けたら有効なキーを失効させて利用者に知らせる
  • キーに独自の接頭辞(例:サービス名で始まる形式)を付け、検出しやすくする
  • 持ち主以外でも漏れたキーを報告・無効化できる窓口やAPIを用意する
  • 有効期限付きのキーや、範囲を絞ったキーを既定にする

出典(公開記録)

本記事の数字は以下の公開情報にもとづきます。調査の文章や図は転載せず、件数だけを使って当サイトで整理し直しています。

次に読む

よくある質問

QこれはGitHubの公式調査ですか?
A

いいえ。シークレット検出ツールを提供するセキュリティ企業(Truffle Security)が2026年9月29日に公開した調査です。GitHubが情報を漏らしたという話ではなく、認証情報を公開リポジトリに書いて公開したのは各リポジトリの持ち主です。GitHubはプッシュ保護や秘密スキャンといった防止機能を提供していますが、対象の種類には限りがあります。

QAPIキーをコミットしてしまいました。ファイルを消すか履歴を書き換えれば大丈夫ですか?
A

公開リポジトリにpushした時点で、フォーク、他人のクローン、ミラー、今回の調査で使われたようなデータセットにコピーが残っている可能性があります。ファイルの削除や履歴の書き換えでは、これらのコピーを消せません。最初にやるのは発行元でのキーの失効(無効化)と再発行です。履歴の掃除はその後に行います。

Q漏れたキーは発行元が自動で無効にしてくれないのですか?
A

発行元によります。GitHubは公式ドキュメントで、公開リポジトリにpushされた有効なGitHubトークンを自動で失効させると説明しています。npmも2019年から同様の自動失効を行っています。一方、GitHubの秘密スキャンのパートナープログラムでは、通知を受けた発行元がどう対応するかは発行元に任されています。データベースの接続文字列のように発行元という仕組みがないものは、誰も止めてくれません。

QGitHubのプッシュ保護を有効にしていれば防げますか?
A

一部は防げます。ただしプッシュ保護が既定で止めるのは、対応パターンに登録された特定の形式のトークンです。GitHubの対応パターン一覧では、Google APIキーやMongoDB・PostgreSQLの接続文字列はアラートの対象でもプッシュ保護の対象外です。また利用者は理由を選んでブロックを通過でき、設定で無効にもできます。pre-commitでのスキャンや短時間だけ有効な認証情報と組み合わせてください。

Q「有効」とはどういう意味ですか?
A

調査では、パターンで見つけた認証情報を発行元のサービスに実際に問い合わせ、2026年7月27〜28日の時点で認証に通ったものを「有効」としています。権限の範囲や、実際に悪用されたかどうかは調べていません。調査後に失効されたものもあり得ます。