タグアーカイブ GitHub Actions

npmとGitHub Actionsのサプライチェーン攻撃を遮断する新防御策

npmとGitHub Actionsのサプライチェーン攻撃を遮断する新防御策

npmとGitHub Actionsを舞台にしたサプライチェーン攻撃が、近年組織化された巧妙な手口で猛威を振るっている。2026年前半、GitHubはこの攻撃連鎖を根本から断つため、数多くの防御策を相次いでリリースした。

公式ブログで公開された内容をもとに、初期侵入の防止、認証情報の抜き取り対策、マルウェア拡散の阻止、インシデント対応まで、最新の変更点をまとめて解説する。CI/CDパイプラインやパッケージレジストリを扱う開発者や運用担当にとって、すぐに活用できる情報が揃っている。

サプライチェーン攻撃の実態と攻撃チェーン

サプライチェーン攻撃の実態と攻撃チェーン

オープンソースエコシステムを標的としたサプライチェーン攻撃は、複数の脆弱性を組み合わせて短期間に被害を拡大する。典型的な流れは、メンテナーのアカウント乗っ取りに始まり、CI/CDワークフローの欠陥を突いてプロジェクトへ侵入し、認証情報を窃取したうえで、マルウェアを仕込んだパッケージを一気に配布するというものだ。

GitHubはこうした攻撃チェーンを研究し、最も効果の高い箇所に対策を集中投入している。以下の図は、よく見られる攻撃のステップを簡略化したものだ。

従来の典型的なサプライチェーン攻撃のチェーン
STEP 1 フィッシングメールでメンテナーの認証情報を窃取
STEP 2 GitHub Actionsの脆弱なワークフローを利用してプロジェクトに不正アクセス
STEP 3 CI/CDパイプラインから認証情報を抜き出す
STEP 4 不正なパッケージをnpmに公開し、多くのプロジェクトに拡散
※攻撃者はこれらのステップを極めて短時間で実行し、被害を最大化する。

この連鎖を断ち切るため、GitHubは複数の防御層を設けてきた。次節から順に見ていく。

初期侵入を許さない新たな対策

初期侵入を許さない新たな対策

サプライチェーン攻撃の第一段階は、多くの場合フィッシングによるメンテナーアカウントの侵害だ。また、GitHub Actionsのワークフロー設定ミスを突いた手口も頻発している。これらに対抗するため、2026年6月にいくつかの重要な変更が施された。

高影響度npmアカウントの保護

npmでは、影響度の高いアカウントに対して予防的な保護措置が導入された。メールアドレスの変更や二要素認証のリカバリコードを使用した場合、アカウントは72時間にわたって読み取り専用となる。この猶予期間によって、正当なメンテナーがアカウント回復のための時間を確保し、攻撃者が即座に悪用することを防げる。

GitHub Actionsワークフローの安全強化

GitHub Actionsでは、「pwn request」と呼ばれるフォークからのプルリクエストを通じた不正コード実行が長年の課題だった。これに対処するため、actions/checkout のデフォルト動作が変更され、フォークからの信頼できないコードをチェックアウトしないようになった(明示的にオプトアウトすれば従来どおり利用できる)。

さらに、ワークフローのトリガー(実行条件)に対して、誰がどの種類のトリガーを使えるのかをエンタープライズや組織レベルで制御できるポリシーが追加された。これにより、不要な pull_request_target の使用を禁止したり、信頼できないトリガーの範囲を限定したりできる。

加えて、Actionsのキャッシュ操作にも制限がかかった。信頼度の低いワークフローからは、他のワークフローと共有しているキャッシュを変更できないようにし、キャッシュポイズニングによる権限昇格の道を塞いでいる。

認証情報の抜き取りを防ぐ仕組み

認証情報の抜き取りを防ぐ仕組み

初期侵入に成功した攻撃者は、次にCI/CDパイプラインやリポジトリに残る認証情報を狙う。これらを抜き取られないようにすることが、攻撃拡大を防ぐ要となる。

信頼できる公開で長期クレデンシャルを排除

