普段 npm パッケージの脆弱性をどのように検知されていますでしょうか。
依存関係の脆弱性スキャナー (静的分析)だと npm Audit が標準機能としてありますし、GitHub Dependabot を導入されているプロダクトも多いと思います。
npm Audit だけで十分なのかと問われるとそうではないと考えます。
それは、npm Audit は公開された脆弱性データベース(GitHub Advisory Databaseなど)に登録されているかどうかを照合します。
既知の脆弱性に対して検知してくれるもので脆弱性データベースに登録されていない場合 npm audit は「問題なし」と判断してしまいます…。
攻撃者が今日アップロードした悪意のあるコードは、まだ脆弱性データベースに登録されていないため、npm audit では危険性を検知できません…。
npm Audit だけではカバーできない範囲をどう対策していくか、いわゆるサプライチェーン攻撃によるリスクの対応方法としてインストール時の防御についてヒントにしていただけますと幸いです。
npm パッケージのインストール時にチェックする
悪意のあるパッケージをインストールしないことが望ましいです。
Socket Firewall を利用することで実現できます。
Socket Firewall
Socket Firewall は、従来のセキュリティスキャンでは見逃される「悪意のある意図や振る舞い」を検出するため、以下の3つの主要な観点から npm パッケージを詳細に分析します。
1. 宣言分析
パッケージが機能の範囲を超えた権限を要求していないか、不審な依存関係がないかをチェックします。
| 分析項目 | 具体的なチェック内容 |
|---|---|
| 過剰な権限要求 |
package.jsonなどから、日付操作ライブラリであるにもかかわらず、ネットワークアクセスやファイルシステムへのフルアクセスなど、不要なシステム権限を要求していないかを検出する。 |
| 不審な依存関係 | 他の怪しいパッケージに意図的に依存していないか、または隠れた依存関係が存在しないかを検証する。 |
2. 振る舞い分析
パッケージがインストール時や実行時に、悪意のある動作を試みていないかを監視します。
| 分析項目 | 具体的なチェック内容 |
|---|---|
| インストール時のスクリプト監視 |
postinstall スクリプトなどが、不審な外部サーバーへの通信**や、システムコマンドの実行など、危険な操作を試みていないかをチェックする。 |
| 実行ファイル/ネイティブコードのチェック | パッケージ内に含まれる実行ファイルやネイティブコードが、予期しない動作(例: 暗号通貨のマイニング、機密ファイルの窃取など)を行おうとしていないかを検出する。 |
3. 信頼性分析
パッケージそのもののコード内容に加え、開発者コミュニティ内での信頼性や流通経路の健全性を評価します。
| 分析項目 | 具体的なチェック内容 |
|---|---|
| タイポスクワッティング検出 | 有名なパッケージ(例:@types/react)とスペルが酷似した偽のパッケージ(例:@typos/react)を自動で識別し、警告またはブロックする。 |
| コミュニティ評価 | パッケージのダウンロード数、最終更新日、開発者の活動履歴などから、パッケージの信頼性と健全性を評価する。 |
多角的な分析により、サプライチェーン攻撃を、開発プロセスの初期段階(インストール時)で阻止します。
まとめ
今回紹介したセキュリティ対策はあくまでもサプライチェーン攻撃の脅威を下げるためのものです。
セキュリティ対策は、幾重にも重ねて行うのが定石とされています。
日々報告されるフロントエンド界隈の脆弱性への対応は想定以上の工数がかかってしまうこともあります。
事業やプロダクトの状況にリスクのカバー範囲の判断は異なると思いますが、チームで話し合い適切に対応することが安定的なプロダクト運用を考える上でも重要なファクターではないかと考えます。