npm パッケージに関する最近の攻撃について

npm パッケージに関する最近の攻撃と、当面の工夫ポイント(ご参考までに)

最近、npm パッケージにマルウェアが混入するサプライチェーン攻撃がいくつか報告されています。
少し気になるニュースですよね…。

ここでは、「こういうやり方もあるよ」という暫定的な工夫の例をまとめてみました。
「へぇ、こういう選択肢もあるのか」くらいで見ていただければ嬉しいです :raising_hands:


避けたほうがいい操作(npm CLI)

    • npmによる新規パッケージ追加
      例:npm install foo-bar
    • npmによるアップデート
      例: npm update
  • npx の実行
    例:npx foo-bar

こうした操作は「新しく公開されたばかりのパッケージ」をすぐに拾ってしまうため、リスクが少し高めです。

操作npmの代わりにpnpmを使う

pnpm は Node.js のパッケージマネージャーで、npm や yarn と同様に利用できます。
npmのようにすべてのパッケージが互いにアクセスできる「フラット構造」ではなく、明示的に宣言されたもののみアクセス可能な「厳密分離」により、意図しない依存関係やmaliciousパッケージの影響を根本的に防ぎます。

  1. pnpm のインストール

    1. Homebrew (macOS / Linux)

    brew install pnpm
    
    

    :backhand_index_pointing_right: macOS や Linux ユーザーで Homebrew を利用している場合は、この方法が一番手軽です。

    2. npm 経由

    すでに Node.js と npm が入っている場合はこちら:

    npm install -g pnpm
    
    

    3. Corepack (Node.js 16.13+)

    Node.js 16.13 以降には Corepack が同梱されており、以下で有効化できます。

    corepack enable
    corepack prepare pnpm@latest --activate
    
    

    4. 手動インストール (スクリプト利用)

    curl で直接インストールする方法もあります。

    curl -fsSL https://get.pnpm.io/install.sh | sh -
    
    

    5. Windows (Scoop)

    Windows ユーザーは Scoop でも入れられます。

    scoop install pnpm
    
  2. 既存プロジェクトで lockfile を変換
    もし package-lock.json がある場合、pnpm が自動で pnpm-lock.yaml を生成してくれます。

    pnpm import

  3. 依存関係をインストール

    pnpm install
    
    
  4. 以後は pnpm コマンドを利用

    pnpm add react
    pnpm remove lodash
    pnpm update
    
    

※ 一部スクリプトや CI の設定に npm 固有の記述があれば修正が必要ですが、基本的にはこの流れで移行可能です :man_gesturing_ok:

また、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


2 Likes

Safe Chainを使うのもよさそうですね。

3 Likes