はじめに
この脆弱性は、Trivyサプライチェーン攻撃の直接的な結果として発生しました。Trivyのインフラを侵害した後、TeamPCPはそれを踏み台にしてnpmエコシステム全体に広がる自己増殖型ワームを展開しました。このワームはパブリッシュトークンを窃取し、パッケージに自身を注入し、systemdによる再起動後も永続化し、ICP(Internet Computer Protocol)ブロックチェーンを検閲不可能なC2(コマンド&コントロール)チャネルとして利用します。
攻撃チェーン
攻撃は5つの段階で展開され、各段階が前段階の成果を利用してワームの影響範囲を拡大していきます。
段階1 ― Trivyを経由したトークン収集
TeamPCPが侵害したTrivyインフラ — trivy-action、setup-trivy、および感染済みバイナリ — は、すでに世界中のCI/CDパイプライン内で実行されていました。マルウェアはこれらのパイプラインから環境変数を窃取し、特にNPM_TOKENの値を標的にしていました。感染済みバイナリは、タイポスクワッティングされたエンドポイント(scan.aquasecurtiy.org、スペルミスに注意)と通信し、窃取した認証情報を送信していました。
攻撃期間中に侵害されたTrivyツールを実行したすべてのリポジトリのnpmパブリッシュトークンが窃取されました。
段階2 ― systemdによる永続化
ワームは実行されると、Pythonバックドア(service.py)をディスクに書き込み、Restart=alwaysが設定されたsystemdユーザーサービス(pgmon.service)をインストールします。これにより、バックドアは:
- プロセス終了後も生存
- 再起動後も生存
- 手動で発見・削除されるまで無期限に永続化
段階3 ― ブロックチェーンベースのC2(コマンド&コントロール)
systemdサービスは、Internet Computerブロックチェーン上で動作するスマートコントラクトであるICP(Internet Computer Protocol)キャニスターへのポーリングを開始します。ICPが意図的に選ばれた理由は、中央管理者が存在しない分散型ネットワークであり、テイクダウンや苦情申し立てが事実上不可能だからです。連絡すべきレジストラも、悪用報告を送るべきホスティングプロバイダも存在しません。
キャニスターは悪意あるバイナリを配信し、ワームがそれをダウンロードしてセカンドステージペイロードとして実行します。
段階4 ― npmを通じた自己増殖
deploy.jsスクリプトもディスクに書き込まれます。このスクリプトは:
- 環境内で利用可能なすべてのnpmパブリッシュトークンを収集
- それらのトークンでパブリッシュ可能なパッケージを特定
- 各パッケージに悪意あるペイロードを注入
-
latestタグで感染バージョンをパブリッシュ
感染したパッケージをインストールした人(npm install パッケージ名はデフォルトでlatestを取得)は侵害されます。その環境が新たな増殖拠点となり、ワームはそのトークンを収集してパブリッシュ可能なすべてのパッケージに感染します。これにより、npmエコシステム全体で指数関数的な拡散パターンが生まれます。
段階5 ― 破壊的ペイロード
ICPキャニスターからダウンロードされたセカンドステージバイナリは、ホスト環境のフィンガープリントを取得し、それに応じた動作を選択します:
- Kubernetesクラスターが検出された場合: クラスターとワークロードの削除を試行
-
一般的なLinuxシステム:
rm -rf --no-preserve-root /を実行し、ファイルシステム全体を破壊 - その他の環境: パッシブバックドアとして残留し、C2キャニスターからの追加指示を待機
侵害の確認方法
IoC(侵害指標)
侵害されたTrivyツールを実行した、または感染の可能性があるnpmパッケージをインストールしたすべてのマシンで、以下のアーティファクトの存在を確認してください:
| アーティファクト | パス | 意味 |
|---|---|---|
| Pythonインプラント | ~/.local/share/pgmon/service.py |
マルウェアが実行されたことを確認 |
| systemd永続化 | ~/.config/systemd/user/pgmon.service |
永続化が確立されたことを確認 |
| セカンドステージバイナリ | /tmp/pglog |
C2配信が発生したことを確認 |
| 状態トラッカー | /tmp/.pg_state |
ダウンロード状態の追跡を確認 |
その他の兆候
- ログやネットワークトラフィックに
scan.aquasecurtiy.org(タイポスクワッティングされたドメイン)への不審な参照 - コードや環境に不明なICPキャニスターエンドポイント
- メンテナンスしているパッケージに説明のつかない
postinstallスクリプト - 自分が作成していないnpmパッケージバージョンのパブリッシュ
対処法:影響を受けた場合にすべきこと
-
実行の確認:
~/.local/share/pgmon/service.pyと~/.config/systemd/user/pgmon.serviceの存在を確認してください。これらが存在すれば、悪意あるコードがシステム上で実行された証拠です。 -
永続化サービスの停止:
systemctl --user stop pgmon.service systemctl --user disable pgmon.service rm ~/.config/systemd/user/pgmon.service rm -rf ~/.local/share/pgmon/ rm -f /tmp/pglog /tmp/.pg_state systemctl --user daemon-reload -
npmトークンの即時ローテーション: マルウェアが実行された環境またはマシンに存在していたすべてのnpmトークンを無効化し、再生成してください。
-
その他すべてのシークレットのローテーション: CI/CDシークレット、クラウド認証情報、SSHキー、APIトークン、および侵害された環境に存在していたその他の機密情報はすべて窃取されたものとみなし、ローテーションしてください。
-
パブリッシュ済みパッケージの監査: メンテナンスしているパッケージに不正なバージョンバンプや予期しない
postinstallスクリプトが追加されていないか確認してください。発見した場合は、悪意あるバージョンをアンパブリッシュし、クリーンな版をパブリッシュしてください。 -
パッケージバージョンの固定:
package.jsonとロックファイルを更新し、latestに依存するのではなく、安全が確認されたバージョンに依存関係を固定してください。