タグアーカイブ DevSecOps

GitHubが依存関係のライセンス遵守を自動化する新機能を発表

GitHubが依存関係のライセンス遵守を自動化する新機能を発表

GitHubは2026年6月30日、オープンソースの依存関係におけるライセンス遵守を自動化する「License Compliance」機能を公開プレビューとして発表した。GitHub Advanced Security(GHAS)のCode Securityライセンスを持つEnterprise Cloudユーザーが対象だ。

この機能はPull Request上で新たに追加される依存関係のライセンスを自動スキャンし、組織のポリシーに反するものがあればアラートを出す。GitHub自身のOpen Source Program Office(OSPO)も数カ月前からこの機能に移行し、社内ツールを置き換えた実績がある。

ソフトウェア開発において依存関係のライセンス管理は、後回しにされがちな領域だ。しかし、ライセンス違反は訴訟リスクやコードの公開義務といった深刻な結果を招く。この記事では、GitHubの新機能の仕組みと、実際に運用する組織がどのようにポリシーを設計すべきかを解説する。

オープンソースライセンスの遵守が企業にとって重大な理由

オープンソースライセンスの遵守が企業にとって重大な理由

ほぼすべてのソフトウェアには何らかのライセンスが付与されている。ライセンスはそのプロジェクトを利用する許可を与えるが、同時に遵守すべき義務も課す。義務の内容は、ドキュメントに原著作者のクレジットを記載するだけの緩やかなものから、プログラムを配布する際に自社の全ソースコードを公開しなければならない強力なものまで幅広い。

商用ソフトウェアにおけるリスク

商用のクローズドソース製品を販売する組織であれば、GPL系のライセンスを持つ依存関係をうっかり混入させると、自社のプロプライエタリなコード全体をオープンソース化せざるを得なくなる可能性がある。これはビジネスモデルを根底から覆す致命的な事態だ。

逆に、自社プロジェクトをオープンソースとして公開する予定があるなら、商用ライセンスや互換性のないオープンソースライセンスの依存関係を避ける必要がある。いずれにせよ、ライセンス義務を満たせない依存関係は排除しなければならない。後から該当ライセンスのコードを除去するには大きな工学的コストがかかるし、企業ソフトウェアにとって違反のビジネスリスクは甚大だ。高額な訴訟やレピュテーションの損傷に直結する。

従来のレビュー手法とその限界

これまでライセンスレビューは手作業か、サードパーティ製ツールで行われてきた。しかし、依存関係が増えるたびに人手でライセンスを確認するのは現実的ではない。ツールを使うにしても、開発フローとは別の場所でチェックが走るため、問題が見つかった時点では既にコードがマージされた後、というケースも少なくなかった。

GitHubのLicense Compliance機能はこの課題に直接アプローチする。Pull Requestの段階で新しい依存関係をスキャンし、ポリシーに合致しないライセンスがあれば、マージ前に開発者へフィードバックを返す。開発フローに組み込まれた「シフトレフト」なアプローチだ。

GitHubのLicense Compliance機能の仕組み

GitHubのLicense Compliance機能の仕組み

この機能は、リポジトリに適用するルールセット(ruleset)を通じて有効化される。カスタムプロパティを使って対象リポジトリを指定し、「Active」モードか「Evaluate」モードかを選択する仕組みだ。

Evaluate モード(導入初期・様子見)
Pull Request にアノテーションを表示するが、 マージはブロックしない
開発者の生産性を落とさず、新ワークフローに慣れてもらうためのステップ
Active モード(本番運用)
ポリシー違反がある場合 マージをブロック
例外申請が承認されるか、依存関係が削除されるまでマージできない
評価モード  本番モード  ブロック状態

ルールセットの対象となったリポジトリでは、依存関係を変更するPull Requestが作成されると自動スキャンが走る。新しい依存関係それぞれのライセンスを照会し、既に許可済みのライセンスやパッケージ固有の例外に該当すればチェックをパスする。問題がある場合は、直接の依存関係だけでなく推移的依存関係(依存関係がさらに依存しているパッケージ)についても、Pull Requestのコメントとしてアラートが投稿される。

開発者から見たフロー

開発者はアラートを受け取ったら、その依存関係が受け入れ可能かどうかを判断する。受け入れられないと判断すれば、コードを修正するかPull Requestをクローズして依存関係を除去する。一方、そのライセンスやパッケージを許可すべきだと考えた場合は、例外申請を上げることができる。申請は組織内のポリシーチームに通知され、ポリシーを修正するかどうかが判断される。

GitHub OSPOの運用実績

GitHub自身のOSPOは、この機能が社内公開される前からアーリーアダプターとして利用してきた。当初は組織全体のルールセットに「Evaluate」モードを適用し、Pull Requestにアノテーションを表示するだけでマージはブロックしない設定でスタートした。これにより、開発者が新しいワークフローに慣れる時間を確保しつつ、旧来の社内ツールと並行稼働させて挙動の差異を検証したという。

約1カ月の並行稼働を経て、アラートの大半が「通常とは異なるライセンス」「ライセンス情報の欠落」「明示的に禁止されたライセンス」に絞り込まれた段階で、Activeモードへ移行した。大規模で動きの速い企業でも、段階的なロールアウトによって摩擦を最小化できる好例といえる。

ポリシー設計の実践アプローチ

ポリシー設計の実践アプローチ

効果的なライセンスコンプライアンスを実現するには、適切なポリシー設計が不可欠だ。GitHub OSPOの経験から、以下の3段階で考えると整理しやすい。

