2025年7月中旬、JavaScriptエコシステムを支えるnpmで深刻なサプライチェーン攻撃が発生し、広く使われているPrettier系ツールパッケージがマルウェアに汚染される事態となりました。この攻撃の発端は、npmのメンテナが標的となったフィッシング詐欺により認証トークンが盗まれたことに始まります。
関連記事
・JavaScriptやNode.jsで40本以上のパッケージが改ざんされるサプライチェーン攻撃-NPMエコシステムへ再び攻撃
・GitHubがnpm サプライチェーン攻撃の防御を強化-二要素認証の必須化やトークンを7日に
攻撃の概要:npmパッケージが不正更新
攻撃者は”npnjs.com”というタイプミスを利用した偽ドメイン:タイポスクワッティング サイトを使い、npmの公式サポートを装ったフィッシングメールを配信。
対象となったeslint-config-prettierのメンテナが誤って認証トークンを入力してしまい、そのトークンが悪用されました。
その結果、以下のパッケージおよびバージョンにマルウェアが含まれる不正な更新が公開されました
- eslint-config-prettier: 8.10.1, 9.1.1, 10.1.6, 10.1.7
- eslint-plugin-prettier: 4.2.2, 4.2.3
- synckit: 0.11.9
- @pkgr/core: 0.2.8
- napi-postinstall: 0.3.1
- got-fetch: 5.1.11, 5.1.12
いずれの更新もGitHub上にはコミットやプルリクエストの履歴が存在せず、npmレジストリだけに公開されていたことが異常として早期発見に繋がりました。
マルウェアの挙動:Windows環境を標的に
不正なバージョンには”install.js”というスクリプトが含まれており、インストール時にWindows向けのDLL(node-gyp.dll)をrundll32.exeで実行するコードが仕込まれていました。
このDLLは、VirusTotal上でも多数のセキュリティエンジンによりトロイの木馬として認識されており、リモートコード実行(RCE)の可能性も指摘されています。
特にCI/CD環境やWindows開発マシンでこのようなバージョンがインストールされた場合、セキュリティ事故や情報漏洩のリスクが高まると考えられます。
対応と今後の対策
被害を受けたメンテナは速やかに以下の対応を行いました:
- 不正アクセスに使用されたnpmトークンの無効化と再発行
- npm上で不正バージョンを非推奨(deprecated)に設定
- npmサポートと連携し、該当バージョンの削除
また、影響を受けたユーザーおよび開発者に対し、以下の対応を強く推奨しています
- lockfileの確認:package-lock.jsonやyarn.lock等を確認し、該当バージョンが含まれていないかチェック。
- キャッシュとモジュールの削除:不正バージョンが含まれていた可能性がある場合は、
node_modulesを削除し、npm cache clean --forceを実行。 - 安全なバージョンへの固定:依存パッケージはlatestではなく、安全な固定バージョン(例:eslint-config-prettier 10.1.5以前)を指定。
- npmアカウントに2FAを有効化:今後の被害防止のため、多要素認証(MFA)を導入。
npmエコシステムの課題と教訓
この事件は、以下の3段階の典型的なサプライチェーン攻撃として分類されます
- フィッシング攻撃でメンテナの認証情報を取得
- npmに不正なバージョンを公開
- CI/CDや開発環境に自動的にマルウェアが取り込まれる
今回の件では、攻撃者が他のメンテナ情報やメールアドレスをnpm上から容易に取得できるという点も問題視されています。多くのプロジェクトが自動化されたDependabotやRenovateなどの依存関係管理ツールを利用しており、最新バージョンがマルウェアでも自動で取り込まれるリスクがあります。
Socketなどのセキュリティベンダーは、異常なバージョンの検知や事前スキャンによる防御を提供していますが、npmエコシステム全体としてのセキュリティ対策が今後ますます重要になっていくでしょう。
参照
https://socket.dev/blog/npm-phishing-campaign-leads-to-prettier-tooling-packages-compromise







