Software Supply Chain Attacks(ソフトウェアサプライチェーン攻撃)
xz utils(CVE-2024-3094)・tj-actions(CVE-2025-30066)・SolarWinds を主事例に、 依存ハイジャック・タイポスクワッティング・ビルド環境侵害のパターンと対策を俯瞰する。
article technology ja xz utils(CVE-2024-3094)・tj-actions(CVE-2025-30066)・SolarWinds を主事例に、 依存ハイジャック・タイポスクワッティング・ビルド環境侵害のパターンと対策を俯瞰する。ソフトウェアサプライチェーン攻撃
ソフトウェアサプライチェーン攻撃は、ターゲット組織を直接侵害するのではなく、ターゲットが信頼するソフトウェア開発・配布の「上流」を汚染することで、下流の利用者に悪意あるコードを到達させる攻撃手法である。メンテナへの信頼・自動更新メカニズム・CI/CD パイプラインへの依存という現代ソフトウェア開発の利便性そのものが攻撃面になる点が特徴で、検出と防御が極めて困難。
攻撃の分類
依存関係ハイジャック(Dependency Confusion)
Dependency Confusion は、組織内の非公開パッケージ名と同一または類似した名前のパッケージを公開レジストリ( npm / PyPI / RubyGems など)に登録し、バージョン番号を高く設定することで、パッケージマネージャーが内部レジストリの代わりに悪性の公開パッケージを解決させる手法。2021 年にセキュリティ研究者 Alex Birsan が Apple / Microsoft / Netflix などの大企業で実証実験を成功させた。
対策: プライベートレジストリを明示的に指定し、スコープ( @org/)を使用する。パッケージのダイジェスト( hash)を固定する。
タイポスクワッティング
タイポスクワッティングは、人気パッケージの名前にタイポ( requets vs requests・crypto vs cryto など)や視覚的に紛らわしい文字置換を使い、開発者がタイプミスした際に悪性パッケージをインストールさせる手法。毎月数百〜数千の悪性パッケージが npm / PyPI に投稿されており、レジストリ側の自動検出との継続的な攻防が続いている。
対策: pip install requets のようなスペルミスを防ぐためのリンタ・依存関係の固定( lock ファイル)・インストール前の名前確認。
ビルド環境侵害
攻撃者が CI/CD システム・ビルドサーバー・ビルドスクリプト自体に侵入し、ビルドプロセス中に悪意あるコードをアーティファクトに注入する。開発者のソースコードは無害でも、最終的に配布されるバイナリが汚染される。**SolarWinds 攻撃(2020 年)**はこの手法の最大規模の事例。
署名・配布の改ざん
配布サーバーへの侵入・ミラーサイトの改ざん・ DNS ハイジャックにより、正規のパッケージと差し替えられた悪性バージョンをダウンロードさせる。TLS 証明書ピンニングや SLSA Provenance 検証が対策になる。
CI/CD 資格情報窃取
GitHub Actions・ GitLab CI などのパイプラインから API トークン・クラウド認証情報・シークレットを窃取し、更なる侵害(コードリポジトリへのバックドア注入・クラウド環境への不正アクセス)に利用する。
主要インシデント事例
xz utils バックドア(CVE-2024-3094、CVSS 10.0、2024-03)
経緯: 「Jia Tan(JiaT75)」というアカウントが約 2.6 年間かけて xz utils( Linux 標準の圧縮ライブラリ)のメンテナとして信頼を獲得。その間に悪意あるコミットは 8 件のみで、通常のバグ修正・改善コミットで信頼を築いた。2024-03 に xz 5.6.0 / 5.6.1 に SSHD バックドアを liblzma 経由で注入。悪意あるコードは難読化されたバイナリとしてテストファイルに紛れ込み、ビルドスクリプトが自動展開する仕組みだった。
発見: Microsoft の PostgreSQL 開発者 Andres Freund が SSH ログインが 500ms 遅い異常に気づき、2024-03-28〜29 に解析して発見・公開。
影響: Debian Sid / Fedora Rawhide / openSUSE Tumbleweed / Kali / Arch などローリングリリースに到達。安定 LTS は直前で回避。国家関与(ロシア関係者という仮説)が有力視されており、Log4Shell 以来最大のサプライチェーン攻撃とされる。
教訓: 3 年規模の社会工学( SE)キャンペーンでメンテナ権限を取得できること。OSS コミュニティのメンテナの燃え尽きに乗じた攻撃(プレッシャーをかけて信頼できる新たなメンテナとして登場するパターン)。バイナリテストファイル内の難読化コードはコードレビューで発見困難。
tj-actions/changed-files(CVE-2025-30066、2025-03)
経緯: 2025-03-14、GitHub Actions エコシステムで広く使われる tj-actions/changed-files アクションのリポジトリが侵害され、既存のバージョンタグが悪意あるコードを指すよう書き換えられた。悪性コードは Runner Worker のメモリからシークレット( AWS 認証情報・ GitHub トークン・API キーなど)を抽出し、ワークフローログ(公開リポジトリでは誰でも閲覧可能)に出力した。
影響範囲: 23,000 以上のリポジトリが影響を受けた。起点は reviewdog/action-setup(CVE-2025-30154)経由で侵害された Personal Access Token( PAT)。
修正: v46.0.1 で修正。GitHub が悪用パターンの検出を強化。
教訓: Action をコミット SHA でピン留めする(可変タグは安全でない)。ratchet や Renovate の Digest Pinning で自動的に SHA ピン留めを維持する。Harden-Runner でランタイム監視を追加する。
SolarWinds Orion 攻撃(2020 年)
ロシア SVR に帰属される攻撃。SolarWinds の Orion ネットワーク管理ソフトのビルドパイプラインに侵入し、正規のビルドプロセス中に「SUNBURST」バックドアを注入。コード署名済みの正規アップデートとして 18,000 以上の組織(米国政府機関を含む)に配布された。発見まで約 9 ヶ月が経過した。
npm / PyPI タイポスクワッティング攻撃
crossenv(cross-env のタイポ)・colourama(colorama のタイポ)など、多数の例が記録されている。悪性パッケージはインストール後に環境変数・ホスト情報・AWS 認証情報を外部に送信するものが多い。
対策の体系
| 攻撃ベクター | 主要対策 |
|---|---|
| 依存関係ハイジャック | プライベートレジストリ明示化・スコープ必須化・ hash 固定 |
| タイポスクワッティング | lock ファイル固定・レジストリ監視・インストール前確認 |
| ビルド環境侵害 | SLSA Provenance・エフェメラルビルド環境・ビルドログの改ざん防止 |
| CI/CD 資格情報窃取 | OIDC 短命トークン・ Runner 分離・シークレットスキャン |
| アクション・ハイジャック | コミット SHA ピン留め( tj-actions/changed-files@abc123 形式)・Harden-Runner |
アンチパターン
| アンチパターン | 問題 |
|---|---|
GitHub Actions のサードパーティアクションを可変タグ(@v3)で参照する | タグ書き換えで即座に侵害される( tj-actions の教訓)。@<commit-sha> で固定する |
| OSS メンテナを無条件に信頼し、PR を審査なくマージする | xz 事例のように長期 SE で信頼を確立してから攻撃する手口が存在する |
| 公開レジストリの最新版を lock なしで直接取得する | タイポスクワッティング・ dependency confusion のリスク |
| CI ログに環境変数を出力するデバッグコードを残す | tj-actions 型の攻撃でシークレットが公開露出する |