npm v12 の破壊的変更: インストールスクリプトとリモート依存関係の新しいセキュリティデフォルト

デフォルトでインストールスクリプトが無効化

v12 からは、npm install は依存パッケージの preinstallinstallpostinstall スクリプトを自動的に実行しなくなります。この変更には、binding.gyp ファイルを含むパッケージに対する暗黙的な node-gyp rebuild 操作や、git、file、link 依存関係に対する prepare スクリプトも含まれます。

これらのスクリプトを管理するには、ユーザーは信頼できるパッケージを明示的に許可する必要があります。

  • Identification(識別): npm approve-scripts --allow-scripts-pending を実行して、ブロックされるパッケージを特定します。
  • Approval(承認): npm approve-scripts を使用して信頼できるパッケージを許可し、npm deny-scripts でその他をブロックします。
  • Persistence(永続化): 生成された許可リストは package.json に保存され、バージョン管理にコミットすべきです。

Git とリモート依存関係の解決の制限

潜在的なコード実行経路を閉じるため、npm v12 は外部ソースからの依存関係の解決方法を制限します。

Git 依存関係

npm install--allow-git フラグが使用されない限り、Git 依存関係(直接または間接)を解決しなくなります。これにより、Git 依存関係の .npmrc が Git 実行ファイルを上書きできるシナリオを防止します。この脆弱性はスクリプトが無視されても残ります。

リモート URL 依存関係

HTTPS タールボールなどのリモート URL から解決される依存関係は、--allow-remote フラグが提供されない限りデフォルトでブロックされます。--allow-file--allow-directory フラグは v12 でも現在のデフォルト設定を維持することに注意してください。

準備と移行パス

開発者は npm 11.16.0 以降にアップグレードすることで v12 への移行準備ができます。このバージョンでは、v12 でブロックされる動作に対して警告が表示されます。推奨されるワークフローは、標準インストールを実行し、警告を確認し、npm approve-scripts --allow-scripts-pending を使用して必要な許可リストを package.json に作成・コミットすることです。

コミュニティの視点と技術的批評

この発表は、開発者の間でこれらの変更のタイミングと有効性について大きな議論を呼び起こしました。

サプライチェーンセキュリティ

一部のユーザーは、これらの変更が長らく知られていた脆弱性に対処していると指摘し、あるユーザーは10年前に報告された脆弱性を例に挙げました。オプトインモデルへの移行はサプライチェーン攻撃と戦うために必要なステップだという合意が一般的ですが、pnpm など他のパッケージマネージャに既に存在するパターンの遅い採用だと主張する声もあります。

有効性と限界

批評家は、実行をインストールフェーズからランタイムフェーズへ移すことはリスクを排除せず、単に移すだけだと主張しています。

"Now all the malware can move from the install script to the module itself where it will inevitably still be run"

「今やすべてのマルウェアはインストールスクリプトからモジュール自体へと移動でき、そこでは必然的に実行され続ける」

他の開発者は、許可リストに依存するのではなく、実際の実行前にどのプログラムが起動するかを出力するサンドボックスやシミュレーション実行を組み込む、より堅牢な解決策が必要だと提案しています。

使いやすさに関する懸念

CLI の操作性に関する批判があり、特に npm approve-scripts --allow-scripts-pending の名前付けが直感的でないと指摘されています。コマンドは承認アクションを実行するのではなくリストを表示するためです。

Sources