🐱

npm install だけで機密情報が漏洩するリスク — サプライチェーンリスクのデモと対策

に公開

「信頼できるパッケージを使っているから大丈夫」と思っていませんか?

近年、npm パッケージを経由したサプライチェーンリスクが増加しており、npm install を実行しただけで機密情報が漏洩するリスクがあります。

本記事では、このリスクを実際に手元で再現できるデモを紹介し、取りうる対策とその限界を整理します。

サプライチェーンリスクとは

ソフトウェアのサプライチェーンリスクとは、自分たちが直接書いたコードではなく、

依存しているライブラリや開発プロセスを経由して

不正な処理が持ち込まれるリスクです。

npm におけるよくある手口として typosquatting があります。
人気パッケージに酷似した名前のパッケージを公開し、開発者のタイプミスや不注意を狙います。

パッケージには package.jsonpostinstall フックという仕組みがあり、npm install 実行後に任意のスクリプトを自動実行できます。
これを悪用すると、以下のような流れでリスクが発生します。

被害者のログには npm install が正常終了したように見えるため、

気づかないまま情報が漏洩する

のが特徴です。

デモで確認する

このリスクを実際に手元で再現できるデモを作成しました。

デモリポジトリ(サニタイズ版):
https://github.com/st-hisatoshi-2973/demo-npm-supply-chain

このサニタイズ版では情報収集・外部送信はダミーデータとログ出力に置き換えています。

構成

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つのフラグを切り替えることで、無防備な状態から各対策が有効な状態を順に確認できます。

docker-compose.yml
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 と連携してプロジェクトにセキュリティレビューを適用する方法はこちらで紹介しています。

https://zenn.dev/hisa_tech_2973/articles/6d4b74c4bf0b7c


まとめ

  • npm installアプリ起動前 に postinstall フックを実行するため、開発者が気づかないまま不正な処理が走るリスクがある
  • 対策は複数あるが、それぞれ限界があるため 組み合わせて使う ことが重要

Discussion