npmの「Trusted Publishing(信頼できる公開)」は、長期にわたって有効なトークンを使わずにパッケージを公開する機能だ。2026年4月より、CI/CDサービスとしてCircleCIが新たにサポートされたことで、より多くのプロジェクトがこの仕組みを利用できるようになった。CI/CD環境に直接シークレットを置く必要がなくなり、たとえ環境が侵害されてもトークンが漏洩するリスクが大きく下がる。

従来の公開フロー(Before)
CI/CD環境 長期トークンを保持 漏洩時に悪用
Trusted Publishing導入後(After)
CircleCI等 一時クレデンシャルで承認 npm に安全公開
※長期トークン不要のため、仮にCI/CDが侵害されても公開権限は奪われない

Actionsネットワークファイアウォール(技術プレビュー)

Actionsワークフローの実行中に発生するすべての外向き通信をログに記録する機能が、テクニカルプレビューとして提供開始された。これにより、悪意のあるコードのダウンロードや、未知のドメインへの認証情報の送信といった異常を検知できる下地が整う。将来的には、ネットワークの出口制限(egress restriction)やポリシーによる遮断も視野に入っている。

攻撃の拡散を封じるnpmとGitHub Actionsの強化

認証情報を手にした攻撃者は、次にマルウェアを仕込んだパッケージを大量に公開し、できるだけ多くのプロジェクトに感染させようとする。拡散速度を落とし、悪用の連鎖を食い止める対策がいくつか実装された。

段階的パブリッシュ(Staged Publishing)

2026年5月からnpmで利用可能になったStaged Publishing(段階的公開)は、CI/CDパイプラインのクレデンシャルだけではパッケージを直接公開できなくする仕組みだ。パイプラインからステージングされたバージョンは、別途npm CLIやWebサイト上での手動承認と二要素認証を経て初めて本公開される。これにより、CI/CDが侵害されても自動的にマルウェアが配布されるリスクを断ち切る。

従来の公開(Before)
CI/CD 直接npmに公開
※CI/CD環境が侵害されれば即時にマルウェア拡散
Staged Publishing導入後(After)
CI/CD ステージング 手動承認+2FA npmに安全公開
※承認を経なければ公開されないため、不正公開を防止

npm v12でインストールスクリプトをデフォルト無効化

攻撃者はパッケージのインストール時に実行されるスクリプト(install scripts)を悪用し、即座に認証情報を抜き取る手法を多用してきた。2026年6月に発表されたnpm v12では、こうしたインストールスクリプトがデフォルトで無効化される。正当な用途でスクリプトが必要な場合は、利用者が明示的に許可を与えることで再び有効にできる。

Dependabotバージョン更新に3日間のクールダウン

攻撃者は新たに公開した悪意あるバージョンが、Dependabotの自動プルリクエストで一気に下流プロジェクトに取り込まれることを狙う。このスピードを抑制するため、2026年7月からDependabotのバージョン更新にはデフォルトで3日間のクールダウンが設けられた。リリース後少なくとも3日が経過するまでプルリクエストは開かれず、その間にコミュニティや自動検知が悪意あるバージョンを発見する猶予が生まれる。なお、セキュリティアップデートは即時に発行されるため、緊急の修正が遅れることはない。

インシデント対応を迅速化する機能

インシデント対応を迅速化する機能

防御策と並行して、万一の侵害発生時に素早く対処できる機能も強化されている。

セルフサービスでのクレデンシャル無効化

2026年6月、エンタープライズ管理者やメンバーが、自身の全クレデンシャルを即座に無効化できるセルフサービスツールが提供された。2月にリリースされたエンタープライズ全体のクレデンシャル管理機能を拡張したもので、サプライチェーン攻撃で認証情報の漏洩が疑われる場合に、数クリックで影響範囲を封じ込められる。

OAuthトークンとAppトークンの即時失効API

2026年3月には、GitHubのOAuthトークンおよびAppトークンをプログラムから即座に失効させるAPIが拡充された。2025年4月に導入されたPersonal Access Token向けの失効APIに続くもので、公開リポジトリにクレデンシャルが漏れてしまった場合でも、開発者が自身で迅速に無効化できる。漏洩したトークンの悪用可能な期間を大幅に短縮する手段となる。

今後の展望

今後の展望

