概要
- nxパッケージ および関連プラグインで 悪意あるバージョン がnpmに公開
- インストール時に認証情報を収集し、GitHubリポジトリへ送信
- 複数バージョンが影響、現在はnpmから削除済み
- 攻撃経路はnpmトークンの漏洩 と推定
- 対策と今後の予防策 も実施済み
nxパッケージおよび関連プラグインへのサプライチェーン攻撃概要
- 悪意あるnxパッケージ および一部プラグインがnpmに公開
- postinstallスクリプト により、ファイルシステムを走査し認証情報やテキストファイルのパスを収集
- 収集情報は ユーザーのGitHubアカウント下のリポジトリへエンコードして送信
- .zshrcや.bashrc にも改変が加えられ、sudo shutdownコマンドを追加
- 影響バージョン は全てnpmから削除済み
影響を受けたバージョン一覧
- 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
- @nx/devkit, @nx/js, @nx/workspace, @nx/node: 21.5.0, 20.9.0
- @nx/eslint: 21.5.0
- @nx/key, @nx/enterprise-cloud: 3.2.0
- 全て2025年8月26日以降に公開、同日もしくは翌日npmから削除
攻撃経路と悪意ある挙動
- npmトークンの漏洩 により公開権限が奪取された可能性
- postinstallスクリプト によるファイルスキャン・認証情報収集・GitHubリポジトリへのアップロード
- .zshrc/.bashrc の改変でsudo shutdownコマンド追加、パスワード入力で即時シャットダウン
- GitHubリポジトリ にエンコード形式で情報送信
タイムライン(主要な出来事)
- 2025年8月21日: 脆弱なGitHub Actionsワークフローがマージ
- 2025年8月24日: 攻撃者がNPMトークンを取得、悪意あるコミットを含むPRが作成
- 2025年8月26日: 悪意あるパッケージがnpmに複数公開
- 2025年8月26日夜: GitHub IssueやNPMサポートへの報告、npmによるバージョン削除・トークン無効化
- 2025年8月27日: セキュリティアドバイザリ公開、影響ユーザーへの通知、追加調査と対策
直ちに必要な対応
- GitHubアカウントでs1ngularity-repository が作成されていないか確認
- https://github.com/[GithubSlug]?tab=repositories&q=s1ngularity-repository
- 該当リポジトリが存在する場合、ファイルをダウンロードし削除
- security@nrwl.io へ連絡し、情報漏洩内容の確認依頼
- 全アカウントの認証情報・トークンのローテーション
- 悪意あるバージョンのアンインストールと最新版への更新
- npm uninstall nx && npm install nx@latest
- npm cache clean --force
もし被害を受けた場合の追加対応
- npmトークンのローテーション (https://www.npmjs.com/)
- GitHubトークンのローテーション (https://www.github.com/)
- GitHubや他サービスのパスワード変更
事前に実施されていた予防策
- 2FA(2段階認証)の強制 (公開権限には未適用だった)
- パッケージのProvenance付与 による整合性検証
追加で実施された対応・再発防止策
- 悪意あるバージョンの全廃止・21.4.1を最新に復元
- 全チームメンバーのNPM/GitHubトークンのローテーション
- 組織全体のGitHub/NPMアクティビティ監査
- nxの公開権限に2FAまたは自動化必須
- Trusted Publisher方式への移行、NPMトークン廃止
- 全パッケージで2FA必須化、トークンによる公開禁止
- パイプラインの外部コントリビューター承認制
参考情報・問い合わせ先
- security@nrwl.io (質問・相談窓口)
- 詳細なポストモーテムやブログ記事
- https://www.stepsecurity.io/blog/supply-chain-security-alert...
- https://semgrep.dev/blog/2025/security-alert-nx-compromised-...
- 関連GitHub Issue: #32522, #32523
Appendix: 悪意あるスクリプト例
- telemetry.js: テキストファイル等のパスを収集し/tmp/inventory.txtへ出力、内容はリポジトリ経由で送信
注意: 今後も追加情報があればアドバイザリが更新される予定