npm v12でinstallスクリプトが標準無効化へ — サプライチェーン攻撃を防ぐ最大の転換点を徹底解説

はじめに

npm install を実行した瞬間、あなたのマシンでは数百もの依存パッケージのスクリプトが自動的に走っている——この「当たり前」がついに終わりを迎えようとしている。GitHubは2026年7月リリース予定の npm v12 で、パッケージインストール時のライフサイクルスクリプトをデフォルトで無効化すると発表した。これはNode.jsエコシステムにとって近年最大級のセキュリティ転換点だ。本記事では、何がどう変わるのか、なぜ今このタイミングなのか、そして開発者が今すぐやるべき準備までを、実際の攻撃事例を交えて解説する。

何が変わるのか — allowScriptsがデフォルトoffに

npm v12では、依存パッケージの preinstall / install / postinstall スクリプトが、開発者の明示的な許可なしには実行されなくなる。設定項目 allowScripts がデフォルトで無効になり、スクリプト実行は「許可リスト(allowlist)方式」へと変わる。

注意すべきは、対象が package.json に書かれた明示的なスクリプトだけではない点だ。binding.gyp ファイルが存在すると暗黙的に走る node-gyp のネイティブビルド も、v12では同等に扱われブロックされる。さらに Git依存関係 も明示的な許可なしには解決されなくなる。

操作はすでに npm 11.16.0 以降で先行提供されている。具体的には次のコマンドで管理する。

  • npm approve-scripts --allow-scripts-pending — 承認待ちのパッケージを確認
  • npm approve-scripts — 信頼できるパッケージを許可リストに追加
  • npm deny-scripts — 拒否
  • Git依存は --allow-git、リモートURL依存は --allow-remote で個別制御

許可/拒否の結果は package.json に記録されコミットできるため、チーム全体で同じポリシーを共有できる。

技術的背景 — なぜ「installスクリプト」が狙われるのか

GitHubはインストール時のライフサイクルスクリプトを「npmエコシステムにおける単一最大のコード実行面(the single largest code-execution surface)」と表現する。理由は単純だ。npm install は直接依存だけでなく、すべての推移的依存(transitive dependency)のスクリプトを実行する。つまり依存ツリーのどこか一つでも乗っ取られれば、開発者のマシンやCIランナー上で任意コードが走ってしまう。

この危険性は理論ではなく、ここ1年で繰り返し現実になった。

  • Nx s1ngularity(2025年8月): 盗まれたpublishトークンで仕込まれた postinstall 内の telemetry.js が、GitHubトークン・npm認証情報・SSH鍵・暗号資産ウォレットを抽出して公開リポジトリにアップロード。約2,300件の認証情報が流出した。
  • Shai-Hulud(2025年11月): 自己複製するワーム。Bunランタイムを勝手に導入し、TruffleHogで機密情報をスクレイピングしながら約500パッケージに拡散した。
  • axios事件(2026年3月): メンテナーアカウント乗っ取りにより、postinstall のみを目的とする依存を経由してクロスプラットフォームのRAT(遠隔操作ツール)を展開。axiosは週1億ダウンロードの巨大パッケージだ。

いずれも「インストールした瞬間に実行される」という仕様を悪用している。スクリプトを止めるだけで、攻撃面の大部分を一気に閉じられるわけだ。

エンジニアへの影響 — pnpm/yarnは既に先行、npmが追いついた形

実は同種の防御は他のパッケージマネージャが先行していた。npm v12は「業界標準に追いついた」と捉えるのが正確だ。

  • pnpm: v10で依存の postinstall 自動実行を無効化済み。v11では minimumReleaseAge(デフォルト1440分=1日、公開直後の新バージョンを即時インストールしない)と strictDepBuilds がデフォルト有効。ビルド許可は allowBuilds マップで管理する。
  • Yarn Berry(v4): スクリプトブロックと3日間のリリースクールダウンが標準。enableHardenedMode の有効化が推奨される。

ここで実務上の最大の注意点が ネイティブモジュールのビルド だ。bcrypt、sharp、better-sqlite3 など、正当なパッケージの多くは postinstall でネイティブバイナリをビルドしている。v12移行後はこれらも明示的な承認が必要になるため、何も準備しないと「ビルドが通らない」「バイナリが見つからない」といった障害が起きうる。

今すぐ着手すべき準備は次の通りだ。

  1. npm 11.16.0以上にアップグレードし、警告モードで挙動を先に確認する
  2. npm approve-scripts --allow-scripts-pending でどのパッケージがスクリプトを必要としているか棚卸しする
  3. ネイティブビルドが必要な依存だけを承認し、package.json にコミットしてCI/チームへ展開する
  4. CIパイプラインで承認済みリストが反映されるか、リリース前に検証する

まとめ

  • npm v12(2026年7月予定)で、依存パッケージのinstallスクリプトがデフォルト無効化される。
  • 対象は postinstall 等の明示スクリプトに加え、node-gypの暗黙ビルドやGit依存も含む。
  • Nx s1ngularity・Shai-Hulud・axios事件など、現実の攻撃が後押しした「待ったなし」の変更だ。
  • pnpm/yarnは既に同等の防御を標準化しており、npmが業界標準に合流する形となる。
  • ネイティブビルドを使うプロジェクトは要注意。今のうちに11.16.0で棚卸しし、許可リストを整備しておきたい。

「依存を入れる=コードを実行する」という暗黙の前提が崩れる以上、サプライチェーンに対する開発者の意識そのものも更新が求められる。7月を待たず、今日から approve-scripts で自分のツリーを点検しておくことを強くおすすめする。

今日のその他のニュース

Xiaomiがコーディングエージェント「MiMo Code」をオープンソース公開 — Claude Code / Codex系の選択肢がまた一つ増えた。HN 294ptsと注目度が高く、中国勢のAIコーディングツール参入が加速している。(Gigazine)

Homebrew 6.0.0リリース — macOSパッケージマネージャの定番がメジャーバージョンアップ。HN 388ptsと本日トップの話題。ローカル開発環境を持つ人は更新内容の確認を。(brew.sh)

Google「DiffusionGemma」公開 — 拡散モデルベースで最大4倍高速を謳う新LLMを無償公開。推論速度を重視するローカルLLM用途で要注目だ。(PC Watch)

ソース