GitHubがnpmインストールスクリプトの悪用を防ぐ自動制御機能を導入

GitHubは、npm v12のリリースに向けて、セキュリティを重視した大規模なnpmの刷新を発表しました。ソフトウェアサプライチェーン攻撃の緩和とパッケージインストール時の不正コード実行を防止するため、より厳格なデフォルト制御が導入されます。

これらの変更は、npmバージョン11.16.0以降でオプトインの警告機能として利用可能となっており、2026年7月にnpm v12が正式リリースされた際にデフォルトの動作となる予定です。

悪意あるnpmを防ぐ自動制御機能

今回のアップデートの核心は、npmのインストール時スクリプトの扱い方における根本的な方針転換にあります。インストール時スクリプトは、脅威アクターが悪意あるコードを実行するために長年にわたって悪用されてきた攻撃ベクターです。

npm v12では、allowScriptsの設定がデフォルトでオフになります。つまり、preinstallinstallpostinstallといったライフサイクルスクリプトは、開発者が明示的に承認しない限り、依存関係として自動実行されなくなります。

この変更は、node-gypによるネイティブモジュールのビルドなど、暗黙的なスクリプト実行にも影響します。これらも許可しない限りブロックされるようになります。

また、npmは同ポリシーのもと、Git、ローカルファイル、リンクされた依存関係からのprepareスクリプトの実行も制限します。開発者はnpm approve-scripts --allow-scripts-pendingコマンドを使用して、スクリプトの実行を試みている依存関係を確認できます。

信頼できるパッケージはnpm approve-scriptsで明示的に許可リストに追加し、信頼できないものはnpm deny-scriptsでブロックすることが可能です。作成されたポリシーはpackage.jsonファイルに保存されるため、開発環境全体でバージョン管理によるポリシーの適用が可能になります。

もう一つの重要な変更点はGitベースの依存関係に関するものです。--allow-gitフラグのデフォルトが「none」となり、明示的に有効化しない限りnpmがGit依存関係を解決できなくなります。

この対策は、以前から指摘されていたリスクへの対応です。Gitリポジトリ内に悪意ある.npmrc設定が含まれている場合、Gitの実行ファイルパスが上書きされ、--ignore-scriptsでスクリプト実行をオフにしていても任意のコマンドが実行される可能性がありました。

同様に、npm v12では--allow-remoteフラグのデフォルトが「none」に設定され、リモートの依存関係ソースにも制限が加わります。

これにより、明示的に許可しない限りリモートのtarball URLからのインストールが禁止され、公式レジストリ外から配布される未検証または改ざんされたパッケージへの露出リスクがさらに低減されます。なお、--allow-file--allow-directoryといった関連フラグは現在の動作が維持されます。

npm v12の主なセキュリティ変更点

制御 / フラグ v12での新しいデフォルト 開発者への影響 セキュリティ上のメリット
allowScripts オフ(スクリプトはデフォルトでブロック) 依存関係のpreinstallinstallpostinstallprepareスクリプトは、package.jsonで明示的に許可リストに追加しない限り実行されない。 npm install時に悪意ある、または乗っ取られたインストールスクリプトが任意のコードを実行するリスクを低減。
npm approve-scripts プロジェクト単位の明示的な許可リスト チームはnpm approve-scripts --allow-scripts-pendingを実行し、スクリプトを持つパッケージを確認、信頼できるものを承認して更新したpackage.jsonをコミットする必要がある。 スクリプト実行に対する明示的な信頼を強制し、スクリプト関連のリスクをバージョン管理上で可視化・監査可能にする。
--allow-git none --allow-gitを設定しない限り、以前使用していた場合でもGit依存関係(直接・推移的を問わず)が解決されない。 Git依存関係の.npmrcがGit実行ファイルを上書きしてコード実行を達成できる経路を遮断。
--allow-remote none リモートURL依存関係(例:HTTPSのtarball)は、--allow-remoteで明示的に許可しない限りブロックされる。 npmレジストリ外でホストされた未検証のアーティファクトへの露出を制限し、サプライチェーン侵害のリスクを低減。
--allow-file--allow-directory デフォルトの変更なし ローカルファイルおよびディレクトリの依存関係は現在のデフォルトのまま動作し続ける。 既存のローカルワークフローを安定に保ちつつ、リスクの高いリモートおよびGitベースの経路のみを強化。
移行準備 npm ≥ 11.16.0を使用 npm 11.16.0以降にアップグレードし、通常のインストールを実行して警告を確認。スクリプトを承認または拒否し、v12への移行前に更新した許可リストをコミットする。 ビルドを壊すことなく厳格なデフォルトへスムーズに移行しつつ、サプライチェーン防御を段階的に強化。

これらの破壊的変更に備えるため、GitHubはnpm 11.16.0以降へのアップグレードと標準的なインストールワークフローの実行による警告の確認を推奨しています。

開発者はフラグが立てられたパッケージを確認し、信頼できるスクリプトを承認したうえで更新した設定をコミットすることで、スムーズな移行が可能になります。npm v12を採用すると、明示的に承認されたスクリプトのみが実行されるようになり、依存関係の動作に対する暗黙的な信頼が事実上排除されます。

これらの変更は、JavaScriptエコシステムにおけるサプライチェーンセキュリティ強化に向けたGitHubの広範な取り組みを反映しています。暗黙的な実行から明示的な信頼へと方針を転換することで、npm v12は依存関係ベースの攻撃リスクを大幅に低減することを目指しています。こうした攻撃は近年、悪意あるパッケージ、侵害されたメンテナー、難読化されたインストールスクリプトを通じて開発者を標的にするケースが増加しています。

翻訳元: https://gbhackers.com/github-introduces-automatic-controls-to-prevent-malicious-npm/

ソース: gbhackers.com