STEP 1 基本的な許可リストを整備する
MIT、Apache 2.0、BSD-3-Clause といった広く使われている寛容なライセンスを初期ポリシーとして登録する。多くの依存関係はこれらのライセンスでカバーされているため、最初のフィルタとして十分に機能する。
STEP 2 Evaluateモードでテスト運用する
組織全体にEvaluateモードで展開し、実際の開発フローでどのようなアラートが出るかを観察する。マージはブロックされないため、開発者の生産性を損なわずにデータを蓄積できる。
STEP 3 Activeモードへ移行し本番適用する
アラートのほとんどが想定内のパターンに落ち着いた段階で、Activeモードに切り替える。ポリシー違反があればマージをブロックし、例外申請プロセスを通じて必要なライセンスを都度追加していく。

重要なのは、ポリシーを「作って終わり」にしないことだ。新しいライセンスやパッケージ固有の例外は、ポリシーチームが継続的に審査し、必要に応じて追加していく。この運用プロセスが整っていないと、開発者は Pull Request がブロックされたまま放置される「ポリシー渋滞」に巻き込まれる。

ライセンス許可とパッケージ例外の使い分け

ポリシー修正には大きく2つの判断軸がある。「ライセンスそのものを許可する」か「特定のパッケージだけを例外として許可する」かだ。さらに、その許可を「Enterprise全体(組織全体)」に適用するか「特定のリポジトリのみ」に限定するかも決定する。

