npmは「知らない誰かの部品を自分のPCに入れて動かす」仕組みです。だからこそ知っておきたいのが、サプライチェーン攻撃——部品の供給ルートに毒を混ぜる攻撃と、その代表例Shai-Hulud事件。難しい話に見えますが、対策の中心は「インストールの習慣」なので、初心者こそ今日から身を守れます。
npmnpmってなに?——npm installは何をしている?npm・node_modulesがまだピンと来ない人は、先にこちらをサプライチェーン攻撃=材料に毒を混ぜる
あなたのサイトを直接ハッキングするのは大変です。そこで攻撃者は発想を変えました——みんなが使う部品(パッケージ)のほうに毒を仕込めば、インストールした全員に毒が届く。これがサプライチェーン(供給網)攻撃です。
npmのパッケージは、インストールの瞬間に付属のプログラムを実行できる仕組みを持っています。つまり感染した部品は、npm installと打ったその瞬間にあなたのPCで動き出します。ビルドや実行を待つまでもありません。
Shai-Hulud事件——自己増殖する「ワーム」
2025年、この攻撃が過去最大の規模で現実になりました。名前の由来は小説『デューン』の巨大砂虫です。
- 2025年9月(第1波)——感染パッケージをインストールすると、PC内のnpmやGitHubの認証情報(合鍵)を探して盗む。そして盗んだ合鍵で、その開発者が公開している別のパッケージにも毒を仕込んで公開——人手を介さず感染が広がる「ワーム(自己増殖型)」でした
- 2025年11月(第2波「The Second Coming」)——さらに大規模な再来。ZapierやPostHog、Postmanなど有名どころを含む約800パッケージ・1,000超のバージョンが汚染され、盗まれた情報が数万のGitHubリポジトリに公開されました
被害者は「怪しいサイトを踏んだ人」ではありません。いつもどおりnpm installしただけの開発者です。ここがこの事件のいちばん怖いところ。
対策1:バージョンを「ぴったり」で固定する
package.jsonのバージョンが^1.2.3のような範囲指定だと、package-lock.jsonがまだ無い状態でのインストール(新規に入れるとき、lockを消したとき、対策2で触れるlockごと更新するとき)では、その時点の範囲内で最新版が入ります。毒入りの新バージョンが公開された直後にインストールすると、自動でそれを引き当ててしまう——Shai-Huludが広がった経路そのものです。
1.2.3のように記号なしのぴったり指定(バージョン固定)にしておけば、勝手に新しい版へは進みません。更新は「自分で選んで上げる」意識的な行動になります。
npm config set save-exact trueこの設定をしておくと、以後のnpm install <名前>が自動で^なしの固定表記で記録されます。
対策2:package-lock.jsonを大切にする
package-lock.jsonは「実際に入った全部品の正確な記録」。これをGitに入れておけば、次のインストールでも記録どおりの同じ部品が入ります。範囲指定の^が残っていても、lockファイルがブレを止めてくれる保険です。
- Gitに必ずコミットする(.gitignoreに入れない)
- CIや再インストールでは
npm ciを使うと、lockファイルの記録に完全一致する形で入ります
対策3:出たばかりの新バージョンに飛びつかない
毒入りバージョンは、公開から数時間〜数日で発見・削除されるのがふつうです。逆に言えば、公開直後こそ危険地帯。「新しい版が出た!」とすぐ上げず、数日〜2週間ほど様子を見てから上げるだけで、リスクは大きく下がります。実際、Shai-Hulud後は大手企業も「公開後14日間は新バージョンを入れない」運用を採用しました。
対策4:知らないプロジェクトを気軽にnpm installしない
インストールの瞬間にプログラムが動く——ということは、GitHubで拾った素性の分からないプロジェクトでのnpm installは、知らない人のプログラムの実行ボタンです。試したいだけなら、付属プログラムの実行を止めるオプションがあります。
npm install --ignore-scripts対策5:入れる前に一呼吸——パッケージの「身元確認」
新しいパッケージを入れる前に、npm公式サイトでそのページを30秒だけ眺めましょう。
- 週間ダウンロード数——極端に少ないものは慎重に
- 名前のつづり——人気パッケージの打ちまちがいを装った偽物(タイポスクワッティング)が実在します
- 最終更新日と説明文——放置されていないか、説明がまともか

対策6:npm auditで足元を確認する
すでに入っている部品の中に、知られている脆弱性がないかをまとめてチェックしてくれるコマンドもあります。
npm audit危険度つきの一覧が出るので、npm audit fixで自動修正を試すこともできます(新しいメジャーバージョンに一気に上がることがあるので、fixの後は動作確認を忘れずに)。
このレッスンのまとめ
- サプライチェーン攻撃は部品に毒を混ぜる攻撃。npmでは
npm installの瞬間に毒が動く - Shai-Hulud事件(2025年)は自己増殖型で数百パッケージを汚染——被害者は「ふつうにinstallした人」
- 防御は習慣で:バージョン固定・lockファイルをGitへ・新版に飛びつかない・素性不明のinstallを避ける・入れる前に身元確認
怖い話をしましたが、目的は怖がらせることではなく、シートベルトの締め方を知ってもらうこと。習慣にしてしまえば、あとは安心して部品の恩恵を受けられます。