【緊急】Trivyサプライチェーン攻撃の全貌 — セキュリティスキャナがCI/CDへの侵入口になった日

CI/CD & DevOps

この記事の概要

2026年3月、脆弱性スキャナ「Trivy」がサプライチェーン攻撃を受け、世界中のCI/CDパイプラインが一斉にクレデンシャル窃取マルウェアにさらされた。
攻撃グループ「TeamPCP」はTrivyのGitHub ActionsタグをすべてのSHA置換を通じて汚染し、npmに自己伝播ワームを撒き散らした。
この記事では攻撃の全貌と、今すぐ実施すべき対策をまとめる。


セキュリティツールそのものが武器になった — 攻撃の結論から先に伝える

「信頼しているツールこそ疑え」。
Trivyサプライチェーン攻撃が私たちに突きつけた教訓はこの一言に尽きます。

Trivyはコンテナイメージや依存ライブラリの脆弱性を検出するオープンソーススキャナとして、DevSecOpsを実践するチームで広く使われています。
しかしその信頼性が逆用されました。攻撃グループ「TeamPCP」は2026年3月19日、Trivyの公式バイナリ・GitHub Actions・Docker Hubイメージを同時に汚染。
正規スキャンが走るたびに、CI/CDシークレット・AWSキー・SSHキーが攻撃者サーバーに送信される状態が数日間続きました。

影響を受けたのはTrivyを「バージョンタグ」で参照していたすべてのパイプラインです。
uses: aquasecurity/trivy-action@v0.29.0 のような記述をしていたチームは、知らないうちにマルウェアを実行していました。


なぜGitHub Actionsのタグ指定では防げなかったのか

今回の攻撃が広範囲に広がった根本原因は、GitタグはImmutable(不変)ではないという仕様にあります。

攻撃がここまで広がった3つの理由

① 初期侵入:pull_request_targetワークフローの誤設定

2026年2月28日、hackerbot-claw という自動化ボットがTrivyリポジトリのGitHub Actionsワークフローに存在した pull_request_target の誤設定を悪用し、Personal Access Token (PAT) を窃取しました。
Aqua Securityはクレデンシャルをローテーションしましたが、一部の権限が残っていました。

② タグの書き換え:76/77タグが汚染

3月19日、攻撃者はその残存権限を使い trivy-action の76タグと setup-trivy の7タグすべてを悪意あるコミットに強制プッシュしました。
Gitのタグはデフォルトで書き換え可能(mutable)なため、古いタグも参照先が置き換わってしまいます。

③ CanisterWorm:ブロックチェーンを使ったC2

マルウェアはシステムに sysmon.py という名前でsystemdサービスを登録し、50分ごとにInternet Computer (ICP) ブロックチェーン上のスマートコントラクト(canister)からC2命令を取得します。
ブロックチェーンベースのC2は通常のドメイン遮断では止められず、今回初めて実運用で確認されました。


タイムライン:何がいつ起きたか

2026-02-28  hackerbot-claw が pull_request_target を悪用しPATを窃取
            Aqua Security がローテーション実施(ただし一部権限が残存)

2026-03-19  17:43 UTC  v0.69.4 タグがプッシュされ自動リリースが起動
                        悪意あるバイナリが GitHub Releases / Docker Hub /
                        GHCR / ECR に同時公開
            18:24 UTC  Docker Hub の aquasec/trivy:latest が汚染される
            trivy-action の 76/77 タグが悪意あるコミットに書き換え
            setup-trivy の全 7 タグも同様に書き換え

2026-03-22  盗んだnpmトークンを使い CanisterWorm が拡散開始
            npm パッケージ 47 件以上に postinstall フックを仕込む

2026-03-24  Aqua Security が全タグを安全なコミットに復元
            影響期間中のシークレット全ローテーションを呼びかける

窃取されたデータの種類

攻撃者が狙ったのは次のファイル・環境変数です。

# CI/CD環境で標的になった主な資格情報
~/.aws/credentials          # AWS アクセスキー
~/.kube/config              # Kubernetes クレデンシャル
~/.npmrc                    # npm パブリッシュトークン
~/.pypirc                   # PyPI トークン
~/.git-credentials          # Git 認証情報
~/.ssh/id_*                 # SSH 秘密鍵
$GITHUB_TOKEN               # GitHub Actions トークン
$AWS_ACCESS_KEY_ID 等       # 環境変数として渡されたクラウドキー