安全なライセンスで単に初出だっただけなら、Enterpriseレベルでライセンスを追加すれば済む。一方、商用ライセンスのパッケージで、特定のチームだけが購入済みのソフトウェアなら、そのリポジトリだけに例外を設定する。パッケージ例外にはワイルドカードマッチが使えるため、例えば @github-ui/* のような形で名前空間単位の許可も可能だ。

緊急時のオーバーライドと開発者教育

緊急時のオーバーライドと開発者教育

ライセンスポリシーによってPull Requestがブロックされる仕組みは強力だが、クリティカルな修正を緊急でマージしなければならない場面も想定しておく必要がある。GitHub OSPOは「ブレークグラス(緊急時オーバーライド)」の手順を整備している。

仕組みはシンプルだ。ルールセットの条件はカスタムプロパティの値を参照しているため、そのプロパティ値を切り替えるだけで一時的にポリシー適用を無効化できる。GitHub OSPOのこれまでの運用では、このオーバーライドを使ったのは1度だけだったという。頻繁に使うものではないが、いざという時に選択肢があることが重要だ。

開発者へのトレーニングとドキュメント

ツールを導入するだけでは不十分だ。開発者が「なぜライセンス遵守が自分ごとなのか」を理解していなければ、例外申請のプロセスは形骸化する。GitHub OSPOは社内向けのドキュメントとトレーニングを提供し、ライセンスコンプライアンスが全員の責務であるという認識を浸透させている。

開発者が情報に基づいた依存関係の選択をできるようになれば、後からの修正作業や法的トラブルを未然に防げる。ライセンス遵守は「コンプライアンス部門だけの仕事」ではなく、サプライチェーン全体で取り組むべき課題だ。

依存関係管理のこれから

依存関係管理のこれから

ソフトウェアサプライチェーンのセキュリティとコンプライアンスは、近年急速に注目を集めている領域だ。SBOM(Software Bill of Materials)の普及や、米国大統領令によるソフトウェアサプライチェーンセキュリティの強化など、規制面からの要請も強まっている。

GitHubのLicense Compliance機能は、こうした流れの中で「Pull Request時点でライセンスをチェックする」というプラクティスを標準化しようとする試みだ。開発フローに自然に溶け込む形で提供されるため、導入障壁は従来のサードパーティツールよりも低い。

現時点ではパブリックプレビューであり、対象はGitHub Enterprise CloudでGHAS Code Securityライセンスを保有するユーザーに限られる。しかし、GitHub自身が大規模な組織で実績を積んでいる点は、導入を検討する企業にとって心強い材料だろう。

この記事のポイント

  • GitHubが依存関係のライセンス遵守をPull Request上で自動チェックする新機能を公開プレビューとして発表した
  • ルールセットを通じてリポジトリ単位で適用し、Evaluateモードから段階的に導入できる
  • GitHub自身のOSPOがアーリーアダプターとして社内で運用実績を積んでいる
  • ライセンス違反は訴訟リスクやソースコード公開義務といった深刻な結果を招くため、開発フローへの組み込みが重要
  • ポリシー設計は「基本ライセンスの登録 → Evaluateモード → Activeモード」の3段階で進めるのが現実的
GitHubがシークレットスキャニングで受信箱ゼロを達成した方法

GitHubがシークレットスキャニングで受信箱ゼロを達成した方法

20,000件のアラートと向き合う、実践の全容

GitHubが社内の15,000以上のリポジトリを対象にシークレットスキャニングを実施したところ、20,000件を超える認証情報の露出を検出した。数字だけ見ると途方もないが、9カ月後には未対応のアラートをゼロに持ち込んでいる。セキュリティ運用の現場で「受信箱ゼロ(inbox zero)」を達成した事例として注目すべきプロジェクトだ。

GitHub Blogの記事によれば、同社はシークレット管理の取り組みを数年前から開始し、自社開発中のシークレットスキャニング機能をパイロット適用したところ、想定を大きく上回る数のシークレットが浮上したという。単に検出するだけでなく、どれが本物のリスクで、誰が対応すべきかを見極め、安全に修正するフェーズへと進めた点が鍵を握る。

本記事ではGitHubの内部事例をもとに、シークレット管理の現実的な進め方をひもとく。新規にシークレットスキャニングを導入した組織が直面する「どうやって既存のシークレットを片付ければいいのか」という問いに対する、具体的な戦略と教訓をまとめた。

ノイズの切り分け、18,000件が一瞬で消えた理由

ノイズの切り分け、18,000件が一瞬で消えた理由

20,000件を超えるアラートが出たからといって、同じ数の重大なインシデントが存在するわけではない。GitHubが最初に取り組んだのは、本当に対処すべきアラートとノイズの仕分けだった。

わずか5リポジトリで9割を占めたテスト用シークレット

データを掘り下げると、アラート全体の約18,000件がたった5つのリポジトリに集中していた。しかも、そのすべてがテスト用のフィクスチャや無効化済みの認証情報、実在しないが有効に見えるダミーシークレットだった。シークレットスキャニングを自社開発するGitHubにとって、テスト用の本物らしいシークレットが大量に必要なのは自然なことだ。

ここで同社が取った判断は明確だ。専用テストリポジトリに含まれ、一度も実運用で使われた形跡がなく、既知のテストパターンに一致するシークレットは、まとめて「解決済み」として一括クローズした。わずか数日で約18,000件のノイズが消え、残ったのは2,000件あまりの本物のアラートだけになった。

初期アラートの内訳(Before)
20,000件超 すべてのアラート
約18,000件 テスト用ダミー(無効)
約2,000件 実運用で対処が必要なシークレット
ノイズ除去後の作業対象(After)
約2,000件 実際のリスクに集中
ノイズ(一括クローズ)   実リスク(トリアージ対象)

テスト用シークレットと本物のクレデンシャルを区別する基準を事前に定めておけば、大規模な一括処理が可能になる。数字の見た目に惑わされず、まずは分類から始めるのが現実的な最初の一手だ。

コードだけではない、シークレットの潜む場所

コードだけではない、シークレットの潜む場所

シークレットはソースコードにだけ存在すると思いがちだが、GitHubの経験はそれを覆した。サポートチケット、バグ報奨金レポート、インシデント対応のメモ、wikiページにもシークレットは散らばっていた。

サポートチケットには顧客がうっかりトークンを含めてしまうケースがあり、バグ報奨金の報告には研究者が完全な再現手順の一環としてAPIリクエストごとトークンを提出する。インシデントの調査記録にも、緊急時にコピーされた認証情報が残ることがある。いずれもコードリポジトリの外にあるため、従来のスキャン対象から漏れやすい領域だ。

GitHubはカスタマーサポート、セキュリティインシデント対応チーム、バグ報奨金プログラムと連携し、それぞれのワークフローに共通のプレイブックを整備した。修正作業の過程で新規の課題やコミットにシークレットを載せてしまう二次被害を防ぐ工夫も、あわせて徹底されている。

シークレットが潜む場所
ソースコード 従来のスキャン対象。git履歴に埋もれた認証情報
サポートチケット 顧客が誤って貼り付けたトークン
バグ報奨金レポート 再現手順に含まれるAPIリクエストとトークン
インシデントメモやwiki 緊急時の調査記録に混入した認証情報
コード   チケット   バグ報奨金   メモ・wiki

スキャン対象をコードリポジトリだけに絞っていると、これら周辺領域のシークレットはいつまでも検出されない。組織全体のワークフローを見直し、サポートやバグ報奨金の運用にもシークレット対策を組み込む必要がある。

段階的な取り組みで9カ月後にゼロへ

段階的な取り組みで9カ月後にゼロへ

GitHubは2万件超のアラートを少数のセキュリティエンジニアだけで片付けようとはしなかった。新規の負債を止めたうえで、既存の負債を反復可能かつ計測可能なワークフローで減らしていく、運用バックログの処理と変わらないアプローチを取っている。主なフェーズは次の6段階だ。

フェーズ1、全社への有効化と強制で新規流入を遮断

既存のシークレットを片付ける前に、新たなシークレットの蓄積を止める必要がある。GitHubは全エンタープライズと組織に対してシークレットスキャニングとプッシュプロテクションを一括で有効化した。GitHub Advanced Securityの組織レベル設定があったため、15,000以上のリポジトリを一つひとつ手動で設定する必要はなかったという。

設定は強制適用され、個々のリポジトリやチームがこっそりオプトアウトすることは許されていない。プッシュプロテクションによって新規シークレットがソース上に流入するのを根本でブロックし、バックログが増え続ける状況を断ち切った。

フェーズ2、分類とトリアージで取捨選択

2万件超のアラートをリポジトリ別、シークレットタイプ別、経過期間別に分解し、前述のとおり約18,000件を一括クローズした。残った2,000件あまりについて、GitHubは難しい判断に直面する。

課題の中にシークレットが含まれている場合、本文を編集してリビジョン履歴を消すべきか、それとも監査証跡を残すべきか。リポジトリにコミットされたシークレットは、git履歴を書き換えるべきかどうか。大規模な履歴書き換えは強制プッシュによってプルリクエストを破壊し、コミットのSHAを無効化し、開発者の作業を中断させる副作用がある。

「もう使っていないリポジトリなら削除してしまえばいいのでは」という声も出たが、GitHubの回答は原則としてノーだった。削除されたリポジトリは監査証跡もろとも消える。もしそのリポジトリのシークレットが過去に漏洩していた場合、インシデント対応に必要な証拠を失ってしまう。シークレットをローテーションしたうえで、必要に応じてアーカイブし、履歴は残すという方針を取った。

可能なかぎり露出したシークレットを先にローテーションまたは無効化し、そのうえで履歴書き換えの要否を判断する。無効化済みのシークレットが履歴に残っていても安全かどうかはケースバイケースだ。この種の判断が、プロダクトセキュリティチームが日々直面する難題の一つであると記事は述べている。

フェーズ3、実効性の検証で本物を見極める

リポジトリに置かれた認証情報は、何年も前にローテーション済みかもしれないし、いまも本番システムにアクセスできるかもしれない。違いがわからなければ優先順位はつけられない。

当時のシークレットスキャニングにはネイティブの有効性チェック機能がなかったため、GitHubは独自の検証アプローチを構築した。目的は絞り込まれている。クレデンシャルがまだ機能するかどうかを確認し、適切な場合はアラートの転送先や通知すべき所有者を特定するための最小限のメタデータを収集するにとどめた。

たとえばGitHubトークンなら、GET /userのような影響の小さいエンドポイントに1回だけ認証リクエストを送る。不明瞭なレスポンスは結論不能と扱い、リポジトリや組織などのプライバシーに関わるリソースへの追加リクエストは避けた。この検証作業はプライバシーおよび法務チームとの密接な連携のもとで進められた。

手動での検証を進める一方、プロダクトチームが有効性チェックをシークレットスキャニングにネイティブ実装し、以降の作業は大幅に加速した。現在では有効性チェックがGitHubシークレットスキャニングの標準機能として組み込まれている。

フェーズ4、所有者の特定と責任体制の確立

認証情報が生きているとわかっても、誰がそれをローテーションできるのかを特定できなければ意味がない。GitHubが発行するパーソナルアクセストークンについては、プロダクトチームと協力してトークンの作成者や作成日時、スコープといったメタデータをアラート上に直接表示できるようにした。トークンそのものを使わずに所有者を割り出せる仕組みだ。

問題はそれ以外のシークレットと、明確な所有者が存在しないリポジトリだった。GitHubにはEngineering Fundamentalsという社内のエンジニアリング基準プログラムがあり、サービスに対して永続的な所有権を義務づけている。しかし、すべてのリポジトリがサービスときれいに紐づくわけではない。この課題は、GitHub Custom Propertiesを使ったリポジトリ所有権の明確化と、認証情報管理ツール上の全シークレットに永続的な所有者を割り当てる取り組みへと発展した。所有者を特定できなければシークレットのローテーションは不可能だからだ。

フェーズ5、ロングテールへの手動トリアージ

検証とメタデータの充実を経ても、最終的には人間の判断を要するアラートが残る。それぞれについて、この認証情報が何へのアクセスを許可するのか、すでにローテーション済みか、接続先システムの所有者は誰か、修正パスは何か、という問いを一つずつ解いていく作業だ。

GitHubはクローズするアラートすべてに対し、正確な処分結果(無効化済み、テスト用、誤検知など)を記録し、修正課題へのリンクや承認されたセキュリティ例外の情報といった関連コンテキストをコメントとして残した。このフェーズは、自動化されたシグナルだけでは不十分な領域を埋めるために、複数チームの密接な連携を必要とした。

フェーズ6、仕組み化と説明責任で持続可能に

パターンが見えてきた段階で、GitHubは作業をスケーラブルな体制へと昇華させた。

  • アラートを社内の脆弱性管理プラットフォームに集約し、一元的な追跡とレポートを実現
  • シークレットタイプ別に修正プレイブックを文書化し、各チームが自律的に対応できるように整備
  • リポジトリ所有権に基づいてアラートを適切なチームへ自動通知する仕組みを構築

最後の締めくくりは説明責任の確立だ。GitHubはシークレット修正をEngineering Fundamentalsプログラムに組み込み、セキュリティに関する基本要件として全チームを評価対象にした。明確な期待値を設定し、各チームが自分たちの状況を可視化できるダッシュボードを用意したことで、シークレット衛生は組織全体の共有責任へと変わった。着手から9カ月後、未対応アラートはゼロになった。

6フェーズでシークレットアラートをゼロに
STEP 1 全社にシークレットスキャニングとプッシュプロテクションを強制
STEP 2 アラート分類と一括クローズでノイズを除去
STEP 3 有効性検証で実リスクを特定
STEP 4 所有者を特定し責任体制を確立
STEP 5 ロングテールの手動トリアージ
STEP 6 仕組み化と説明責任で持続可能な運用へ

6つのフェーズは独立しているわけではなく、相互に補完し合う。フェーズ1で新規流入を止めなければバックログは減らず、フェーズ4の所有者特定ができなければフェーズ5の手動トリアージは停滞する。全体を一連のパイプラインとして設計した点が、9カ月での完遂を支えた。

GitHubが得た8つの教訓

GitHubが得た8つの教訓

今回のプロジェクトを通じてGitHubが得た教訓は、同様の課題に直面する組織にとって実践的な指針となる。以下に8つを整理した。

数字に怯えない

初期のアラート件数は2万件を超えていたが、実に9割は実害のないノイズだった。生の数字がそのまま実際の作業規模を表すことはほとんどない。まずは分類から始めるべきだ。

例外なく全社に強制適用する

部分的な展開は死角を生む。GitHubはエンタープライズレベルでシークレットスキャニングとプッシュプロテクションを有効化し、誰にもオプトアウトを許さなかった。

エスカレーションの前に検証する

検出されたシークレットのすべてが生きているわけではない。有効性チェックによって優先順位をつけ、本当に危険なものから手を付けるのが鉄則だ。

メタデータが作業時間を大幅に削減する

GitHub発行の認証情報については、トークンの作成者やスコープといったメタデータが調査時間を劇的に短縮した。サードパーティプロバイダにも同様のメタデータ提供を求め、自前で補完する層を用意するのが望ましい。

所有者不在のシークレットは修正できない

永続的な所有権の基盤に早期に投資すること。リポジトリにもクレデンシャルにも、必ず責任者を紐づける仕組みが必要だ。

検出後のワークフローを自動化する

検出はスタート地点にすぎない。本当の運用課題は、アラートの転送、所有者の追跡、そしてクローズまでのループを回し切ることにある。ワークフロー層への投資が成否を分ける。

セキュリティチームだけの課題にしない

数千件のアラートをセキュリティチームだけで修正するのは不可能だ。GitHubはシークレット衛生をエンジニアリングの基本要件に組み込み、全チームの評価指標に据えた。リーダー層がダッシュボードを注視する状況になれば、各チームは自然と修正の時間を確保する。

判断基準を文書化する

すべてのシークレットにきれいな修正パスがあるわけではない。ローテーションで十分なケース、履歴の書き換えが必要なケース、残余リスクを受け入れるケースを、どう判断するかをあらかじめ文書化しておくことが重要だ。

多くの手作業は製品機能に置き換わった

多くの手作業は製品機能に置き換わった

今回のプロジェクトでGitHubが手動で実施していた有効性チェックや所有者特定、一括トリアージの多くは、現在シークレットスキャニングのネイティブ機能として利用できる。同社の記事は、読者に対して「私たちが構築したものの大半を再発明する必要はない」と明言している。

新規にシークレットスキャニングを導入するなら、まず全社への有効化とプッシュプロテクションの強制適用から始め、バックログをリポジトリとシークレットタイプでトリアージし、ノイズと判断できるものは迷わず一括クローズする。その後、有効なシークレットを検証し、所有者にアラートをルーティングし、他のエンジニアリング作業と同様に修正状況を追跡する。この流れは、組織の規模を問わず適用できる現実的なアプローチだ。

この記事のポイント

  • アラート件数に惑わされず、まずはテスト用や無効化済みのノイズを分類して一括除去する
  • シークレットはコード以外にも存在する。サポートチケットやバグ報奨金レポートも対象に含める
  • 新規流入を止める強制適用と、既存バックログの段階的処理を並行して進める
  • 有効性検証とメタデータ活用で、本当に対処すべきアラートに集中する
  • シークレット衛生を組織全体の評価指標に組み込み、セキュリティチームだけの負荷にしない
LLMjackingの実態と防御策、APIキー漏洩が招く3つのリスク

LLMjackingの実態と防御策、APIキー漏洩が招く3つのリスク

近年、AIと大規模言語モデル(LLM)は企業の業務プロセスに急速に浸透している。カスタマーサポートやデータ分析の中核にLLMが据えられ、ビジネスの依存度は日増しに高まっている。その依存を狙う新たな脅威が「LLMjacking」だ。APIキーを窃取され、LLMリソースを不正利用されるこの攻撃は、財務的損失から機密情報の流出まで、多面的な被害をもたらす。

LLMjackingは単なるリソースの不正消費ではない。カスタムモデルの悪用やデータポイズニングといった、より深刻なリスクを内包する。本記事では、LLMjackingの仕組み、具体的なリスク、攻撃経路、検知手法、防御策を解説する。

LLMjackingとは何か

LLMjackingとは何か

LLMjackingは、攻撃者がLLMへのアクセスを乗っ取る攻撃手法だ。広く普及した技術だが、その本質は新しいものではない。AWSやGCPのアクセスキーを狙う従来のクレデンシャル窃取と構造は同じで、標的がLLMのAPIキーに置き換わっただけである。

LLMの利用は従量課金制であることが多く、APIキーが漏洩すれば高額な請求に直結する。さらに、カスタムモデルや社内データと統合されたキーの場合、単なる計算リソースの盗用を超えて、機密情報へのアクセスが可能になる。盗まれたクラウドキーよりも、LLMの認証情報が悪用されたときの被害範囲は広がる傾向がある。

従来のクラウドキー窃取
AWS / GCPキー 計算リソースやストレージへのアクセス
被害の中心はインフラコストの増大とデータ漏洩
LLMjacking(新たな脅威)
LLM APIキー モデル悪用、データ汚染、スパム生成など多面的被害
財務的損失に加え、ブランド毀損や意思決定の歪曲に発展する可能性
従来の脅威  LLMjacking

LLMがビジネスの中枢に組み込まれている現在、APIキーの漏洩はインフラ侵害以上の結果を招く。後続のセクションで具体的なリスクを整理する。

LLMjackingがもたらす3つのリスク

LLMjackingがもたらす3つのリスク

LLMjackingの被害はAPIの不正利用による請求増加にとどまらない。組織の財務、カスタムモデルの機密性、そしてモデル自体の信頼性を脅かす。以下、主要な3つのリスクを詳述する。

財務的損失

LLMのAPIは従量課金が一般的だ。攻撃者が無制限にアクセスすると、スパムメールのテンプレート生成やフィッシングサイト構築、マルウェア開発などに悪用され、短時間で高額な請求が発生する。利用上限を設定していても、LLMに依存する下流のエージェントプロセスや自動化ワークフローが巻き添えで停止し、ビジネス機会の喪失という二次的損失を生む。

カスタムモデルの悪用

多くの組織は社内文書や業務プロセスを学習させたカスタムモデルを「社内Wiki」として活用している。新入社員が業務手順を尋ねたり、特定の書類に関する質問を投げかけたりする用途だ。このモデルに攻撃者がアクセスすると、公開を想定していない組織内部の知識が流出する。攻撃者は得た情報を足がかりにネットワーク内での足場を拡大したり、ダークウェブで情報を売買したりする可能性がある。

データポイズニング

カスタムモデルが継続的に新しいデータで再学習されている環境では、訓練データや学習パイプラインへのアクセスを許すとデータ汚染のリスクが生じる。攻撃者は長期間かけてモデルに微妙なバイアスを注入し、従業員に誤解を招く応答や偏った情報を提供させることが可能だ。意思決定を徐々に歪め、誤った情報を拡散させるこの手法は検知が極めて難しい。

💰 財務的損失
APIの従量課金による高額請求、依存ワークフローの停止
🔓 カスタムモデル悪用
社内ナレッジの流出、攻撃の足場拡大、闇市場での売買
🧪 データポイズニング
モデルへのバイアス注入、誤った意思決定の誘導、検知困難

これらのリスクは相互に関連し、単一のインシデントから複合的な被害に発展しうる。次のセクションでは、攻撃者がどのようにAPIキーを入手するのかを説明する。

LLMjackingの攻撃経路

LLMjackingの攻撃経路

LLMjackingの攻撃ベクトルは、従来のクラウド認証情報を狙う手法と共通する部分が多い。主な経路はフィッシングと設定ミスの2つだ。

フィッシング

AI支援型の高度な攻撃が登場しても、最も古くからある「人間を騙す」手法は依然として有効だ。巧妙に作られたフィッシングページは、緊急性を装ったり、プラットフォームからの通知を偽装したりして、ユーザーに認証情報を入力させる。LLMのAPIキーも例外ではなく、従来の手口で窃取されるケースが後を絶たない。

クラウド設定やアプリケーション設定の不備

環境変数や構成ファイル、コンテナイメージ、CI/CDパイプライン、ログシステムにAPIキーが平文で保存されている事例は珍しくない。過剰な権限を持つS3バケットや公開されたKubernetesダッシュボード、適切に管理されていないGitリポジトリから、攻撃者は直接的な脆弱性を突くことなく認証情報を入手できる。

LLM統合のスピードが優先される現場では、セキュリティのベストプラクティスが後回しにされがちだ。これが認証情報の漏洩を招き、LLMへの自由なアクセスを攻撃者に与える結果となる。

攻撃経路の比較
経路1 フィッシング ユーザー 偽装ページ APIキー入力 キー漏洩
経路2 設定ミス Git公開リポジトリ/環境変数/S3 平文APIキー 攻撃者がスキャンして取得

どちらの経路でも、攻撃者は正規のAPIキーを手にするため、従来のファイアウォールでは検知が難しい。次のセクションで監視と検知の方法を解説する。

LLMjackingを検知する方法

LLMjackingを検知する方法

LLMjackingは単一の明らかな侵害として現れるよりも、異常な利用パターンとして表面化することが多い。検知にはベースラインの確立と継続的な監視が欠かせない。

組織のLLM利用ベースラインを確立する

異常を検知するには、まず「通常」の状態を定義する必要がある。APIリクエスト量、トークン消費量、よく使われるエンドポイントを時間帯ごとに把握し、月末のスパイクや定期的な増加パターンを基にベースラインを作成する。このベースラインと現在の利用状況を常に比較し、逸脱があれば速やかに調査することが重要だ。

請求アラートの監視

請求アラートは異常の最初の兆候であるケースが多い。攻撃者が低速度で長期間にわたりリソースを消費する「低頻度で遅い攻撃」に及んだ場合、検知は難しくなるが、大半の攻撃者はアクセスを失う前にできるだけ多くのリソースを使い切ろうとするため、請求上限アラートが作動する。アラート発生時は即座に調査し、対処を開始すべきだ。

検知の流れ
STEP 1 平時の利用パターンを1〜2週間収集、ベースラインを確立
STEP 2 リアルタイムの利用状況とベースラインを比較、逸脱を検出
STEP 3 請求アラートまたは異常検知でインシデントを特定、即時調査

検知体制を整えたら、次に必要なのは予防策だ。APIキーを狙う攻撃に対する実践的な防御手法を紹介する。

LLMjackingから防御するための対策

LLMjackingから防御するための対策

LLMjackingの防御は、結局のところ「認証情報を入手しにくくする」ことに尽きる。有効なAPIキーに依存する攻撃であるため、ファイアウォールよりも認証情報管理とアクセス制御が重要だ。

認証情報の衛生管理を徹底する

APIキーの定期的なローテーションは、漏洩した認証情報の有効期限を短縮する最も効果的な手段の一つだ。さらに、全てのワークロードに共有キーを使うのではなく、アプリケーションやサービスごとに専用のスコープを限定したキーを発行することで、異常発生時の特定と隔離が容易になる。侵害されたキーの影響範囲(ブラスト半径)も小さく抑えられる。

最小権限の原則を適用する

「念のため」と広範なアクセス権を付与する誘惑に抵抗し、人間ユーザーにも同じ原則を適用する必要がある。マーケティング部門の担当者が本番環境のプロンプトや顧客データパイプライン、法務要約モデルにアクセスできる必要はまずない。特定のワークロード、エンドポイント、モデルだけに権限を絞ることで、たとえキーが盗まれても攻撃者の可能な行動を限定できる。

基本的なセキュリティ対策を怠らない

LLMjackingは目新しい脆弱性を突く攻撃ではない。適切なシークレット管理プラットフォーム(例:HashiCorp Vault)の導入、GitHubのプッシュ保護機能の有効化、SIEMによるログの一元管理など、基本的な対策の積み重ねが防御力を高める。

  • シークレット管理: Vaultなどのツールでキーの自動ローテーションを実施する。
  • リポジトリ保護: GitHubのプッシュ保護が有効か確認する。万が一シークレットがコミットされたら即座にローテーションする。
  • ログの一元化: SIEMソリューションで監査ログとアクセスログを集約し、ベースラインとの比較と異常検知を自動化する。

LLMjackingの本質

LLMjackingの本質

LLMjackingは攻撃者にとって新しい攻撃対象だが、悪用される脆弱性は新しいものではない。認証情報の窃取と悪用という構造は、クラウド時代から変わらず、サイバーセキュリティの古典的な課題に過ぎない。しかし、LLMが意思決定や業務自動化に深く組み込まれた現在、その影響度は過去のリソースハイジャックより深刻になりうる。

防御の要は、最新のセキュリティ機構ではなく、基本の徹底にある。APIキーを高価値資産として扱い、スコープを限定し、使用状況を意図的に監視すること。技術は新しくとも、攻撃者が突く弱点は既知のものであり、対応策もまた既知のものだ。

この記事のポイント

  • LLMjackingはLLM APIキーを不正に利用する攻撃で、財務的損失、カスタムモデル悪用、データポイズニングの3大リスクがある。
  • 攻撃経路はフィッシングや設定ミスなど、従来の認証情報窃取と共通する。
  • 検知には利用ベースラインの確立と請求アラートの監視が有効。
  • 防御策はAPIキーの定期ローテーション、ワークロード固有のキー発行、最小権限の徹底が中核となる。
git push操作でサーバー制御可能なRCE脆弱性 GitHubが2時間で修正完了

git push操作でサーバー制御可能なRCE脆弱性 GitHubが2時間で修正完了

2026年3月4日、GitHubはバグ報奨金プログラムを通じて極めて深刻な脆弱性の報告を受けた。対象はgit push 操作のパイプラインであり、悪用されるとGitHubのサーバー上で任意のコマンドを実行される可能性があった。GitHubは報告から2時間以内に修正を展開し、その後の調査で実際の悪用は一切なかったと結論づけている。

この脆弱性は、git push に付与できる --push-option で送った文字列が、サーバー内部で適切にサニタイズされずにメタデータへ挿入されることに起因する。攻撃者は細工したオプションを与えるだけで、本来信頼される内部フィールドを偽装し、サンドボックスを回避してコードを実行できた。

本記事では報告の経緯、脆弱性の仕組み、GitHubの対応と調査結果、そして多層防御の重要性について詳しく解説する。自社運用のGitHub Enterprise Serverを管理するエンジニアは、早急なアップデートが推奨されるため、最後の対応ポイントまで確認してほしい。

バグ報奨金プログラムからの報告と即時対応

バグ報奨金プログラムからの報告と即時対応

2026年3月4日、クラウドセキュリティ企業Wizの研究者らがGitHubのバグ報奨金プログラムにリモートコード実行(RCE)の脆弱性を報告した。この脆弱性は github.com だけでなく、GitHub Enterprise Cloud(データレジデンシーやEnterprise Managed Usersを含む)および GitHub Enterprise Server にも影響するものだった。

報告によれば、リポジトリへのプッシュ権限を持つユーザー(自身で作成したリポジトリを含む)であれば誰でも、単一の git push コマンドでサーバー上での任意コマンド実行が可能だった。攻撃に必要なのは、プッシュ時に指定する --push-option に細工した値を仕込むだけである。

検証から修正までのスピード

GitHubのセキュリティチームは報告を受け取ると直ちに検証を開始した。約40分で社内環境での再現に成功し、重大度を確認。その時点でUTC 17時45分、根本原因の特定と修正パッチの作成が始まった。そして同日19時(UTC)には github.com への修正展開が完了した。報告からわずか2時間弱での出来事だ。

この迅速な対応を可能にしたのは、詳細な再現手順と影響範囲が報告の段階で明確に示されていたことにある。Wizの研究者はプッシュオプションを経由したメタデータ汚染から環境偽装、サンドボックス回避に至る一連の攻撃チェーンを完全に解明していた。

脆弱性の仕組み git push オプションから任意コード実行まで

脆弱性の仕組み git push オプションから任意コード実行まで

ここでは攻撃手法の技術的な流れを整理する。核となるのは、GitHubの内部サービス間でプッシュメタデータをやり取りする際に使われる区切り文字と、ユーザー入力の不適切な扱いだ。

プッシュオプションが処理される流れ

git push には --push-option(または -o)というオプションがある。これはクライアントがサーバーに対してキーバリューペアの文字列を追加で送るための正当なGit機能だ。CI/CDパイプラインへのパラメータ渡しなどで利用される。

しかしGitHub内部では、このユーザー提供の値がそのままの形で内部プロトコルのメタデータに埋め込まれていた。メタデータには「リポジトリ種別」や「処理環境」などを指定するフィールドが含まれており、各フィールドは特定の区切り文字で分割される。

サニタイズ不足が引き起こす注入攻撃

問題は、この内部区切り文字として使われていた文字が、ユーザー入力にも含まれ得る点だった。攻撃者はプッシュオプションの値に区切り文字を混入させることで、メタデータを意図的に「延長」または「上書き」できた。

より具体的には、プッシュオプションに key=value;injected_field=malicious のような文字列を指定する。内部サービスはこの文字列を単一の値として扱うが、後段のサービスがメタデータをパースする際に、区切り文字 ; で新たなフィールドとして解釈してしまう。こうして下流のサービスは、攻撃者が注入したフィールドを「信頼された内部値」として処理する。

研究者はこの仕組みを連鎖的に利用し、プッシュが処理される環境を上書きし、通常は有効なサンドボックス制限を無効化した。最終的にサーバー上で任意のコマンドを実行するコードパスに到達する。

Before(修正前)
ユーザー送信: git push -o “repo_type=public;real_env=unsandboxed”
プッシュオプションの値に区切り文字 ; が含まれ、内部フィールドを偽装
内部メタデータに注入
“repo_type=public;real_env=unsandboxed” がそのまま連結され、パーサーが新たなフィールド「real_env」を解釈
結果: サンドボックス回避 → 任意コード実行
下流サービスが偽装された環境でプッシュを処理し、制限を突破
After(修正後)
ユーザー送信: git push -o “repo_type=public;real_env=unsandboxed”
サニタイザーが区切り文字や危険なシーケンスを除去
内部メタデータは安全
“repo_type=public” のみが信頼できる値として処理され、注入されたフィールドは無視
結果: 通常のサンドボックス内でプッシュ処理
ユーザー入力は内部フィールドに影響を与えず、安全に実行
修正前:区切り文字を悪用したフィールド注入が成立
修正後:ユーザー入力がサニタイズされ、注入不可に

上図のように、ユーザーが指定したプッシュオプションが内部の区切り文字を経由してメタデータを汚染していた。修正後はサニタイズ処理が追加され、攻撃者が意図的にフィールドを延長できなくなっている。

脆弱性への修正と悪用調査

脆弱性への修正と悪用調査

github.com への緊急修正

2026年3月4日19時(UTC)、GitHubは github.com に修正を展開した。この修正により、プッシュオプションの値が内部メタデータのフィールド区切り文字を含まないよう適切にエスケープされる。以後、ユーザー入力が信頼された内部フィールドを上書きすることは不可能になった。

GitHub Enterprise Server 向けパッチとCVE

セルフホスト型の GitHub Enterprise Server (GHES) についても、同日中に全サポートバージョン向けのパッチが準備された。具体的には以下のリリース以降で修正が適用されている。

  • GHES 3.14.25 以降
  • GHES 3.15.20 以降
  • GHES 3.16.16 以降
  • GHES 3.17.13 以降
  • GHES 3.18.7 以降
  • GHES 3.19.4 以降
  • GHES 3.20.0 以降

この脆弱性には CVE-2026-3854 が割り当てられている。公開されたCVE情報は以下の通りだ。

  • CVE番号: CVE-2026-3854
  • 深刻度: Critical(緊急)
  • 影響範囲: 認証済みかつプッシュ権限を持つユーザーによるリモートコード実行

GitHubのCISOであるAlexis Wales氏は公式ブログで、GHESの全管理者に対し「直ちに最新のパッチリリースへアップグレードすることを強く推奨する」と呼びかけている。

悪用の有無を徹底調査

修正と並行して、GitHubは不正利用の痕跡がないかフォレンジック調査を開始した。この脆弱性には調査を容易にする特異な性質があった。悪用が成功した場合、サーバーは通常運用では決して通過しない特異なコードパスを必ず実行する。攻撃者がこれを回避することは構造上不可能である。

GitHubのエンジニアはこのコードパスにログ出力を仕込み、全テレメトリデータを解析した。その結果、以下の事実が確認された。

  • 該当コードパスが実行されたすべてのインスタンスは、Wizの研究者自身の検証作業と完全に一致した。
  • 他のユーザーやアカウントによる同コードパスの実行は一度も観測されなかった。
  • 顧客データへのアクセス、改ざん、持ち出しは一切発生しなかった。

これにより、github.com 上のリポジトリに対する実際の攻撃は一切なかったと結論づけられた。GHES環境についても、攻撃が成立するにはインスタンス上でプッシュ権限を持つ認証済みユーザーが必要であり、念のため /var/log/github-audit.log を確認し、プッシュオプションに ; を含む不審なログがないか点検することが推奨されている。

多層防御が生んだ追加の発見

多層防御が生んだ追加の発見

今回のインシデント対応の中で、インプットサニタイズの修正に加えて、防衛の階層化に関わるもう一つの重要な知見が得られた。攻撃が成立した理由の一部は、サーバー上に「その環境では本来不要なはずのコードパス」が存在していたことにある。

具体的には、コンテナイメージのディスク上に、異なる製品構成でのみ使われる想定のコードが含まれていた。過去のデプロイ手法ではこのコードが正しく除外されていたが、デプロイモデルの変更時にその除外ルールが引き継がれなかったのだ。

GitHubはこの不要なコードパスを、当該環境から完全に削除した。たとえ将来同種の注入脆弱性が発見されたとしても、攻撃者の行動範囲を大幅に制限できるようになっている。

このケースは、多層防御(Defense in Depth)が単なる標語ではないことを改めて示している。入力検証という第一の防衛線だけでなく、不必要なコンポーネントの除去という第二の防衛線が被害の拡大を防ぐ鍵になる。

ユーザーが今すぐ取るべき対応

ユーザーが今すぐ取るべき対応

GitHub.com および GitHub Enterprise Cloud ユーザー

github.com、GitHub Enterprise Cloud(Enterprise Managed UsersやData Residencyを含む)の環境は、2026年3月4日の時点で修正済みだ。これらのサービスを利用しているユーザー側での特別な対応は不要である。

GitHub Enterprise Server 管理者

セルフホスト環境では、先述のパッチバージョンへのアップグレードが不可欠だ。さらに、念のため監査ログを確認しておくとよい。具体的には /var/log/github-audit.log を対象に、プッシュオプションにセミコロン(;)を含むプッシュ操作が記録されていないか調査する。

攻撃の成立には認証済みのプッシュ権限が必要なため、内部不正やアカウント乗っ取りのリスクも考慮し、不審なアクティビティがないか定期的に確認することが望ましい。

この記事のポイント

  • git push に付与する –push-option のサニタイズ不足が、内部メタデータへのフィールド注入を許しリモートコード実行に繋がった
  • GitHubは報告から2時間以内に修正を展開し、サーバーログの解析で悪用の形跡がないことを確認した
  • GitHub Enterprise Server 環境では、指定のパッチバージョンへの即時アップグレードが強く推奨される
  • 入力サニタイズに加え、不要なコードパスを除去する多層防御の重要性が改めて浮き彫りになった