GitHubは製品をデフォルトで安全にする方針を掲げ、npmとGitHub Actionsの両面からサプライチェーン攻撃の遮断に取り組んでいる。今回紹介した変更は数カ月の成果に過ぎず、引き続きchangelogや公式ブログで新たな対策が発表される見込みだ。

オープンソースの持続可能性と企業の安全な利用を支えるこれらの取り組みは、コミュニティ全体にとって大きな前進といえる。

この記事のポイント

  • サプライチェーン攻撃は、アカウント乗っ取りからCI/CD経由でマルウェア配布へと連鎖する。GitHubは各段階に多重の防御を適用している
  • npmの高影響度アカウントに72時間の読み取り専用期間を設定し、乗っ取り後の即時悪用を防止
  • GitHub Actionsの pull_request_target やキャッシュ操作を安全なデフォルトに変更し、初期侵入を抑止
  • 長期クレデンシャルを使わない「Trusted Publishing」と「Staged Publishing」で認証情報漏洩と自動公開を遮断
  • Dependabotのクールダウンとnpm v12のインストールスクリプト無効化で拡散速度を抑制
  • クレデンシャルの即時失効機能により、万が一のインシデント対応を迅速に実施可能
Supabaseプロジェクトをnpmサプライチェーン攻撃から守る7つの防御策

Supabaseプロジェクトをnpmサプライチェーン攻撃から守る7つの防御策

npmエコシステムを狙ったサプライチェーン攻撃が2026年に相次いでいる。5月には、TanStackがGitHub Actionsのワークフローキャッシュを汚染され、正規リリースに悪意あるコードが混入する事件が発生した。Supabaseも同様に、supabase-javascriptというタイポスクワット(入力ミスを狙った偽装パッケージ)がnpm上に現れるなどの標的に遭っている。

同社はこの事態を受け、プロジェクトの保護に向けた社内横断の対応を開始し、誰もが参照できる公式ガイドを公開した。本記事では、そのガイドの中核を抜粋し、攻撃の構造と開発者が今すぐ実施すべき防御策を具体的に解説する。

npmサプライチェーン攻撃の3つの典型的な手口

npmサプライチェーン攻撃の3つの典型的な手口

サプライチェーン攻撃は、直接システムに侵入するのではなく、開発者が信頼しているパッケージに悪意あるコードを忍び込ませる。以下が最も一般的な三つの手口だ。

メンテナの認証情報を奪う「アカウント乗っ取り型」

攻撃者がnpmの公開トークンを盗むか、メンテナをフィッシングして乗っ取り、人気パッケージの新版に悪意あるコードを仕込んで公開する。次にnpm installを実行すると、その悪質なバージョンが導入されてしまう。

入力ミスを誘う「タイポスクワッティング型」

本物のパッケージ名から数文字だけ変えた類似名でパッケージを登録し、開発者やAIコーディングエージェントが誤ってインストールするのを待つ。Supabaseの例では、@supabase/supabase-js ではなく supabase-javascript というスコープなしの名前で公開された。AIエージェントがパッケージ名を幻覚(ハルシネーション)して提案することも多く、この手法は脆弱だ。

ビルドパイプラインを悪用する「CI/CD侵害型」

この手口は、GitHub ActionsなどのCI/CDパイプラインの脆弱なワークフローを突く。攻撃者はフォークしたプルリクエストからワークフローのキャッシュを汚染し、次回の正規リリース実行時にそのキャッシュを拾わせて、正規メンテナの署名で悪意あるコードを公開させる。TanStackを襲った攻撃がまさにこれで、セッションメッセンジャーネットワーク経由で機密情報が流出した。

アカウント乗っ取り型
攻撃者がメンテナ権限を奪い、正規パッケージに悪意あるコードを仕込んで公開
タイポスクワッティング型
類似名の偽パッケージを登録し、開発者の打ち間違いやAIの誤提案を誘う
CI/CD侵害型
ビルドパイプラインのキャッシュを汚染し、正規リリースに紛れて悪質なコードが配布される

いずれの手口も、npm install の完了までに環境変数やAWSメタデータ、SSH秘密鍵といった機密情報を根こそぎ奪われる危険がある。

Supabaseが実施するプロジェクト防御策

