npm・安全に使う

npmの怖い話——Shai-Hulud事件から学ぶ身の守り方

npmの部品に悪意あるコードがまぎれこむ「サプライチェーン攻撃」。2025年に実際に起きたShai-Hulud事件の手口と、初心者でも今日からできる5つの防御習慣を解説します。

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ファイルの記録に完全一致する形で入ります
npmpackage.jsonの読み方package.jsonとpackage-lock.jsonの関係はこちらで詳しく

対策3:出たばかりの新バージョンに飛びつかない

毒入りバージョンは、公開から数時間〜数日で発見・削除されるのがふつうです。逆に言えば、公開直後こそ危険地帯。「新しい版が出た!」とすぐ上げず、数日〜2週間ほど様子を見てから上げるだけで、リスクは大きく下がります。実際、Shai-Hulud後は大手企業も「公開後14日間は新バージョンを入れない」運用を採用しました。

対策4:知らないプロジェクトを気軽にnpm installしない

インストールの瞬間にプログラムが動く——ということは、GitHubで拾った素性の分からないプロジェクトでのnpm installは、知らない人のプログラムの実行ボタンです。試したいだけなら、付属プログラムの実行を止めるオプションがあります。

npm install --ignore-scripts

対策5:入れる前に一呼吸——パッケージの「身元確認」

新しいパッケージを入れる前に、npm公式サイトでそのページを30秒だけ眺めましょう。

  • 週間ダウンロード数——極端に少ないものは慎重に
  • 名前のつづり——人気パッケージの打ちまちがいを装った偽物(タイポスクワッティング)が実在します
  • 最終更新日と説明文——放置されていないか、説明がまともか
npmのastroパッケージのページ。右カラムに週間ダウンロード数324万件、バージョン、最終公開日が並んでいる
パッケージページの右カラムが身元確認コーナー。Weekly Downloads(週間ダウンロード数)とLast publish(最終公開日)をここで確かめられます。

対策6:npm auditで足元を確認する

すでに入っている部品の中に、知られている脆弱性がないかをまとめてチェックしてくれるコマンドもあります。

npm audit

危険度つきの一覧が出るので、npm audit fixで自動修正を試すこともできます(新しいメジャーバージョンに一気に上がることがあるので、fixの後は動作確認を忘れずに)。

このレッスンのまとめ

  1. サプライチェーン攻撃は部品に毒を混ぜる攻撃。npmではnpm installの瞬間に毒が動く
  2. Shai-Hulud事件(2025年)は自己増殖型で数百パッケージを汚染——被害者は「ふつうにinstallした人」
  3. 防御は習慣で:バージョン固定・lockファイルをGitへ・新版に飛びつかない・素性不明のinstallを避ける・入れる前に身元確認

怖い話をしましたが、目的は怖がらせることではなく、シートベルトの締め方を知ってもらうこと。習慣にしてしまえば、あとは安心して部品の恩恵を受けられます。

よくある質問

サプライチェーン攻撃とは何ですか?
作りたいものを直接ねらうのではなく、材料や部品の供給ルートに毒を仕込む攻撃です。npmでは、人気パッケージの新バージョンに悪意あるコードをまぎれこませ、それをインストールした人のPCから情報を盗むといった形で起こります。
Shai-Hulud事件とは何ですか?
2025年9月と11月に起きた、npm史上最大級の攻撃です。感染したパッケージをインストールすると認証情報が盗まれ、盗んだ権限でさらに別のパッケージへ感染を広げる「自己増殖するワーム」で、のべ数百のパッケージが汚染されました。
初心者にもできる対策はありますか?
あります。バージョンを^なしで固定する、package-lock.jsonをGitに入れる、出たばかりの新バージョンに飛びつかない、知らないプロジェクトを気軽にnpm installしない——インストールの習慣だけでリスクを大きく減らせます。
npm auditとは何ですか?
手元にインストール済みの部品に、すでに知られている脆弱性がないかをまとめてチェックしてくれるコマンドです。定期的に実行しておくと、危険な部品が紛れていないか自分で確認できます。