GitHub Action での連鎖的攻撃:SpotBugs の PAT 漏洩トリガー説を掘り下げる

SpotBugs Access Token Theft Identified as Root Cause of GitHub Supply Chain Attack

2025/04/04 TheHackerNews — Coinbase を最初に標的とし、その後に “tj-actions/changed-files” GitHub Action のユーザーへと拡大していった、いわゆる連鎖型のサプライチェーン攻撃が確認されている。さらに、この攻撃の足跡を遡ると、SpotBugs に関連する PAT (personal access token) の窃取に端を発していたことが判明した。

2025年3月20日に公開したレポートを 4月2日に更新した Palo Alto Networks の Unit 42 は、「コード内のバグの静的な解析で多用される、人気の OSS である SpotBugs の GitHub Actions ワークフローを悪用することで、この攻撃者は最初の侵入に成功した。その後に、攻撃者は SpotBugs のリポジトリ間を横移動し、最終的に reviewdog へのアクセスを獲得していた」と述べている。

悪意の活動は、遅くとも 2024年11月下旬には始まっていた可能性があるが、Coinbase に対する攻撃が行われたのは 2025年3月だった。

Unit 42 によると、今回の調査が始まったきっかけは、“reviewdog” GitHub Action が侵害されたという情報を入手したことにある。この侵害は、プロジェクトのメンテナに紐づく PAT の漏洩によるものであり、それにより攻撃者は、不正なバージョンの “reviewdog/action-setup” をプッシュできるようになった。続いて、この不正なバージョンは、依存関係としてリストされていた “tj-actions/eslint-changed-files” アクションを通じて、“tj-actions/changed-files” にも取り込まれていった。

その後に判明したのは、この PAT を漏洩したメンテナが、SpotBugs という別のオープンソース・プロジェクトにも参加していることだった。

この攻撃者は、使い捨てユーザー名 “jurkaofavak” を使って、”spotbugs/spotbugs” リポジトリへと向けて、悪意の GitHub Actions ワークフロー・ファイルをプッシュしたとされる。そして、このワークフローが実行された際に、メンテナの PAT が漏洩したとされる。

漏洩した1つの PAT により、”spotbugs/spotbugs” と “reviewdog/action-setup” の両方にアクセスできたと考えられており、これが ”reviewdog/action-setup” の汚染に悪用された可能性があると見られている。

Coinbase Supply Chain Attack

Unit 42 によると、「“spotbugs/spotbugs” リポジトリへの書き込み権限を持つアカウントを、何らかの方法で取得した攻撃者は、その権限を使ってリポジトリにブランチをプッシュし、CI (Continuous Integration) 用のシークレット情報へのアクセスを達成した」と述べている。

では、その書き込み権限は、どのようにして取得されたのだろうか?調査の結果、SpotBugs プロジェクトのメンテナの1人が、悪意のコミットを行ったユーザー jurkaofavak を、2025年3月11日にリポジトリのメンバーとして招待していたことが判明した。

つまり、SpotBugs リポジトリの PAT を何らかの手段で入手した攻撃者は、それを悪用することで、メンバーとして jurkaofavak を招待する操作を行ったと考えられている。この一連の流れは、攻撃者が spotbugs/sonar-findbugs リポジトリのフォークを作成し、別の偽アカウント randolzfow 名義でプルリクエストを作成するという形で実行されたと、Unit 42 は述べている。

さらに同社は、「2024年11月28日 9時45分13秒 (UTC) に、CI/CD プロセスの一部で技術的な問題が発生したことで、SpotBugs のメンテナは修正を行い、spotbugs/sonar-findbugs のワークフローで自身の PAT を使うようにした。そして 2024年12月6日 02時39分00秒 (UTC) に、攻撃者から spotbugs/sonar-findbugs に対して、悪意のプルリクエストが送信されたが、このプルリクエストは、pull_request_target trigger を用いる GitHub Actions ワークフローを悪用するものだった 」と説明している。

pull_request_target trigger とは、GitHub Actions のワークフロー・トリガーであり、フォークから実行されるワークフローによる、秘密情報 (この場合は PAT) へのアクセスを許可する仕組みである。それにより、攻撃者は、いわゆる PPE (Poisoned Pipeline Execution) 攻撃を成功させていた。

そこから時間が流れ、後になって SpotBugs のメンテナが確認したのは、自身のワークフロー内でシークレットとして使用する PAT が、spotbugs/spotbugs リポジトリに jurkaofavak を招待するために使用されたアクセストークンと、同一のものであったことだ。このメンテナは、すべてのトークンと PAT を変更し、攻撃者によるさらなるアクセスを防止している。

この一連の出来事の中で、大きな謎のひとつは、攻撃者が SpotBugs メンテナの PAT を流出させた時点から、実際にそれを悪用するまでの、3か月間の空白である。この間、攻撃者は “tj-actions/changed-files” に依存するプロジェクトを監視し、Coinbase のような価値の高い標的を狙う機会を待っていたと推測される。

 Unit 42 の研究者たちは、「数ヶ月にわたって準備し、ここまでの成果を上げたにもかかわらず、なぜ攻撃者はシークレット情報をログに出力して、攻撃を露呈させてしまったのだろうか?」と、首をかしげている。