Supabaseが実施するプロジェクト防御策

Supabaseはこの問題に対し、全社的な対応を開始した。以下が現在進行中の主な取り組みである。

公式セキュリティガイドの公開

同社は、npmセキュリティに関する推奨事項をまとめた単一の正規ガイドページを公開した。エージェントが読み取り可能な形式で、具体的なアクションを指示している。

GitHub Actionsの安全性強化

組織全体で pull_request_target の使用を精査し、アクションのバージョン参照をコミットSHAに固定する強制ルールの適用が最終段階に入っている。

クレデンシャル関連APIへの警告注釈

createClient などの関数にTSDoc(TypeScript向けドキュメントコメント)を追加し、エディタ上でホバー時に機密情報を扱う旨の警告が表示されるようにした。

全チャネルでの啓蒙活動

顧客かどうかを問わず、できるだけ多くの開発者に防御策を届けるため、ブログやコミュニティを通じた情報発信を強化している。

依存関係管理の厳格化

依存関係管理の厳格化

以下に挙げる設定変更は、いずれも数分で完了する。どれか一つでは完全な防御にはならないが、複数積み重ねることで攻撃者が諦めるほどの障壁を築ける。

パッケージマネージャを最新にして公開遅延を設定する

pnpm 11(またはnpm v11相当)にアップグレードし、minimumReleaseAge をデフォルトの24時間より長く設定する。多くの悪意あるパッケージはリリース後24〜48時間以内に検出され削除されるため、3〜7日の遅延を設けると、被害を受ける確率を大幅に下げられる。

# pnpm-workspace.yaml または .npmrc
minimumReleaseAge: 4320  # 分単位、3日

依存バージョンを固定する

^~ による範囲指定は、npmに対して「次のマイナーやパッチを自動的に取り入れて問題ない」と伝えているに等しい。認証情報やネットワーク通信を扱うパッケージでは、必ず正確なバージョン番号を指定しよう。

従来のバージョン指定(Before)
"dependencies": {
  "@supabase/supabase-js": "^2.39.0",
  "axios": "~1.6.0"
}
防御策適用後(After)
"dependencies": {
  "@supabase/supabase-js": "2.39.0",
  "axios": "1.6.2"
}

ロックファイルをコミットし差分を精査する

pnpm-lock.yamlpackage-lock.json は、インストールされた正確なバージョンとハッシュを記録する。攻撃者が同じバージョン番号で悪意あるtarballを差し替えても、ハッシュが一致せずインストールが失敗する。ロックファイルをリポジトリにコミットし、プルリクエストの差分では目的不明な依存関係の変更がないか必ず確認する。

不用なインストールスクリプトを無効化する

サプライチェーン攻撃のペイロードの多くは、preinstall install postinstall といったライフサイクルスクリプトを通じて実行される。ネイティブコードを含むパッケージを必要としないプロジェクトでは、これらをグローバルに無効化する。npmでは npm config set ignore-scripts true または .npmrcignore-scripts=true を記述する。pnpmではAllow Buildsモデルを使って、実際に必要なパッケージだけを許可リストに登録する。

安全なパッケージ導入のための実践

安全なパッケージ導入のための実践

パッケージ名を毎回検証する

タイポスクワッティング対策として、以下の点をインストール前に必ず確認する。

  • スコープが正しいか。Supabase公式パッケージはすべて @supabase/ 配下にある。
  • メンテナの一覧が期待通りか。長年維持されてきたパッケージに新しいメンテナが突然加わっていれば警戒信号だ。
  • ダウンロード数とリンク先のGitHubリポジトリが、本物のパッケージとして妥当であること。

CI/CDワークフローを狙った攻撃への対策

CI/CDワークフローを狙った攻撃への対策

ActionsをコミットSHAで固定する

ワークフローで参照するサードパーティアクションは、タグではなくコミットの完全なSHAハッシュ(40文字)で固定する。タグは攻撃者が新しいコードで置き換えられるため安全でない。

- uses: actions/checkout@1f9a0c22da41e6ebfa534300ef656b67ce0c5b94 # v6.0.2

pull_request_target の危険な使い方を回避する

