0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自己増殖型npmワーム:触れたすべてのコードベースにバックドアを仕掛ける

0
Posted at

はじめに

この脆弱性は、Trivyサプライチェーン攻撃の直接的な結果として発生しました。Trivyのインフラを侵害した後、TeamPCPはそれを踏み台にしてnpmエコシステム全体に広がる自己増殖型ワームを展開しました。このワームはパブリッシュトークンを窃取し、パッケージに自身を注入し、systemdによる再起動後も永続化し、ICP(Internet Computer Protocol)ブロックチェーンを検閲不可能なC2(コマンド&コントロール)チャネルとして利用します。

攻撃チェーン

攻撃は5つの段階で展開され、各段階が前段階の成果を利用してワームの影響範囲を拡大していきます。

段階1 ― Trivyを経由したトークン収集

TeamPCPが侵害したTrivyインフラ — trivy-actionsetup-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スクリプトもディスクに書き込まれます。このスクリプトは:

  1. 環境内で利用可能なすべてのnpmパブリッシュトークンを収集
  2. それらのトークンでパブリッシュ可能なパッケージを特定
  3. 各パッケージに悪意あるペイロードを注入
  4. 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パッケージバージョンのパブリッシュ

対処法:影響を受けた場合にすべきこと

  1. 実行の確認: ~/.local/share/pgmon/service.py~/.config/systemd/user/pgmon.serviceの存在を確認してください。これらが存在すれば、悪意あるコードがシステム上で実行された証拠です。

  2. 永続化サービスの停止:

    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
    
  3. npmトークンの即時ローテーション: マルウェアが実行された環境またはマシンに存在していたすべてのnpmトークンを無効化し、再生成してください。

  4. その他すべてのシークレットのローテーション: CI/CDシークレット、クラウド認証情報、SSHキー、APIトークン、および侵害された環境に存在していたその他の機密情報はすべて窃取されたものとみなし、ローテーションしてください。

  5. パブリッシュ済みパッケージの監査: メンテナンスしているパッケージに不正なバージョンバンプや予期しないpostinstallスクリプトが追加されていないか確認してください。発見した場合は、悪意あるバージョンをアンパブリッシュし、クリーンな版をパブリッシュしてください。

  6. パッケージバージョンの固定: package.jsonとロックファイルを更新し、latestに依存するのではなく、安全が確認されたバージョンに依存関係を固定してください。

参考リンク

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?