世界を動かす技術を、日本語で。

npm v12の今後の重大な変更

概要

  • npm v12で セキュリティ強化 のためのデフォルト変更
  • スクリプト自動実行やGit/リモート依存解決 が明示的な許可制に
  • これらの変更はnpm 11.16.0以降で 警告として事前確認可能
  • 2026年7月リリース予定
  • 移行準備の具体的な手順案内あり

npm v12におけるセキュリティ関連のデフォルト変更

  • allowScriptsデフォルトOFF化

    • npm install実行時、 依存パッケージのpreinstall/install/postinstallスクリプトが自動実行されなくなる
    • 明示的に許可した場合のみスクリプト実行
    • native node-gypビルドもブロック対象 (binding.gypのみ存在し、installスクリプト明示なしでも)
    • git/file/link依存の prepareスクリプトも同様にブロック
    • ブロック対象スクリプトの確認
      • npm approve-scripts --allow-scripts-pendingコマンドでリストアップ
      • 信頼できるパッケージのみnpm approve-scriptsで許可
      • その他はnpm deny-scriptsで明示的に拒否
      • 許可リストは package.jsonに保存・コミット 推奨
    • npm 11.16.0以降では 警告表示で事前確認可能
  • --allow-gitデフォルトnone化

    • Git依存(直接・間接問わず)は 明示的に--allow-git指定時のみ解決
    • Git依存の.npmrcによるGit実行ファイル上書き等の コード実行経路を遮断
    • 2026-02-18に事前告知済み、npm 11.10.0+で利用可能
  • --allow-remoteデフォルトnone化

    • https tarball等リモートURLからの依存解決も --allow-remote明示時のみ許可
    • npm 11.15.0+で利用可能
    • 関連する--allow-file, --allow-directoryは デフォルト変更なし

移行準備方法

  • npm 11.16.0以上へアップグレード 推奨

  • 通常通りnpm install実行し、 警告内容を確認

  • npm approve-scripts --allow-scripts-pendingスクリプト実行対象パッケージの洗い出し

  • 信頼できるパッケージのみ approve・コミット、その他はdeny

  • アップグレード後は 許可したスクリプトのみ実行継続、未許可分は停止

    • 詳細は 公式ドキュメント (npm approve-scripts、npm deny-scripts、allow-scripts config)参照
    • 質問や意見は npmコミュニティディスカッション で受付

まとめ

  • npm v12は セキュリティ重視 の大幅変更
  • 既存プロジェクトは 事前準備・許可リスト運用 が必須
  • 2026年7月までに 対応推奨

Hackerたちの意見

npmがGitHubに買収されてたなんて知らなかった… そりゃそうなるよね…

大体の人は知ってるけど、実はその理由はGitHubがMicrosoftに買収されたからなんだよね。あ、MicrosoftはGitHubをAzureに移したし。

うん、2020年からだね。

NPMがGitHubに参加するってさ - https://news.ycombinator.com/item?id=22594549 (2020年3月16日; コメント571件; ポイント1829) - https://github.blog/news-insights/company-news/npm-is-joinin... いくつかは…面白いことになってるね。トップコメント: > Microsoftは全てを完璧にやるわけじゃないけど、GitHubの買収は正直予想以上にうまくいってる。MicrosoftがGitHubにMicrosoft寄りのポリシーを押し付けるのではなく、むしろGitHubの方がMicrosoftのやり方を取り入れてる、特に製品の観点からね。GitHubはまだ別会社として運営されてるし(ログインや医療、採用システムが違う)、独自のポリシーと視点を持ってる。> ...

NPM(会社)は2020年に倒産寸前だったんだよね。VCから資金調達したけど、持続可能なビジネスモデルは見つからなかった。GitHubがエコシステムを維持するために買収したけど、その買収はGitHubにはあまり利益になってない。

このリリースは、10年前に報告された脆弱性を修正してるよ。 https://www.kb.cert.org/vuls/id/319816

速報: 10年前の脆弱性がAIによって修正された!

結果として得られるホワイトリストはpackage.jsonに書き込まれるんだ。これって、12未満のデフォルトと同じプロセスにならない?

投稿からは明確じゃないけど、スクリプト用のホワイトリストはグローバル設定じゃなくてパッケージをホワイトリストするみたいだね。これで、特定のパッケージのためだけにスクリプトを許可する組織全体のルールを維持しやすくなるはず。こういうシナリオでパッケージマネージャーの設定で安全でないデフォルトを防ぐために使えるリンターってあるのかな?

OSS開発者として、npm経由で簡単にインストールできるようにいくつかのプリコンパイルされたバイナリを配布してるんだけど、大きな疑問があるんだ。allowScriptsは、パッケージを直接インストールする時(グローバルでもそれ以外でも)もデフォルトで無効になるのかな?

allowScriptsのデフォルトはオフなんだね。18ヶ月も経って、pnpmのやり方を追随してるのはいいけど、[時計をチェック]…。

これが公開されてから10年、NPMの内部では100回以上この話がされてると思うよ。Shai Haludの件で、無視できないほど大きくなっちゃったね。

よくわからない。これが何に役立つの?依存関係を引っ張って使うんでしょ?

コードを引っ張るのと、自分のマシンでスクリプトを実行するのは別だよね。

グローバルにインストールされたツールのスクリプトをどうやって許可するの?

package.jsonのallowリストはパッケージのバージョンに固定されるの?それともパッケージ名だけ?