pull_request_target イベントは、プルリクエストのコードをチェックアウトして実行するコンテキストで使うと、攻撃者がリポジトリのシークレットやキャッシュにアクセスできてしまう。TanStackを襲った攻撃はまさにこのパターンだった。PRのコードに触れる処理は必ず pull_request を使用し、pull_request_target はラベリングやコメント投稿など、コードを実行しない信頼済み操作に限定する。

危険なワークフロー(Bad)
on:
  pull_request_target:
    types: [opened, synchronize]
jobs:
  build:
    - uses: actions/checkout@v4
      with:
        ref: ${{ github.event.pull_request.head.sha }}
安全なワークフロー(Good)
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  build:
    - uses: actions/checkout@v4

インシデント発生時の即応策

インシデント発生時の即応策

クレデンシャルのローテーションと監査

もし疑わしいパッケージを含む環境で npm install を実行してしまったら、そのマシンを危殆化したと見なし、到達可能なすべての認証情報(AWS、GCP、Kubernetes、Vault、GitHub、npm、SSH、Supabaseのサービスロールキー)を直ちにローテーションする。Supabaseのダッシュボードでサービスロールキーの使用状況を監査し、不審なアクセスパターンがないかも確認する。半日はかかる作業だが、顧客への被害を防ぐ価値は十分にある。

スキャナの導入で第二の防御線を

Socket.devやnpq、Snykといったツールは、npmレジストリのパッケージをリアルタイムで監視し、怪しい挙動をフラグ付けしてくれる。これらは万能ではないが、基本的な対策をすでに実施しているチームにとって有効な第二の防御線となる。

AIコーディングエージェントに渡すセキュリティチェックリスト

AIコーディングエージェントに渡すセキュリティチェックリスト

以下は、Supabaseが推奨するリポジトリ監査プロンプトだ。Claude CodeやCursorなどに貼り付け、変更内容を必ず確認しながら適用する。プッシュやPR作成、依存関係の自動追加、クレデンシャルのローテーションは自動化せず、必ず人間が承認する。


このリポジトリのnpmサプライチェーン衛生状態を監査してください。以下の変更を適用し、何を行ったかを報告してください。明示的な承認なしにプッシュ、PR作成、新しい依存関係のインストール、クレデンシャルのローテーションは行わないでください。

パッケージマネージャ:
- 古いバージョンならpnpm 11+(または最新のyarn/npm/bun)にアップグレード
- 新バージョンに7日間の公開遅延を設定
  - pnpm: `minimumReleaseAge: 10080` を pnpm-workspace.yamlに
  - npm: `min-release-age=7` を .npmrcに
  - yarn (berry): `npmMinimalAgeGate: '7d'` を .yarnrc.ymlに
  - bun: `minimumReleaseAge = 604800` を bunfig.tomlの[install]セクションに
- ライフサイクルスクリプトをデフォルトで無効化。pnpmではallowBuildsで明示的に許可するパッケージをリスト。
- 非レジストリの透過的依存参照をブロック。pnpmでは`blockExoticSubdeps: true`等を設定。
- パッケージマネージャ自体を正確なバージョンとsha512ハッシュで固定

ロックファイルと依存関係:
- ロックファイルがコミットされていることを確認(gitignoreされていない)
- 認証、シークレット、通信、暗号、ユーザデータを扱う依存関係では^/~を正確なバージョンに置き換え
- Supabase関連のインポートがすべて`@supabase/`スコープか検証。スコープなしの類似名はタイポスクワットとしてフラグ

GitHub Actions(存在する場合):
- すべてのサードパーティアクションのusesを40文字のコミットSHAに固定し、元タグをコメントで残す
- pull_request_targetを使いPRコードをチェックアウトしているワークフローを抽出し、pull_requestへの書き換えを提案
- インストールワークフローに`npm audit signatures`の非ブロッキングステップを追加

人の確認が必要な項目:
- Dependabotアラートとシークレットスキャンが無効なら有効化を提案

レポート:
- ファイル変更ごとに1行の理由付きリスト
- 自動変更せずに人の判断が必要な項目の一覧

