Node.jsのサプライチェーン攻撃を防ぐために現実的にできること
このところ、npmのサプライチェーン攻撃が流行しています。npm installだけで感染してしまうため、AIを使ったバイブコーディングで知らないうちに感染してしまうのではと不安に思っている方も多いと思います。npmのサプライチェーン攻撃対策の要は、大きく次の3つです。
- 公開されて間もないパッケージをインストールできないようにする
- postinstallスクリプトの実行を防ぐ
- ロックファイルを適切に運用する
具体的なやることを以下にまとめました。
npmのサプライチェーン攻撃対策
うちはpnpmやyarnだからnpmは関係ないよと思われるかもしれませんが、pnpmを使っていてもnpmが無効化されるわけではないので、うっかりnpm installしても大丈夫なようにします。.zshrcにエイリアスを切っているとかpnpmしか使えなくしてあるとかいう人も念のため実施することをおすすめします。
npmのバージョンを11.10以上にアップグレードする
2026年2月リリースのnpm 11.10.0からmin-release-ageがサポートされました。これは今回の対策に必須なので、それ以前のバージョンのnpmを使っている場合はアップグレードしてください。
npm install -g npm
npm --version
11.12.1.npmrcの設定を行う
以下の設定をグローバルに行います。プロジェクト単位に指定してもよいですが、このほうが安全だと思います。min-release-ageは7日としていますが、適宜調整してください。
# 7日以上経過したパッケージのみインストール可能
npm config set min-release-age 7
# postinstallスクリプトを実行しない
npm config set ignore-scripts true~/.npmrcは以下のようになります。
min-release-age=7
ignore-scripts=truepnpmのサプライチェーン攻撃対策
以前はnpmにmin-release-ageの設定がなかったので、対策にはpnpmが必須でしたが、前述したように今はnpmだけでも対策できるようになりました(11.10.0以上へのアップグレードは必須)。pnpmを使う場合は、別途pnpm-workspace.yamlにminimumReleaseAgeを設定します。pnpmではpostinstallスクリプトの実行はデフォルトで無効化されています。
minimumReleaseAge: 10080
sharedWorkspaceLockfile: false # 個別にロックファイルを持つ場合
packages:
- 'my-app'ロックファイルを適切に運用する
ロックファイル(package-lock.json等)は必ずソースコード管理に含めるようにします。ロックファイルを使うことで、決められたバージョン以外のパッケージをインストールしてしまうことを防げます。ロックファイルに不整合があったり、ロックファイルが存在しない場合にはインストールが失敗します。パッケージの更新時以外は以下のコマンドでのインストールを徹底します。
# npm
npm ci
# yarn
yarn install --frozen-lockfile
# pnpm
pnpm install --frozen-lockfile
# bun
bun install --frozen-lockfileAIが暴走しても絶対防げるの?
防げません。ignore-scripts=true にしていても、AIがトチ狂って npm rebuildするかもしれません。というかnpmを防いでもbundle installするかもしれませんし、curl <URL> | shするかもしれません。
通常、コーディングエージェントがコマンドを実行するときに承認を求められると思いますが、深く考えずに承認してしまうこともあるでしょう。現時点では、AIの暴走を完全に防ぐのは無理と割り切って使うしかありません。
どうしても心配な方は、Claude Codeをクラウドやサンドボックス環境で使う方法もありますので、必要に応じて検討してみてください。
参考
サプライチェーン攻撃から身を守るために最低限設定しておきたいこと