Nxおよび一部サポートプラグインの悪意あるバージョンが配布
(github.com/nrwl)- Nxパッケージとプラグインの悪意あるバージョンがnpmに配布され、ファイルシステムをスキャンし、認証情報を収集した後、ユーザーのGithubアカウントのリポジトリへ送信
- 影響を受けたか確認するには、Githubアカウントにs1ngularity-repositoryリポジトリが作成されていないか確認が必要
- 感染した場合、トークンとパスワードの交換、悪意あるリポジトリの削除、シェル設定ファイルの点検が必須
- 悪意あるバージョンはpostinstallスクリプトでシステムに影響し、特にVSCode Nx Consoleプラグイン利用時に無意識に実行される危険が高まる
- Nx側は再発防止と追加のセキュリティ対策を実施しており、該当バージョンはnpmから削除済み
概要と要約
- 今回のセキュリティ勧告は、Nxパッケージおよび一部の関連プラグインに対する深刻なサプライチェーン攻撃であり、悪意あるコードがnpmを通じて配布された
- 該当する悪意あるバージョンは、ユーザーのファイルシステムをスキャンして認証情報やパスなどを収集し、Githubリポジトリ(s1ngularity-repository)にアップロードした
- 悪意あるpostinstallスクリプトは、ユーザーのシェル設定ファイル(.zshrc、.bashrc)も改変し、システム終了コマンドを追加した
- 攻撃ベクトルと攻撃の進行過程、影響を受けるバージョン、ユーザーが取るべき緊急対応、再発防止策などが詳しく整理されている
緊急対応方法
全員が確認すべき事項
- 自分のGithubアカウントのリポジトリ一覧で、s1ngularity-repositoryが作成されていないか確認
- 当該リポジトリに含まれるファイルをダウンロードして記録保管
- リポジトリをGithub上で削除
- security@nrwl.io にメールを送り、漏えい情報の復号方法の案内を受ける
- すべてのアカウントの認証情報とトークンを直ちに交換
Githubトークンの交換方法
- https://github.com/settings/connections/… にアクセス
- 接続済みアプリのアクセス権を取り消して既存トークンを無効化
- gh CLIを使っている場合は再認証して新しいトークンを生成
- 未対応のままだと既存トークンが悪用される危険がある
悪意あるNxバージョンの利用停止と整理
- 現在使用中のNxバージョンが悪意あるバージョンかどうかを
npm ls nxコマンドで確認 - 感染バージョンなら
npm uninstall nx && npm install nx@latestで更新 npm cache clean --forceでキャッシュを整理
すでに感染したユーザー
- npmおよびGithubトークンを交換
- Github、関連サービスのパスワードと認証情報をすべて再設定
.zshrc、.bashrcファイルに見慣れないコマンドが挿入されていないか確認し、削除
内部パッケージリポジトリ管理者の場合
- 社内レジストリ内のproxyから悪意あるバージョンを直ちに削除し、追加拡散を防ぐ必要がある
影響を受けたバージョン案内
Nxパッケージ
- 21.5.0、20.9.0、20.10.0、21.6.0、20.11.0、21.7.0、21.8.0、20.12.0
- EDT 10:44 PM時点でnpmから削除完了
@nx/devkit, @nx/js, @nx/workspace, @nx/node, @nx/eslint, @nx/key, @nx/enterprise-cloud
- EDT 10:44 PM、6:20 AM時点でnpmから削除完了
攻撃ベクトル詳細
脆弱なWorkflowの原因
- Github Actionsワークフローに任意コード実行が可能な脆弱性が導入された
- PRタイトルに特定のbashコードを挿入すると、ワークフローでシステムコマンドが実行される脆弱性(Bash Injection)
pull_request_targetトリガーによりelevated権限(GITHUB_TOKENなど)を持つことになり、悪用された- 削除されるまでmainではない旧ブランチに脆弱なワークフローが残っており、攻撃者は悪意あるPRでワークフロー実行とシークレット窃取に成功した
npmトークン窃取の過程
- 脆弱なワークフローを通じて
publish.ymlを実行させた publish.ymlはnpmトークンをGithub Secretsに保管しており、この過程で外部Webhookへトークンが送信された- 最終的に攻撃者はこのトークンを使って、Nxおよびサポートパッケージの悪意あるバージョンをnpmにアップロードした
悪意あるパッケージの挙動
認証情報を含む情報収集とGithubリポジトリへの公開
- 感染したNxパッケージのpostinstallスクリプト実行時に、各種テキストファイルの場所と認証情報を収集
s1ngularity-repositoryという名前のGithubリポジトリにbase64エンコードしてアップロード- 実際のリポジトリが削除済みでも、以前は公開状態だったため情報漏えいの可能性を考慮する必要がある
シェルプロファイル(.zshrc、.bashrc)の改ざん
- postinstallが
sudo shutdown -h 0コマンドを挿入し、ターミナル実行時にシステム終了を誘発し、パスワード露出の可能性がある
postinstallが動作するさまざまなシナリオ
-
npm install/yarn/pnpm installの明示実行以外にも、推移的依存関係、エディタ拡張、スクリプト実行など多様な状況で動作する可能性がある -
特に、VSCode用Nx Console拡張(18.6.30〜18.65.1バージョン)は、エディタ起動時に自動で
nx@latestをインストールし、postinstall実行を引き起こす可能性がある -
根本的に、意図しなくてもさまざまな場所でNPMモジュールのインストールが行われ得ることに注意が必要
-
Nx Console(18.66.0)からは、latest nxのインストール過程が削除された
攻撃と対応のタイムライン
8月21日
- 4:31 PM: Bash注入脆弱性を含むPRがマージ
- 10:48 PM: 脆弱性を指摘する投稿がX(旧Twitter)に掲載
8月22日
- 午後: 内部調査、脆弱なワークフローをロールバック(不完全)
- CodeQL導入により、今後のPRで類似脆弱性の検知を適用
8月24日
- 攻撃者フォークでnpmトークン漏えいの兆候があるコミットが発生
- 悪意あるPRが作成・削除され、
publish.ymlがこのPRによって実行された
8月26日〜27日(悪意あるバージョン配布、対応)
- 悪意あるNxおよびプラグインの多数バージョンがnpmに順次配布
- Github/NPMコミュニティへ問題報告
- 10:44 PM: NPM側が該当バージョンを全量削除するなどの対応
- 11:57 PM: すべてのNx関連パッケージ公開用トークンを無効化
- 8月27日: Nx Consoleのパッチ、2FA、Trusted Publisher方式への移行など追加対応
事前予防措置と今後の対応
- すべてのnrwl組織maintainerに2FAを義務化
- Trusted Publisherメカニズムを適用。npm tokenベースの配布を禁止
- 今後のパッケージは必ず2FA・信頼ベースの検証後に配布
- 追加リスク検知、PR承認、ブランチ保護などを段階的に適用
教訓と今後の計画
- サプライチェーンとCI/CDパイプライン、ワークフロー権限の最小化の重要性をあらためて認識
- チーム内で再検討した後、コミュニティに学習内容を共有予定
問い合わせ
- security@nrwl.io に問い合わせ可能
参考および付録
- Githubの主要Issue、タイムライン、関連ポスト
- 感染パッケージ内の
telemetry.jsスクリプト例を提供 - このスクリプトは、ファイルシステム内の主要テキストファイルのパスをインベントリ作成目的で収集する
結論要約
- Nxと関連プラグインの最新アップデートとパッチ適用が重要
- npm、Githubなど主要認証情報の即時交換を推奨
- サプライチェーンセキュリティとワークフロー権限管理の不備が大規模事故につながり得ることを示した事例
まだコメントはありません。