この記事のポイント

  • npmサプライチェーン攻撃は、アカウント乗っ取り、タイポスクワッティング、CI/CD侵害の3パターンに大別される
  • Supabaseは公式ガイド公開、GitHub Actions強化、API警告追加などで対策を推進中
  • 即効性のある防御策として、パッケージマネージャの更新と公開遅延設定、バージョン固定、ロックファイル精査、インストールスクリプト無効化、パッケージ名検証、ActionsのSHA固定、pull_request_targetの回避がある
  • 万が一侵害が疑われる場合はクレデンシャル全ローテーションとスキャナ導入で二次被害を防ぐ
  • AIエージェントには安全な監査プロンプトを組み込み、自動変更を人の目でレビューする体制を整える
GitHubへの不正アクセス調査詳報、攻撃者は内部リポジトリに侵入するも影響は限定的

GitHubへの不正アクセス調査詳報、攻撃者は内部リポジトリに侵入するも影響は限定的

2026年5月20日、GitHubは自社が所有する一部の内部リポジトリに対して、第三者による不正アクセスがあったことを公表した。GitHubの最高情報セキュリティ責任者(CISO)であるAlexis Wales氏がGitHub Blogで発表した調査報告によれば、ユーザーデータや個人リポジトリ、GitHub.comを含むサービスには一切の影響がなかったという。

攻撃者は漏洩したトークン(認証情報)を用いて、GitHub社が管理していた内部リポジトリの一部を閲覧・クローンした。ただし、ソースコードの改ざんやマルウェアの注入、ユーザー情報へのアクセスは確認されていない。GitHubのインシデント対応チームは、発覚から数分以内に問題のトークンを無効化し、侵入経路を遮断した。

本稿ではこのインシデントの技術的な背景、影響範囲、そしてGitHubを利用する開発者が今すぐ実践すべきセキュリティ対策について詳しく解説する。大規模プラットフォームでさえトークン管理のミスが致命的になりうるという現実は、すべてのソフトウェア開発者にとって重要な教訓だ。

何が起きたのか、侵入の経路と期間

何が起きたのか、侵入の経路と期間

GitHubによれば、最初に異常が検知されたのは2026年5月中旬のことだ。同社のセキュリティ監視システムが、特定のGitHub Actionsトークンを用いた不審なリポジトリアクセスを検出した。このトークンはある外部サービスとのインテグレーションに使用されていたが、意図しない形で第三者の手に渡っていた。

トークンとは、パスワードの代わりにシステム間の認証に使う文字列のことを指す。たとえばAPIを呼び出すときやCI/CDパイプライン(コードのビルドやテストを自動化する仕組み)でリポジトリにアクセスする際に必要になる。このトークンが漏れると、正規のユーザーになりすましてリポジトリを操作できてしまう。

問題のトークンは、GitHubが所有する特定のリポジトリに対する読み取り権限と、一部のリポジトリに対しては書き込み権限も持っていた。これにより攻撃者は、リポジトリの内容を手元にクローン(複製)することが可能だった。ただしGitHubの発表では、攻撃者が実際にコードを改ざんしたり、悪意ある変更を加えたりした証拠は見つかっていないとされている。

攻撃者の行動を振り返る

GitHubのセキュリティチームがログを詳細に分析したところ、攻撃者は以下のような行動をとっていた。トークンを取得したあと、GitHubのAPIを経由してターゲットのリポジトリリストを取得。次に、少数のリポジトリを選んでクローン操作を実行していた。このアクセスパターンは自動化されたスクリプトによるものではなく、人間が手動で操作している形跡が強かったという。

重要なのは、攻撃者がアクセスできたのが「GitHub自身が管理する内部リポジトリ」に限定されていた点だ。一般ユーザーや企業がGitHub上で運用するプライベートリポジトリ、オープンソースプロジェクトのリポジトリ、そしてGitHub.comのサービス基盤そのものには一切アクセスできていなかった。

攻撃者の侵入経路(Before)
漏洩トークン GitHub APIを経由 内部リポジトリの閲覧・クローン
アクセス対象はGitHub所有リポジトリのみ、ユーザーデータには未到達
GitHubの初動対応(After)
トークン無効化 全ログ解析 影響範囲の確定
発覚から数分でトークン遮断、侵入経路の完全閉鎖を達成

