npm install だけで機密情報が漏洩するリスク — サプライチェーンリスクのデモと対策
「信頼できるパッケージを使っているから大丈夫」と思っていませんか?
近年、npm パッケージを経由したサプライチェーンリスクが増加しており、npm install を実行しただけで機密情報が漏洩するリスクがあります。
本記事では、このリスクを実際に手元で再現できるデモを紹介し、取りうる対策とその限界を整理します。
サプライチェーンリスクとは
ソフトウェアのサプライチェーンリスクとは、自分たちが直接書いたコードではなく、
依存しているライブラリや開発プロセスを経由して
不正な処理が持ち込まれるリスクです。
npm におけるよくある手口として typosquatting があります。
人気パッケージに酷似した名前のパッケージを公開し、開発者のタイプミスや不注意を狙います。
パッケージには package.json の postinstall フックという仕組みがあり、npm install 実行後に任意のスクリプトを自動実行できます。
これを悪用すると、以下のような流れでリスクが発生します。
被害者のログには npm install が正常終了したように見えるため、
気づかないまま情報が漏洩する
のが特徴です。
デモで確認する
このリスクを実際に手元で再現できるデモを作成しました。
デモリポジトリ(サニタイズ版):
このサニタイズ版では情報収集・外部送信はダミーデータとログ出力に置き換えています。
構成
Docker を使って victim(被害者アプリ) と attacker(受信サーバー) の2コンテナを立ち上げ、実際のネットワーク通信を通じてリスクを確認できます。
実行方法
# attacker サーバーを起動
docker compose up -d attacker
# 別ターミナルでログを監視
docker logs -f attacker
# victim を起動 → npm install の時点で postinstall が発動
docker compose up victim
victim のログは正常に見えますが、attacker 側には機密情報(API キー・DB 接続情報等)が届いています。
動作モードの切り替え
docker-compose.yml の5つのフラグを切り替えることで、無防備な状態から各対策が有効な状態を順に確認できます。
AUDIT_MODE: false
CI_MODE: false
NETWORK_DETECT_MODE: false
NETWORK_BLOCK_MODE: false
IGNORE_SCRIPTS: false
対策と限界
各フラグがデモのどのステップに介入するかを示します。
各対策の効果と限界
| 対策 | 効果 | 限界 |
|---|---|---|
AUDIT_MODE(npm audit / カスタム監査) |
既知の不正パッケージをインストール前に検出 | 未報告・新規パッケージは検出できない |
CI_MODE(npm ci + lockfile) |
lockfile との不一致を検知して不正なパッケージの追加を阻止 | lockfile 自体が改ざんされると無効。lockfile 生成前から汚染されていた場合も無効 |
IGNORE_SCRIPTS(--ignore-scripts) |
postinstall フックを一律スキップ | C++ コンパイルやバイナリダウンロードが必要なパッケージなど、正当なビルドスクリプトも動かなくなる |
NETWORK_DETECT_MODE(通信監視) |
不審な外部通信をリアルタイムで検知・ログ保存 | 検知するだけで通信は止まらない。DNS over HTTPS など別プロトコルはすり抜ける |
NETWORK_BLOCK_MODE(通信遮断) |
許可リスト外への通信を Node.js レベルで遮断 | 許可リストの管理コストが発生。別プロトコルは対象外 |
複数の対策を組み合わせることが重要です。
単一の対策に頼ると、その限界を突かれた場合に無防備になります。
Startup Security Kit について
スタートアップや小規模チームでは、専任のセキュリティ担当者がいないことが多く、ライブラリの選定やインストールはエンジニアの判断に委ねられています。
こうしたチームこそ、今回のようなリスクへの備えが重要です。
今回のデモで確認したリスクは、
認証情報の漏洩を起点としたサプライチェーンリスク
そのものです。
このリスクの全体像(攻撃チェーン・よくある問題・設計レベルの対策)は、
Startup Security Kit の (credential-compromise-supply-chain.md) にまとめています。
デモで「何が起きるか」を体験したうえで、設計レベルでどう対処するかをこちらで確認してみてください。
また、Claude Code と連携してプロジェクトにセキュリティレビューを適用する方法はこちらで紹介しています。
まとめ
-
npm installは アプリ起動前 に postinstall フックを実行するため、開発者が気づかないまま不正な処理が走るリスクがある - 対策は複数あるが、それぞれ限界があるため 組み合わせて使う ことが重要
Discussion