GitHub Actions が狙われる理由
GitHub Actions は、コードのビルド・テスト・デプロイを自動化する CI/CD プラットフォームです。ワークフローはリポジトリの .github/workflows/ に YAML ファイルとして置かれ、push やプルリクエストをトリガーに自動実行されます。
攻撃者が GitHub Actions を狙う理由は単純です——ワークフローは クラウド認証情報・API キー・デプロイトークンなど、本番環境への鍵が集まる場所だからです。npm/PyPI のサプライチェーン攻撃が「パッケージ経由でインストール時に実行」を狙うのに対し、GitHub Actions 攻撃は CI/CD パイプラインそのものに侵入してシークレットを抜く手口です。2025年はこの手口による大規模インシデントが3件立て続けに発生しました。
2025年の主要インシデント
① tj-actions/changed-files(CVE-2025-30066)— 2025年3月
何が起きたか: GitHub Actions マーケットプレイスで人気 No.1 クラスの Action である tj-actions/changed-files(PR で変更されたファイルを検出するツール)のリポジトリが侵害されました。攻撃者はタグ v1〜v45.0.7 を悪性コミットへ書き換え、2.3万件以上のリポジトリのワークフロー実行時に、Runner のメモリ上のシークレットをワークフローログへ出力させました。
侵入経路: Coinbase のリポジトリから盗んだ GitHub トークンを使って、攻撃者は renovate[bot](依存更新ボット)になりすましてコミットを押し込みました。正規ボットの自動マージ設定が踏み台にされ、人間のコードレビューを通らずにマルウェアが紛れ込みました。
盗まれた情報: GitHub PAT(Personal Access Token)、npm トークン、AWS アクセスキー、RSA 秘密鍵などが、ワークフローログ(パブリックリポジトリでは世界公開)に Base64 エンコードで書き出されました。
根本原因: アクションをバージョンタグ(v45)で参照していたため、タグの指す先を書き換えられると全利用者が影響を受けました。v46.0.1 で修正済み。CISA も緊急アラートを発出しました。
② GhostAction キャンペーン — 2025年9月
何が起きたか: GitGuardian が2025年9月5日に発見したキャンペーン。攻撃者は 327個の GitHub ユーザーアカウントを乗っ取り、817リポジトリに悪性のワークフローファイルを直接コミットしました。「GitHub Actions Security」という無害そうなファイル名で偽装し、CI/CD 実行時にシークレットを外部サーバーへ送信させる仕組みです。
被害規模: PyPI トークン、npm トークン、DockerHub 認証情報、GitHub トークン、AWS アクセスキーを含む 3,325件のシークレットが窃取されました。窃取したシークレットの悪用(AWS キーや DB 認証情報の実際の使用)も確認されています。
侵入経路: アカウント乗っ取りにはインフォスティーラーやフィッシングが使われたと推定されています。正規のリポジトリオーナーのアカウントで操作するため、外部からは正規の変更に見えます。
③ Megalodon — 2025年5月
何が起きたか: 2025年5月18日、約6時間の間に 5,561リポジトリ・5,718件の悪性コミットが自動化ツールで一斉に投入されました。コミットメッセージは CI メンテナンス作業を装い、悪性ワークフローを仕込みました。感染が確認された時点で、攻撃者の C2 サーバーには数十ギガバイトの盗取データが蓄積されていました。
標的データ: AWS/GCP/Azure 認証情報、SSH 秘密鍵、Docker/Kubernetes 設定、データベース接続文字列、GitHub/GitLab トークン、その他すべての CI 環境変数が対象でした。
感染の起点: オープンソースのチャットプラットフォーム Tiledesk の npm パッケージが汚染され、そのリポジトリが悪性ワークフローを含む状態で公開されたことが引き金でした。パッケージ汚染と GitHub Actions 攻撃が連鎖した複合型サプライチェーン攻撃です。
攻撃手口の整理: 3つの侵入パターン
| パターン | 侵入経路 | 代表インシデント |
|---|---|---|
| Action リポジトリの乗っ取り | Action 作者のアカウントや CI トークンを奪い、Action 自体に悪性コードを仕込む | tj-actions/changed-files |
| 利用者リポジトリへの直接コミット | リポジトリオーナーのアカウントを奪い、悪性ワークフローを追加・改ざんする | GhostAction |
| 自動化による大量投入 | ボットで多数リポジトリへ一斉にワークフローをプッシュ | Megalodon |
タグ可変性の問題——なぜ SHA ピンが必要か
GitHub Actions でサードパーティの Action を使うとき、多くの開発者はこう書きます:
- uses: tj-actions/changed-files@v45 # タグ指定Git のタグは後から書き換えられます。攻撃者が Action リポジトリへの書き込み権限を得ると、v45 タグを悪性コミットへ付け替えるだけで、全利用者が次回実行時に悪性コードを取り込みます。これが tj-actions で起きたことです。
対して、コミット SHA で固定(SHA ピン)すると、ハッシュは内容に紐付くため書き換えが不可能です:
# タグ指定(危険 — タグが書き換えられると悪性コードを取り込む)
- uses: tj-actions/changed-files@v45
# SHA ピン(安全 — ハッシュが変わると動かないので改ざんに気づける)
- uses: tj-actions/changed-files@0e58ed8b... # 完全な 40 文字の SHA2025年8月、GitHub は SHA ピン強制ポリシー(ピンされていない Action を使うとワークフローが失敗する設定)と、特定 Action の即時ブロック機能(!compromised-org/action)を追加しました。
対策
1. Action を SHA でピンする
サードパーティの Action は必ず 完全な 40 文字のコミット SHA で参照します。タグやブランチ名(main)はいずれも可変で危険です。Renovate や Dependabot は SHA ピンのまま自動更新 PR を出せます。
2. OIDC で短命トークンを使う
AWS・GCP・Azure などクラウドへのデプロイに長命な認証情報(アクセスキーなど)をシークレットに保存せず、OIDC(OpenID Connect)でワークフロー実行ごとに短命トークンを取得します。トークンが盗まれても数分〜数時間で失効するため、被害を限定できます。
# GitHub Actions で AWS OIDC を使う例
permissions:
id-token: write # OIDC トークン取得に必要
contents: read
steps:
- uses: aws-actions/configure-aws-credentials@<SHA>
with:
role-to-assume: arn:aws:iam::123456789:role/github-actions
aws-region: ap-northeast-1
# アクセスキーの代わりに OIDC で一時認証情報を取得3. GITHUB_TOKEN の権限を最小化する
デフォルトで GITHUB_TOKEN には read-write の広い権限が付いています。ワークフローに必要な権限だけを明示的に指定します:
permissions:
contents: read # 必要な権限だけを列挙
pull-requests: write
# その他は暗黙的に none になる4. ワークフローファイルをコードと同等にレビューする
.github/workflows/ への変更は、アプリケーションコードと同じレビュープロセスを通します。GhostAction や Megalodon は「無害な CI 設定ファイルに見える」形で投入されました。ワークフロー変更は CODEOWNERS でシニアメンバーの承認必須にすることを検討します。
5. サードパーティ Action の使用を絞る
マーケットプレイスの Action は、実体は誰かの個人リポジトリです。本当に必要なものだけを使い、メンテナーが少ない・更新が止まっているものは GitHub 公式 Action や社内 Action で代替します。
6. シークレット漏洩を早期検知する
GitHub の Secret scanning(デフォルト有効)を確認します。GitGuardian などの外部サービスも、漏洩したシークレットがワークフローログに流れた際に検知・アラートを出せます。検知したらトークンをすぐに失効・ローテーションします。
まとめ
2025年の tj-actions/changed-files・GhostAction・Megalodon の3件は、GitHub Actions が CI/CD パイプラインに組み込まれるほど、そこに集まるシークレットが攻撃者にとって魅力的なターゲットになることを示しました。共通する防御の核心は ① SHA ピンで Action の書き換えを無効化、② OIDC で長命なシークレットを排除、③ 最小権限でトークンの影響を限定する——の3点です。
npm/PyPI パッケージ経由の攻撃パターンはソフトウェアサプライチェーン攻撃、自己増殖ワームの詳細はShai-Hulud 詳解も合わせてご覧ください。
※ 本記事の事件概要・数値・タイムラインは Unit42・GitGuardian・StepSecurity・CISA・SecurityWeek の公表内容に基づきます。対応時は最新の公式情報を確認してください。