依存関係
npm audit
npm auditは、プロジェクト内のパッケージを既知のセキュリティアドバイザリと照合し、見つかったものを報告します。npmに付属し、無料で、数秒で終わるため、最も手軽に実行できるSCAスキャンです。何を読み取っているかを知れば、何を見落とし得るかがわかります。
更新日
npm auditの仕組み
npm auditは、プロジェクトの依存関係の情報をデフォルトのレジストリに送信し、既知の脆弱性を問い合わせます。
どのバージョンを使っているかを知るために、package-lock.jsonまたはshrinkwrapファイルが必要です。
詳細はnpmのドキュメントをご覧ください。
npm audit # report everything
npm audit --omit=dev # skip dev dependencies
npm audit --audit-level=high # fail only on high or critical
npm audit --json # machine-readable output
レポートの読み方
- 深刻度はアドバイザリに由来します。その欠陥が一般にどれほど深刻かを示すもので、自社にとってどれほど深刻かではありません。
- 依存関係のパスは、何がそのパッケージを取り込んだかを示します。検出結果の多くは 推移的依存関係であり、修正は通常その上位のパッケージにあります。
- 開発用か本番用か。テストツールの欠陥はユーザーには出荷されませんが、ビルドの中では実行されるため、完全には無視しないでください。
一覧が長い場合は、悪用されているものと出荷されるものから始めてください。 脆弱性の優先順位付けの方法をご覧ください。
npm audit fixと、強制すべきでない場合
| コマンド | 動作 | リスク |
|---|---|---|
npm audit fix |
バージョン範囲内で互換性のある更新を適用します | 低。ただし完全なインストールを実行するため、テストは必ず実行してください |
npm audit fix --force |
メジャーバージョンを含め、範囲外の変更も許可します | 高。アプリケーションが壊れる可能性があり、npmは目的が明確でない限り使わないよう案内しています |
修正が提供されていない場合は、親パッケージをアップグレードするか、overridesフィールド(package.json内)を使って、
パッチ済みの推移的バージョンを強制できます。親パッケージはそのバージョンを前提にビルドされていないため、必ずテストしてください。
CIでnpm auditを実行する
デフォルトでは、npm auditは何かを検出すると0以外の終了コードを返すため、深刻度の低いアドバイザリでもジョブが毎回失敗します。
通常、チームはしきい値を設定します。--audit-levelは失敗のしきい値を変えるだけで、レポートを絞り込むわけではない点に注意してください。
- run: npm ci
- run: npm audit --omit=dev --audit-level=high
このようなチェックは、夜間に新しいアドバイザリが公開されたことで、コードを変更していないのにビルドを失敗させることもあります。 有効にする前に、その失敗に誰が対応するかを決めておいてください。詳しくは SCAスキャンを実行する場所をご覧ください。
npm auditが見落とすもの
-
npm以外のすべて。ベースイメージ、OSパッケージ、Pythonツール、GitHub Actionsは
package-lock.jsonに含まれません。 - インストール中に取得されるコード。インストールスクリプトは、どのロックファイルにも記録されないファイルをダウンロードできます。 ロックファイルが記録しないものをご覧ください。
- 新しい悪意あるパッケージ。公開済みのアドバイザリと照合するため、まだアドバイザリのないパッケージは問題なしとして通過します。
- すでに出荷したもの。報告対象は目の前のプロジェクトです。昨年のリリースに対する新しいアドバイザリは、 誰かがそのバージョンで再実行しない限り表示されません。
- 実際に影響を受けるかどうか。コードが脆弱な関数を使っているかどうかはわかりません。 これには到達可能性分析で対処します。
npm audit signaturesは、インストールしたパッケージのレジストリ署名と来歴の証明書を検証する別のコマンドです。
確認するのはパッケージの出どころであり、安全かどうかではありません。
npm auditとCRACI
プルリクエストではnpm auditを引き続き実行してください。無料で、既知の問題を早期に発見できます。CRACIは、npm auditでは見えない部分をカバーします。
GitHub Actionsのランナーとして、各ジョブがnpmやその他のすべてのソースから実際に取得したパッケージを、CIキャッシュから復元されたパッケージや
インストールフックが取得したファイルも含めて記録します。そのうえで、新しい脆弱性が公開されるたびに、出荷したもののSBOMをチェックし続けます。
おすすめのSCAツールまたは
ビルド時SBOM生成をご覧ください。
npm audit:よくあるご質問
npm auditは何をするのですか?
依存関係の情報をnpmレジストリに送信し、既知のセキュリティアドバイザリと照合して、脆弱なパッケージをその深刻度と、プロジェクトに入り込んだ経路とともに報告します。
npm audit fixは安全ですか?
通常のnpm audit fixはバージョン範囲内にとどまるため、たいていは安全ですが、実行後はテストを行ってください。npm audit fix --forceは新しいメジャーバージョンをインストールし、アプリケーションを壊す可能性があります。
npm auditで脆弱性が大量に表示されるのはなぜですか?
多くは推移的依存関係と開発用ツールに由来します。--omit=devで出荷されるものに絞り込み、件数ではなく悪用状況と露出度で優先順位を付けてください。
npm auditで脆弱性を無視するにはどうすればよいですか?
npm auditには組み込みの無視リストがありません。チームはoverridesフィールドでバージョンを変更するか、--audit-levelでしきい値を設定するか、受け入れた検出結果を記録するラッパーツールを使います。
npm auditにはロックファイルが必要ですか?
はい。デフォルトではpackage-lock.jsonまたはshrinkwrapファイルが必要です。--no-package-lockで回避できますが、その場合は実行ごとに結果が異なる可能性があります。
npm auditはマルウェアを検出しますか?
そのパッケージのアドバイザリが公開されてからです。新しい悪意あるパッケージにはアドバイザリがないため、出現したその日には報告されません。