今すぐ実施すべき対策 — 実際の修正コード付き

対策1: タグ参照をコミットSHAに固定する(最重要)

これが今回の攻撃で最も効果的な防御策です。
タグはmutableですが、コミットSHAはimmutableです。

修正前(危険):

# .github/workflows/security-scan.yml
- name: Run Trivy vulnerability scanner
  uses: aquasecurity/trivy-action@v0.29.0  # タグ参照 — 書き換えられる

修正後(安全):

# .github/workflows/security-scan.yml
- name: Run Trivy vulnerability scanner
  uses: aquasecurity/trivy-action@76e46c4f4e0e7c60c80c8e8926b97e09e8573bd9  # SHA固定

SHAはリポジトリのコミット履歴から確認できます。

# 安全なSHAを確認する方法
gh api repos/aquasecurity/trivy-action/git/refs/tags/v0.29.0 \
  --jq '.object.sha'

対策2: pull_request_target ワークフローを監査する

# 危険なパターン: フォークPRからトークンにアクセスできる
on:
  pull_request_target:  # 要注意トリガー
jobs:
  build:
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}  # フォークのコードを実行

# 安全な修正: 権限を明示的に最小化する
on:
  pull_request_target:
permissions:
  contents: read  # 必要最小限のみ

対策3: 影響確認とシークレットローテーション

3月19日〜24日の間にTrivyを実行したパイプラインがある場合、次のスクリプトで影響範囲を確認してください。

#!/bin/bash
# 対象期間中にTrivyを使ったワークフロー実行を抽出する
START_DATE="2026-03-19T00:00:00Z"
END_DATE="2026-03-24T23:59:59Z"

gh api "repos/$GITHUB_REPOSITORY/actions/runs" \
  --paginate \
  --jq ".workflow_runs[] | select(
    .created_at >= \"$START_DATE\" and
    .created_at <= \"$END_DATE\"
  ) | {id: .id, name: .name, created_at: .created_at}"

影響が確認された場合は以下をローテーションしてください。

  • AWSアクセスキー(IAMコンソール → セキュリティ認証情報)
  • GitHub Personal Access Token(Settings → Developer settings)
  • npmパブリッシュトークン(npmjs.com → Access Tokens)
  • Kubernetesのサービスアカウントトークン

Trivyを安全に使い続けるための3ステップ

今回の攻撃は「Trivyを使うな」という話ではありません。
コア機能は既に復旧しており、Aqua Securityは全タグの安全性を再確認しています。
重要なのは参照方法を変えることです。

ステップ1: 全ワークフローのタグ参照をSHAに切り替える

手作業は大変なので、Renovate BotDependabot を使ってGitHub Actionsの依存関係を管理することをお勧めします。

ステップ2: OIDCを使ってCI/CDからのAWS認証を短命トークンに変える

長期間有効なアクセスキーを環境変数で渡すのをやめ、OpenID Connect (OIDC) でその場限りのトークンを発行する方式に切り替えると、クレデンシャルが盗まれても悪用できる時間を大幅に短くできます。

# GitHub Actions × AWS OIDC の設定例
permissions:
  id-token: write
  contents: read

- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@b47578312673ae6d1e2d2b07f5b8e6e1b3b5d9c  # SHA固定
  with:
    role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsRole
    aws-region: ap-northeast-1

ステップ3: Dependabotのアラートとブランチ保護ルールを組み合わせる

依存関係のバージョンアップPRを自動で作成し、SHA更新も含めて管理するフローを整備しておくと、今後同様の攻撃が起きても迅速に対応できます。


まとめ

Trivyサプライチェーン攻撃は、セキュリティツール自体が攻撃の入口になるという現実を示しました。
対策の本質は「バージョンタグへの盲信をやめ、SHAで固定する」という一点です。
今すぐ社内のGitHub Actionsワークフローを確認し、タグ参照をコミットSHAに切り替えてください。
対応の優先順位は次の通りです。

  1. 今日中: 全ワークフローのタグ参照をSHAに固定
  2. 今週中: pull_request_target トリガーのワークフローを監査
  3. 今月中: CI/CDからのAWS認証をOIDCに移行、長期キーを廃止

参考リンク

コメント