投稿日: 2026/4/1
GMO Flatt Securityのこちらのブログにて記載されている対策にある、
npmの設定についての調査・記載です。
npm設定用のファイルです。
プロジェクト単位、ユーザー単位(ディレクトリ)での設定が可能です。
.npmrc
ignore-scripts=true min-release-age=7
指定された日数が経過しているバージョンをnpmがインストールします。
ライブラリのバージョンを固定していない場合、リリース日に関わらず最新バージョンをダウンロードしてしまうので、
侵害されたライブラリのダウンロードへのリスク低減策になります。
また、後述のignore-scrptsより迅速に、まず第一の対策としての導入としても効果的です。
指定日条件に合致するバージョンがない場合は、エラーになるようです。
参考:https://docs.npmjs.com/cli/v11/using-npm/config#min-release-age
package.json内のスクリプトの実行を制御する設定です。
悪意あるマルウェアのダウンロードさせるスクリプトの無効化が期待されます。
これは自身のpackage.jsonに関わらず、依存関係にあるライブラリのpackage.jsonに含まれるスクリプトも無視されます。
後述しますが、副作用が強いので設定導入には要確認です。
「npm install」コマンドの場合
実行時に自動で実行される以下スクリプト(Life Cycle Operation Order)すべてが無視されます。
以下のようなpackage.jsonファイルを作成します。
{ "name": "npm-test", "version": "1.0.0", "scripts": { "preinstall": "echo PREINSTALL", "install": "echo INSTALL", "postinstall": "echo POSTINSTALL", "prepublish": "echo PREPUBLISH", "preprepare": "echo PREPREPARE", "prepare": "echo PREPARE", "postprepare": "echo POSTPREPARE" }, "author": "shutx" }
「npm install」実行したところ、明示的に定義した、自動実行スクリプトが正常に実行されたことがわかります。
node ➜ /workspaces/npm-test $ npm install > npm-test@1.0.0 preinstall > echo PREINSTALL PREINSTALL > npm-test@1.0.0 install > echo INSTALL INSTALL > npm-test@1.0.0 postinstall > echo POSTINSTALL POSTINSTALL > npm-test@1.0.0 prepublish > echo PREPUBLISH PREPUBLISH > npm-test@1.0.0 preprepare > echo PREPREPARE PREPREPARE > npm-test@1.0.0 prepare > echo PREPARE PREPARE > npm-test@1.0.0 postprepare > echo POSTPREPARE POSTPREPARE up to date, audited 1 package in 234ms found 0 vulnerabilities
次に.npmrcファイルを作成し、ignore-scriptsを有効にします
ignore-scripts=true
「npm config list」コマンドで、設定が効いてるか確認します
node ➜ /workspaces/npm-test $ npm config list ; "global" config from /usr/local/etc/npmrc prefix = "/usr/local/share/npm-global" ; "project" config from /workspaces/npm-test/.npmrc ignore-scripts = true ; node bin location = /usr/local/bin/node ; node version = v24.14.0 ; npm local prefix = /workspaces/npm-test ; npm version = 11.9.0 ; cwd = /workspaces/npm-test ; HOME = /home/node ; Run `npm config ls -l` to show all defaults.
再度「npm install」を実行すると、スクリプトはなにも実行されていないことがわかります。
node ➜ /workspaces/npm-test $ npm install up to date, audited 1 package in 212ms found 0 vulnerabilities
これはpackage-lock.jsonを使う、「npm ci」でも同様の結果でした。
「npm restart」コマンドの場合は、
実行時に自動で実行される以下スクリプトのうち、「restart」スクリプトのみ実行されます
「restart」スクリプトは実行される理由については、ドキュメントに以下のように記載があります。
同様に、「npm run」コマンドで特定のスクリプトを指定する場合もignore-scripts設定は効かないようです。
Note that commands explicitly intended to run a particular script, such as npm start, npm stop, npm restart, npm test, and npm run-script will still run their intended script if ignore-scripts is set
npm start、npm stop、npm restart、npm test、npm run-script など、特定のスクリプトを実行することを明示的に意図したコマンドは、ignore-scripts が設定されている場合でも、対象のスクリプトを実行します
"scripts": { // 一部抜粋 "preinstall": "node scripts/preinstall-entry.js" }
XやGitHub上で見かけるignore-scripts設定は.npmrcに書くべきという意見については、CI/CDで正常動作が保証できる基盤があるという前提の上で、かなりセキュリティリスクを低減できると考えます。
いずれにせよ、ignore-scriptsの設定は事前の入念な調査・検証が必要になります。
参考:
まだコメントがありません