上の図は、今回のインシデントにおける攻撃者の侵入経路とGitHubが取った即時対応を比較したものだ。漏洩トークンによる不正アクセスは数分で封じ込められ、ログ解析によって影響範囲が正確に特定された。

なぜトークンは漏洩したのか

なぜトークンは漏洩したのか

現時点でGitHubは、トークン漏洩の正確な経路について詳細を明らかにしていない。しかし、過去数年にわたってソフトウェア業界で多発しているトークン漏洩インシデントと照らし合わせると、いくつかの可能性が浮かび上がる。

考えられる漏洩パターン

最も多いのは、ソースコード内にトークンがハードコード(直接埋め込み)されていたケースだ。開発中の利便性からAPIキーやシークレットをコードに直書きし、そのままGitHubの公開リポジトリや内部リポジトリにプッシュしてしまう事故は後を絶たない。

別の可能性としては、CI/CDパイプラインの設定ミスだ。GitHub Actionsのワークフローファイルが適切に構成されておらず、ログにトークンが表示されていたり、サードパーティのサービスに意図せずトークンが送信されていたりするケースがある。

三つ目のパターンは、サプライチェーン攻撃だ。依存している外部ライブラリやツールに悪意あるコードが仕込まれ、ビルドプロセス中に環境変数からトークンを抜き取る手法である。2024年以降、AI開発ツールの増加に伴い、この種の攻撃は急増している。

いずれの経路であれ、根本的な問題は「トークンの権限が必要以上に強かった」ことだ。原則として、トークンには作業に必要な最小限の権限だけを付与すべきである。この「最小権限の原則」を守っていれば、たとえトークンが漏洩しても被害範囲は限定的だったはずだ。

インテグレーションの盲点

今回のケースで注目すべきは、攻撃者が狙ったのが「GitHub自身が所有する内部リポジトリ」であり、ユーザーのリポジトリではなかった点だ。Alexis Wales氏の発表によると、漏洩したトークンは外部サービスとのインテグレーションに使われていた。つまり、GitHubが信頼できるパートナーとして連携していたサービス側で何らかのセキュリティ問題が発生し、トークンが漏洩した可能性が高い。

これは多くの企業が直面するジレンマを浮き彫りにしている。業務効率化のために外部サービスとの連携を深めるほど、トークンの管理箇所は増え、攻撃対象領域(アタックサーフェス)も広がる。GitHubのようなセキュリティ専門企業でさえ、このバランスに苦心しているのだ。

影響範囲と被害の実態

影響範囲と被害の実態

GitHubが公表した調査結果から、今回のインシデントで実際にどのような影響があったのかを具体的に見ていく。

影響を受けた領域と受けなかった領域
安全だった領域
ユーザーのプライベートリポジトリ オープンソースリポジトリ GitHub.comサービス基盤 ユーザーデータ・アカウント情報
影響を受けた領域
GitHub所有の一部内部リポジトリ
安全側(99.99%以上のリポジトリ・データは無事)  ■ 影響側(GitHub社の内部コード一部が閲覧された可能性)

図の通り、影響は極めて限定的だった。GitHubの広報は「ソースコードの一部が意図せず開示された可能性は否定できないが、ユーザーに対する二次被害や連鎖的なセキュリティ侵害は発生していない」としている。

ソースコードの改ざんはなかった

GitHubの調査チームが最も注意深く検証したのは、攻撃者がリポジトリのコードを改ざんしたかどうかだ。結論としては、コミットログやファイルのハッシュ値を含む完全な監査の結果、コードの修正・削除・マルウェアの注入を示す証拠は一切確認されなかった。

これはGitHubのバージョン管理システム(Git)の特性が功を奏した面もある。Gitはすべての変更履歴をSHA-1ハッシュで保護しており、過去のコミットを改ざんしようとすると直ちに検知できる仕組みになっている。攻撃者が万が一コードを書き換えたとしても、その痕跡は完全に残るため、発見は容易だったはずだ。

このインシデントから開発者が学ぶべきこと

このインシデントから開発者が学ぶべきこと

