npm パッケージに関する最近の攻撃と、当面の工夫ポイント(ご参考までに)
最近、npm パッケージにマルウェアが混入するサプライチェーン攻撃がいくつか報告されています。
少し気になるニュースですよね…。
ここでは、「こういうやり方もあるよ」という暫定的な工夫の例をまとめてみました。
「へぇ、こういう選択肢もあるのか」くらいで見ていただければ嬉しいです ![]()
避けたほうがいい操作(npm CLI)
-
npmによる新規パッケージ追加
例:npm install foo-bar
-
npmによるアップデート
例:npm update
-
npxの実行
例:npx foo-bar
こうした操作は「新しく公開されたばかりのパッケージ」をすぐに拾ってしまうため、リスクが少し高めです。
操作npmの代わりにpnpmを使う
pnpm は Node.js のパッケージマネージャーで、npm や yarn と同様に利用できます。
npmのようにすべてのパッケージが互いにアクセスできる「フラット構造」ではなく、明示的に宣言されたもののみアクセス可能な「厳密分離」により、意図しない依存関係やmaliciousパッケージの影響を根本的に防ぎます。
-
pnpm のインストール
1. Homebrew (macOS / Linux)
brew install pnpm
macOS や Linux ユーザーで Homebrew を利用している場合は、この方法が一番手軽です。2. npm 経由
すでに Node.js と npm が入っている場合はこちら:
npm install -g pnpm3. Corepack (Node.js 16.13+)
Node.js 16.13 以降には Corepack が同梱されており、以下で有効化できます。
corepack enable corepack prepare pnpm@latest --activate4. 手動インストール (スクリプト利用)
curl で直接インストールする方法もあります。
curl -fsSL https://get.pnpm.io/install.sh | sh -5. Windows (Scoop)
Windows ユーザーは Scoop でも入れられます。
scoop install pnpm -
既存プロジェクトで lockfile を変換
もしpackage-lock.jsonがある場合、pnpm が自動でpnpm-lock.yamlを生成してくれます。pnpm import
-
依存関係をインストール
pnpm install -
以後は pnpm コマンドを利用
pnpm add react pnpm remove lodash pnpm update
※ 一部スクリプトや CI の設定に npm 固有の記述があれば修正が必要ですが、基本的にはこの流れで移行可能です ![]()
また、pnpm には 「公開から〇日以上経ったパッケージだけインストールする」 という仕組みがあります。
これを使うと、もし「公開直後に仕込まれたマルウェア」があっても、ある程度見つかるまで待つことができます。
たとえば、リリースから1日経ったものだけ許可するには:
pnpm config set minimumReleaseAge 1440
(単位は分なので、1440 = 1日)
pnpm が難しいときの妥協案
-
既存の lockfile を使って
npm installするのは OK -
新規パッケージ追加時は
--beforeオプションで「数日以上前」のものを指定npm install foo-bar --before 2025-09-11
2. 依存のアップデート(CI 編)
CI で自動更新を使っている場合は、リリースから少し時間を置く設定もできます。
-
Renovate →
minimumReleaseAge -
Dependabot →
cooldown