5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【2026年5月】node-ipc がまた乗っ取られた ─ `npm install` した瞬間に認証情報を抜かれる手口と対策

5
Posted at

2026年5月14日、Node.js のプロセス間通信ライブラリ node-ipc に、認証情報を盗むマルウェアを仕込んだ悪意あるバージョンが公開された。週間約70万ダウンロード、400以上の OSS が直接依存する基盤ライブラリだ。

怖いのは手口。これは「偽パッケージ」でも「インストールフックの悪用」でもない。正規の node-ipc が乗っ取られ、require("node-ipc") でロードされた瞬間にペイロードが発火する。つまり npm ci --ignore-scripts をやっていても防げない。

しかもライブラリの乗っ取り方が、防御側の盲点をそのまま突いてくる。


何が起きたのか

項目 内容
対象 npm パッケージ node-ipc
汚染バージョン 9.1.6 / 9.2.3 / 12.0.1
公開日 2026年5月14日
週間DL数 約70万(※ソースにより53万〜82万と幅あり)
盗む対象 クラウド認証情報・SSH鍵・K8sトークン・CI/CDシークレット等
検出まで 数分〜数時間(Socketは公開3分以内に検知)

汚染版を npm install した、あるいはそれを含むビルドを回した環境は、そこにあったシークレットすべてを侵害された前提で扱う必要がある。


手口①:失効ドメインを買い戻してアカウントを乗っ取る

侵入経路がうまい。攻撃者は脆弱性を突いていない。正規のパスワードリセット機能でアカウントを奪っている。

  1. node-ipc に過去コミットのある、2022年以降休眠状態のメンテナアカウントに目を付ける
  2. そのアカウントの復旧用メールのドメインが2025年に失効しているのを発見
  3. 攻撃者がそのドメインを買い戻す(2026年5月)
  4. ドメインが手に入れば復旧メールを受信できる → npm の標準パスワードリセットで publish 権限を正規手順で奪取

元メンテナのPCにもnpmのインフラにも一切侵入していない。「捨てられたドメイン」だけで公開権限が乗っ取られた。これは node-ipc に限らず、古いOSSすべてに刺さる構造的な穴だ。


手口②:require した瞬間に発火する仕込み

ペイロードの仕込み場所も巧妙だった。

  • npm の lifecycle script(postinstall 等)ではなく、CommonJS のエントリポイント node-ipc.cjs の末尾に約80KBのコードを追記
  • ファイルサイズは通常 約37KB → 約117KB に膨張
  • require("node-ipc") でロードされるたびに発火

ここが重要で、サプライチェーン対策の定番である --ignore-scripts(インストール時スクリプトの無効化)は require 時実行には無力。アプリやビルドがそのモジュールを読み込めば動いてしまう。

盗む対象は90カテゴリ超。AWS / Azure / GCP の認証情報、SSH秘密鍵、Kubernetes・Docker・Terraform の資格情報、GitHub トークン、npm トークン、.env、シェル履歴、環境変数を丸ごと。

そして送信が陰湿で、HTTP通信ではなく DNS TXT クエリで外部に持ち出す。さらにシステムのDNSを 8.8.8.8 に書き換えてローカルのDNS監視を回避する。HTTPの外向き通信だけ見張っていても気づけない。


自分の環境が汚染されていないか確認する

まずこれを実行する。

# 直接・推移的依存に node-ipc があるか
npm ls node-ipc

# lockfile に汚染バージョンが固定されていないか
grep -nE "node-ipc.*(9\.1\.6|9\.2\.3|12\.0\.1)" package-lock.json

該当したら、フォレンジックとして以下も確認する。

  • node-ipc.cjs のファイルサイズ異常(正常 約37KB に対し 約117KB なら汚染)
  • CloudTrail / Azure Activity Log / GCP Audit Log の不審なアクセス

対策:require時実行を前提にした多層防御

--ignore-scripts で安心、という前提を捨てるのが今回の教訓。

  1. 安全版へピン留め+ロックファイル再生成node-ipc@12.0.0 または 9.2.1 に固定し、lockfile を再生成。npm cache clean --force でキャッシュも掃除する
  2. シークレットの即時ローテーション:汚染版をインストールしたなら侵害確定として、AWSキー → SSH鍵 → K8sトークン → GitHub PAT → クラウドのサービスアカウント鍵 → .env → npmトークン、の順で全部回す
  3. CI/CDの外向きDNSを制限・監視:今回の肝。53/UDP の TXT クエリや、8.8.8.8 への直接問い合わせを検知・遮断する。エグレスを既知のレジストリ/APIに絞る
  4. 新バージョンの即時採用をやめる:公開直後の版を即取り込まず、数日のクールダウンを置く。今回の被害は「公開直後に取得した環境」に集中した
  5. SCAツールの常時運用npm audit に加え Socket / Snyk / StepSecurity 等で既知の悪性バージョンを継続検知する

まとめ

  • node-ipc の 9.1.6 / 9.2.3 / 12.0.1 は認証情報窃取マルウェア入り。使っていたら侵害確定として対応する
  • 乗っ取りは失効ドメインの買い戻し→正規パスワードリセット。古いOSSのメンテナアカウントは全部この穴を持ちうる
  • ペイロードはrequire時に発火するので --ignore-scripts では防げない。送信はDNS TXTで8.8.8.8経由、HTTP監視はすり抜ける
  • 防御は「lockfile固定+シークレット即ローテ+外向きDNS監視+新版クールダウン」の多層で

「人気ライブラリだから安全」はもう通用しない。依存は資産ではなく、攻撃面だと考えて運用するしかない。


参考

※ 週間ダウンロード数や悪性バージョンの生存時間など一部の数値はソース間で差があり、本記事は複数ソースで最も整合する値を採用しています。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?