npmの自動実行スクリプトを無効化して、サプライチェーン攻撃からローカル環境を守る

npmの自動実行スクリプトを無効化して、サプライチェーン攻撃からローカル環境を守る

開発環境のセキュリティ、意識していますか?
2026年3月末に話題になった、有名パッケージ「Axios」に関連するインシデント(正確には依存関係に仕込まれた不正パッケージ plain-crypto-js によるRAT感染)は、npmのエコシステムに潜むリスクを再認識させる出来事でした。

日々の業務で npm install を叩く回数は計り知れません。
効率よく開発を進めるためにも、まずは足元の安全を確保する(=不用意なリスクを排除する)ことが重要です。

今回は、悪意のあるスクリプトの自動実行を未然に防ぐための ignore-scripts の設定方法と、その動作確認についてまとめました。

なぜ npm install が危険になり得るのか

npmパッケージには、インストール時(前後)に自動でスクリプトを実行する ライフサイクルスクリプトpreinstallpostinstall など)という機能があります。

本来はネイティブモジュールのビルドなどに使われる便利な機能ですが、サプライチェーン攻撃ではこれが悪用されます。

  1. 攻撃者が人気パッケージの依存関係に、悪意のあるパッケージを忍び込ませる。
  2. 開発者が npm install を実行する。
  3. パッケージがダウンロードされた直後、バックグラウンドで postinstall などが発火。
  4. ユーザー権限でOSのコマンドが実行され、環境変数(AWSのキー等)やSSH鍵が盗まれる。

つまり、「インストールしただけ」で被害が完了してしまうのが最大の脅威です。

解決策:グローバルで ignore-scripts を有効にする

この自動実行を防ぐには、npmのグローバル設定でライフサイクルスクリプトを完全に停止してしまうのが一番手っ取り早く、確実です。

ターミナルで以下のコマンドを実行します。

npm config set ignore-scripts true --global

設定の確認と、nodebrew環境におけるメリット

設定が反映されたか確認してみましょう。

npm config list --global

私のM3 Mac(nodebrewでバージョン管理中)環境では、以下のように出力されます。

; "user" config from /Users/omikuji/.npmrc

ignore-scripts = true

; node bin location = /Users/omikuji/.nodebrew/node/v24.14.0/bin/node
; node version = v24.14.0
; npm version = 11.9.0

ここで注目したいのは、設定が「グローバル(Nodeのインストール先)」ではなく「ユーザー設定(~/.npmrc)」に保存されている点です。

実は、nodebrewnvm などを利用している場合、本来のグローバル設定はNode.jsのバージョンごとに分離されてしまいます。
しかし、~/.npmrc に保存されていれば、Node.jsのバージョンを切り替えても設定が引き継がれます。常にセキュアな状態を維持できるため、この状態がベストプラクティスと言えます。

本当にブロックできているかテストする

設定しただけで満足せず、実際に防御が機能しているか検証してみましょう。
適当なディレクトリを作り、preinstall スクリプトを仕込んでインストールを実行します。

# テスト用ディレクトリを作成
mkdir ~/npm-test-scripts && cd ~/npm-test-scripts

# package.json を作成
npm init -y

# 警告メッセージを表示する preinstall スクリプトを仕込む
npm pkg set scripts.preinstall="echo '🚨 警告: スクリプトが実行されました! 🚨'"

# インストールを実行
npm install

実行結果

up to date, audited 1 package in 110ms
found 0 vulnerabilities

🚨 警告: スクリプトが実行されました! 🚨 というメッセージが表示されなければ、テストは成功です。
悪意のある自動実行スクリプトは完全に沈黙しています。

(確認が終わったら cd .. && rm -rf npm-test-scripts で掃除しておきましょう)

トレードオフと運用上の注意点

この設定を行うとセキュリティレベルは格段に上がりますが、引き換えに一部のパッケージで不都合が生じます。

  • node-gyp を使うような、インストール時にコンパイルが必要なライブラリがエラーになる。
  • husky などのGitフック設定が自動で走らなくなる。

こういった「安全だと分かっている」パッケージをインストールしたり、ビルドしたりする際だけは、明示的にブロックを解除して実行します。

# この時だけスクリプトの実行を許可する
npm install --ignore-scripts=false

少し手間は増えますが、認証情報が漏洩してインシデント対応に追われるリスクとストレスを天秤にかければ、安い投資です。

「自分が何をインストールし、何を実行しようとしているのか」を把握する。
この哲学を持って、安全なローカル開発環境を構築していきましょう。