npm installするだけでパスワードや鍵が盗まれる——このタイプの被害を生んできた最大の穴に、npmがようやく手を入れた。

何が変わったか

npm v12が2026年7月8日にGAとなり、依存パッケージのpreinstall/install/postinstallスクリプトが既定で実行されなくなった。Git依存関係やリモートURLからの依存解決も、明示的な許可がない限り既定でブロックされる。GitHubはインストール時のライフサイクルスクリプトを「npmエコシステムで最大のコード実行面」と位置づけており、今回の変更はその面を初期設定レベルで塞ぐものだ。

既存プロジェクトではnpm approve-scripts --allow-scripts-pendingを使って必要なスクリプトを洗い出し、信頼できるものだけをpackage.jsonに許可設定として明示する運用に切り替わる。node-gypによるネイティブビルドも暗黙的に実行されていたぶん影響を受けるため、ネイティブモジュールに依存するプロジェクトほど移行の手間は大きくなりそうだ。2026年8月初旬からは、2要素認証をバイパスする設定を持つトークンについても機密操作を制限する追加策が予定されている。.npmrcの未知のキーもエラーではなく警告扱いに変わり、レガシー設定を抱えるチームでも段階的に移行しやすくなっている。

他のパッケージマネージャーとの比較で見えること

実はこの発想自体は目新しいものではない。pnpmは以前から、許可リストにないパッケージのライフサイクルスクリプトを既定でブロックする設計を採ってきた。npmが最大手でありながらこの安全側の初期設定への転換にここまで時間がかかったのは、後方互換性への配慮とエコシステムの規模の大きさゆえだろう。逆に言えば、npmがようやく追いついたことで、「デフォルトで安全」という考え方がパッケージマネージャー全体の共通認識になったとも言える。

移行期には、CIが突然壊れる、ビルドが通らなくなるといった混乱があちこちで起きるはずだ。大規模プロジェクトを抱えるチームは、v12への切り替え前に一度npm approve-scriptsで依存関係を棚卸ししておくことをすすめたい。詳細はSocketの記事(原文)で確認できる。