注意: 本レポートは 2026年3月22日 23:00 JST(14:00 UTC)時点の情報に基づく。本インシデントは調査が続いており、情報が更新される可能性がある。最新の状況は Aqua Security の公式アドバイザリ(https://github.com/aquasecurity/trivy/security/advisories/GHSA-69fq-xp46-6x23 )を参照されたい。
2026年3月19日、Trivy に対する2回目のサプライチェーン攻撃が発生した。本攻撃は2026年2月28日の初回攻撃で窃取されたクレデンシャルを利用した再攻撃であり、初回のクレデンシャルローテーションが不完全であったことが根本原因とされる。
調査の結果、FutureVuls が配布する Trivy バイナリ、FutureVuls の CI/CD パイプライン、npm 依存関係、および OSS の vuls リポジトリ( https://github.com/future-architect/vuls )のいずれについても、本攻撃による影響がないことを確認した。
なお、vuls リポジトリでは攻撃ウィンドウ中に Dependabot が v0.69.4 を検出したログが残っていたため、詳細な調査を実施した。その過程と結論は本記事の4.OSS vuls リポジトリへの影響調査に記録している。
| 情報源 | URL |
|---|---|
| Aqua Security 公式アドバイザリ (GHSA-69fq-xp46-6x23) | https://github.com/aquasecurity/trivy/security/advisories/GHSA-69fq-xp46-6x23 |
| StepSecurity 分析(第1回攻撃) | https://www.stepsecurity.io/blog/hackerbot-claw-github-actions-exploitation |
| Aikido Security 技術分析(CanisterWorm) | https://www.aikido.dev/blog/teampcp-deploys-worm-npm-trivy-compromise |
| Wiz 技術分析 | https://www.wiz.io/blog/trivy-compromised-teampcp-supply-chain-attack |
| FutureVuls 初回攻撃レポート(2/28 攻撃分) | https://www.vuls.biz/blog/trivy-supplychain-report |
注意: 第1回攻撃(2/28)に関する公式インシデント報告として公開されていた Discussion #10265( https://github.com/aquasecurity/trivy/discussions/10265 )は削除されている。現在は Discussion #10420( https://github.com/aquasecurity/trivy/discussions/10420 )にて、第1回・第2回攻撃を統合した形でインシデントの経緯が説明されている。
公式アドバイザリ(GHSA-69fq-xp46-6x23)に基づく攻撃対象は以下の3つ。
|
コンポーネント
|
攻撃内容
|
Exposure Window (UTC)
|
持続時間
|
|---|---|---|---|
|
trivy v0.69.4
|
悪意あるリリースの新規作成
(タイポスクワットドメイン(正規ドメインに酷似した偽ドメイン。 本件では security を securtiy と i/t を入れ替えたドメインが使用された)からのマルウェアのダウンロード) |
2026-03-19 18:22 〜 ~21:42
|
約3時間
|
|
trivy-action
|
77タグ中76タグを credential stealer に force-push
(Runner.Worker プロセスメモリダンプ、50以上のファイルパスからの秘密情報窃取、 AES-256-CBC + RSA-4096 暗号化による持ち出し) |
2026-03-19 ~17:43 〜 2026-03-20 ~05:40
|
約12時間
|
|
setup-trivy
|
全7タグを同一の infostealer に force-push
|
2026-03-19 ~17:43 〜 ~21:44
|
約4時間
|
公式アドバイザリの記載を以下に引用する。
クレデンシャルローテーションは実施されたが、アトミックではなかった(全クレデンシャルが同時に無効化されなかった)。攻撃者はローテーション期間中に有効なトークンを使用して、新たに回転されたシークレットを窃取し、アクセスを維持した可能性がある。
("credential rotation was performed but was not atomic (not all credentials were revoked simultaneously). The attacker could have use a valid token to exfiltrate newly rotated secrets during the rotation window (which lasted a few days).")
公式アドバイザリの対象範囲外であるが、Aikido Security の分析によると、攻撃は npm エコシステムへ波及し、自己増殖型ワーム「CanisterWorm」として以下のパッケージが侵害された。
CanisterWorm の技術的詳細・対象パッケージの完全なリスト・IOC については、以下の各分析記事を含め、最新情報を参照されたい。本インシデントは調査が続いており、追加の侵害パッケージが表面化する可能性がある。
FutureVuls の npm 依存関係に対する CanisterWorm の影響調査はセクション 3.3 を参照されたい。
FutureVuls が現在配布中の Trivy バージョンは v0.69.3 である。
- リリースノート:https://help.vuls.biz/releasenotes/20260300_hotfix/#2026-03-12-%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E5%86%85%E5%AE%B9
- v0.69.3はGitHubのImmutable Releases機能(3月3日、v0.69.3 公開前に有効化済み)により保護されており、攻撃対象のv0.69.4とは異なる。
結論: 影響なし。
FutureVuls の CI/CD パイプラインでは aquasecurity/trivy-action および aquasecurity/setup-trivy を使用していない。したがって、trivy-action のタグハイジャック攻撃および setup-trivy のリリース置換攻撃の影響を受ける経路が存在しない。
さらに、攻撃ウィンドウ(全コンポーネント合成: 2026-03-19T17:43:00Z 〜 2026-03-20T05:40:00Z)における CI/CD パイプラインの実行状況を確認した。
以下のコマンドで、任意のリポジトリの攻撃ウィンドウ内の CI 実行を確認できる。
FutureVuls の各リポジトリで上記コマンドを実行した結果、いずれも no runs found(攻撃ウィンドウ内に CI/CD 実行なし)であった。
結論: 影響なし。
CanisterWorm の対象パッケージ(セクション 2.4 参照。6スコープ・合計約60件)との依存関係を確認した。
以下のコマンドで、任意のプロジェクトの依存関係ファイルに対して CanisterWorm 対象パッケージの有無を一括確認できる。
FutureVuls の各リポジトリの依存関係ファイルに対して上記コマンドを実行した結果、いずれの CanisterWorm 対象パッケージにもマッチしなかった。
結論: 影響なし。
vuls リポジトリ( https://github.com/future-architect/vuls )では攻撃ウィンドウ内に複数の CI 実行が存在した。全実行のログを侵害コンポーネントのキーワードで一括走査した。
上記の走査により、Run ID 23322843048 において Dependabot が trivy v0.69.4 への更新を試みたことを検出した。他の全 Run は (not found) であった。
vuls リポジトリの dependabot.yml では trivy 関連パッケージが独立したグループ(trivy)として管理されている。以下のコマンドで取得できる Run ID 23322843048 の全ログに基づき、このグループの Dependabot ジョブについて以下が判明した。
"command":"recreate" — 新規作成ではなく既存 PR の再作成ジョブ"updating-a-pull-request":true — 既存 PR の更新として実行"existing-group-pull-requests" に trivy グループの既存 PR #2445(v0.69.3 への更新)が記録されていたGitHub API の contents エンドポイントは、ref パラメータ省略時にデフォルトブランチ(vuls リポジトリでは master)を返す。
出力なし — v0.69.4 は master ブランチに含まれていない。
Dependabot が作成したブランチを以下のコマンドで検索し、trivy グループのブランチを特定した。
結果: dependabot/go_modules/master/trivy-75591bbe2f
このブランチの内容を確認した。
結果:
from 0.69.2 to 0.69.3(v0.69.4 ではない)さらに master との diff を確認した。
go.mod の diff: v0.69.2 → v0.69.3(v0.69.4 ではない)
ブランチの内容は v0.69.3 への更新であり、v0.69.4 は含まれていない。
セクション 4.2.2 の Job definition 内の "existing-group-pull-requests" に、trivy グループの既存 PR として PR #2445(v0.69.3)が記録されていた。この PR の現在の状態を確認した。
結果:
chore(deps): bump github.com/aquasecurity/trivy from 0.69.2 to 0.69.3 in the trivy groupdependabot/go_modules/master/trivy-75591bbe2fPR のタイトルは v0.69.3 のままであり、v0.69.4 への supersede は実際には反映されていない。
bump google.golang.org/grpc from 1.78.0 to 1.79.3(MERGED: 2026-03-19T02:24:13Z、攻撃開始の15時間前。trivy と無関係)created 表示と実際の PR/ブランチ不一致の説明Dependabot updater の Results テーブルに「作成済み("created")」と記録されたにもかかわらず、実際のブランチ・PR には v0.69.4 が反映されなかった。この不一致について調査した。
Andrew Nesbitt による dependabot-core の分析記事( https://nesbitt.io/2026/01/02/how-dependabot-actually-works.html )によると、dependabot-core はステートレスな Ruby ライブラリであり、実行間の状態を保持しない。スケジューリング、状態追跡、PR の実際の作成・管理などの調整ロジックは GitHub のプロプライエタリなインフラストラクチャ側で処理される。
同記事では、既存 PR のリフレッシュ時のジョブには「PR 更新中: true("updating-a-pull-request: true")」と対象パッケージのリストが含まれ、リフレッシュロジックは既存 PR の更新・クローズ・supersede を判断するが、そのクローズ理由は内部的に列挙されているものの PR メタデータには公開されない("The close reasons are enumerated internally ... but not exposed in the PR metadata")と記述されている。
つまり、updater コンテナが create_pull_request API を呼び出してログに「作成済み("created")」と記録する処理と、GitHub のインフラ側が実際にブランチを更新して PR を作成する処理は異なるレイヤーで動作しており、前者が成功しても後者が反映されないケースが存在する。
「ログ上は作成済み("created")だが PR が作成/更新されない」現象は、dependabot-core の既知のバグとして、複数のエコシステムにまたがって広く報告されている。
| Issue | 報告日 | エコシステム | URL |
|---|---|---|---|
| #7542 | 2023年7月 | Docker | https://github.com/dependabot/dependabot-core/issues/7542 |
| #7672 | 2023年7月 | Docker | https://github.com/dependabot/dependabot-core/issues/7672 |
| #9199 | 2024年3月 | Gradle | https://github.com/dependabot/dependabot-core/issues/9199 |
| #11657 | 2025年2月 | GitHub Actions | https://github.com/dependabot/dependabot-core/issues/11657 |
| #11720 | 2025年3月 | Ruby Bundler / JS | https://github.com/dependabot/dependabot-core/issues/11720 |
| #12224 | 2025年5月 | Git Submodule | https://github.com/dependabot/dependabot-core/issues/12224 |
| #13879 | 2026年1月 | pip/uv | https://github.com/dependabot/dependabot-core/issues/13879 |
| #14193 | 2026年2月 | 全エコシステム | https://github.com/dependabot/dependabot-core/issues/14193 |
Issue #14193 では、この現象が以下のように明確に記述されている。
Dependabot updater が正常に実行を完了し、Results テーブルに「作成済み("created")」と表示するが、ブランチも PR も実際には作成されない。エラー報告はなく、ワークフローは成功ステータスで完了する。
("The run succeeds, the results table shows | created | ..., but no branches or PRs are created. This fails silently with no indication of the problem.")
Dependabot が攻撃ウィンドウ中(3/20 00:04 UTC)に Go モジュール github.com/aquasecurity/trivy の v0.69.4 を検出し、既存の v0.69.3 更新 PR(#2445)を supersede して v0.69.4 への更新を試みたことを CI ログから確認した。しかし、Dependabot updater の内部ログ上は「作成済み("created")」と記録されたものの、以下の4点から v0.69.4 はリポジトリに反映されていないことを確認した。
dependabot/go_modules/master/trivy-75591bbe2f)のコミット内容は v0.69.3 のまま(コミット日時: 攻撃開始15時間前の 3/19 02:25 UTC)結論: vuls リポジトリへの影響なし。
| 調査対象 | 影響 | 根拠 |
|---|---|---|
| FutureVuls 配布 Trivy バイナリ (v0.69.2) | なし | 攻撃対象は v0.69.4。v0.69.2 は初回レポートで安全性検証済み |
| FutureVuls CI/CD パイプライン | なし | trivy-action / setup-trivy 未使用。攻撃ウィンドウ内に CI/CD 実行なし |
| FutureVuls npm 依存関係(CanisterWorm) | なし | 各リポジトリの依存関係ファイルに対象パッケージ不在 |
| vuls リポジトリ master ブランチ | なし | go.sum に v0.69.4 なし、MERGED PR に trivy 更新なし |
| vuls リポジトリ Dependabot ブランチ | なし | ブランチ内容は v0.69.3、ログ上の「作成済み」は既知バグ |
| 項目 | 第1回(2/28) | 第2回(3/19) |
|---|---|---|
| 攻撃者 | hackerbot-claw(Claude Opus 4.5 搭載 AI 自律型ボット)[^1] | "TeamPCP" と見られる [^2] |
| 攻撃手法 | GitHub Actions ワークフロー脆弱性の悪用 → PAT 窃取 → リポジトリ乗っ取り | 残存クレデンシャルの悪用 → 悪意あるリリース作成 + タグハイジャック |
| 影響範囲 | Trivy リポジトリ(GitHub Releases 削除、VSCode 拡張) | Trivy バイナリ + GitHub Actions (trivy-action, setup-trivy) + npm 多数のパッケージ |
| 対策の進展 | — | Aqua Security が GitHub の Immutable Releases を 3/3 に有効化。v0.69.3 はこの機能により保護されている ("v0.69.3 is protected by GitHub's immutable releases feature (enabled March 3, before v0.69.3 was published)" — 公式アドバイザリ) |
[^1]: StepSecurity の分析( https://www.stepsecurity.io/blog/hackerbot-claw-github-actions-exploitation )より
[^2]: "TeamPCP is suspected to be behind the attacks" — The Hacker News( https://thehackernews.com/2026/03/trivy-supply-chain-attack-triggers-self.html )。Wiz・Aikido Security・Cyble の各分析でも同一名称で言及されている(URL はセクション 7 参照)
注: Immutable Releases とは、有効化されたリリースの削除・変更・上書きを防止する GitHub の機能である。詳細は GitHub 公式ドキュメント( https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release )を参照。
以下のうち、セクション 2.1 の情報源テーブルと重複するものには(※2.1掲載)を付記している。本セクションはレポート内の全リンクを一箇所で参照できるよう、意図的に網羅している。
以下のコマンドは、FutureVuls / vuls に限らず、Trivy を利用する任意のプロジェクトで応用可能である。
trivy-action の credential stealer は、窃取データの送信に失敗した場合のフォールバックとして、被害者の GitHub アカウントに tpcp-docs という名前のパブリックリポジトリを作成し、リリースアセットとしてデータをアップロードする。