GitHubのような巨大プラットフォームですらトークン漏洩を完全に防げなかった事実は、すべての開発者にとって警鐘だ。しかしこのインシデントからは、単に驚くだけでなく、具体的な教訓と実践可能な対策を引き出すことができる。

トークン管理の基本を徹底する

GitHubはインシデント報告の中で、トークン管理のベストプラクティスを改めて強調している。特に重要なのは以下の4点だ。

  • トークンの有効期限を短く設定する。可能であれば数時間単位でローテーションする
  • トークンに付与する権限を必要最小限に絞り込む。特定のリポジトリだけに読み取り権限を与え、書き込みは別トークンに分離する
  • ソースコードや設定ファイルにトークンを直接記述しない。GitHubのシークレット機能や専用のシークレット管理サービス(例としてHashiCorp Vaultやクラウド各社のキー管理サービス)を使う
  • リポジトリにトークンが誤ってプッシュされていないか、定期的にスキャンする。GitHubにはプッシュ時に自動検出する機能が標準搭載されている

これらの対策は決して難しいものではない。むしろGitHub Actionsや各種CI/CDツールには、トークンを安全に扱うための仕組みが最初から用意されている。設定を後回しにせず、プロジェクト開始時点で組み込んでしまうのが賢いやり方だ。

侵害を前提とした設計へ

より根本的な教訓は「侵害は起こりうる」という前提に立つことだ。どんなにセキュリティに投資していても、サプライチェーン攻撃やゼロデイ脆弱性(修正パッチが存在しない未知の脆弱性)によって防御線を突破される可能性は常にある。

GitHubのインシデント対応が迅速だった背景には、異常なAPI呼び出しパターンを即座に検知できる監視システムと、トークンを数クリックで無効化できる運用フローが整備されていたことがある。これらは事後対応(インシデントレスポンス)の設計が十分だったからこそ機能した。

従来のセキュリティ思考(Before)
完全防御を目指す 侵入されないことだけに注力
侵害を前提とした設計(After)
早期検知 封じ込め 影響最小化

この図が示すように、セキュリティの考え方は「侵入を100%防ぐ」から「侵入されても被害を最小限に抑える」へとシフトする必要がある。具体的には、トークンの権限制限、ネットワークのセグメント分離、操作ログの集中管理といった対策を組み合わせることになる。

GitHubの対応から見る、透明性あるインシデント開示の重要性

GitHubの対応から見る、透明性あるインシデント開示の重要性

今回のインシデントで特筆すべきは、GitHubが公表のタイミングと内容において高い透明性を示したことだ。CISOであるAlexis Wales氏が自ら筆を取り、わずか数日のうちに詳細な調査報告を公開した。

セキュリティ業界では、こうした迅速な情報開示は「ラディカル・トランスペアレンシー(徹底した透明性)」と呼ばれ、近年ではGoogleやMicrosoftも同様の姿勢を取っている。ユーザーにとっては、隠蔽されるよりも正直に報告されたほうが信頼を損なわず、適切な防御策を取る時間も確保できる。

GitHubの発表には「ユーザーが取るべき具体的なアクションはない」と明記されていた。これ自体が重要な情報だ。影響範囲が明確に線引きされているからこそ、ユーザーは不要な心配をせずに済む。逆に言えば、影響範囲が不明瞭な発表ほどユーザーの不安と憶測を招く。

この記事のポイント

  • 2026年5月、GitHubが内部リポジトリへの不正アクセスを公表。攻撃者は漏洩したトークンを使用して一部のリポジトリを閲覧・クローンしたが、コードの改ざんやユーザーデータへのアクセスはなかった
  • 影響を受けたのはGitHub自身が所有する一部の内部リポジトリのみで、一般ユーザーのプライベートリポジトリやオープンソースリポジトリには一切影響が及んでいない
  • トークン漏洩の原因は調査中だが、過去の業界事例からハードコードやCI/CD設定ミス、サプライチェーン攻撃などの可能性が考えられる
  • 開発者が取るべき対策は明確で、トークンの有効期限短縮、最小権限の原則の徹底、シークレット管理サービスの利用、プッシュ時の自動スキャン活用が有効
  • GitHubの迅速かつ透明性の高いインシデント開示姿勢は、業界全体の模範となる対応だった