セキュリティの脆弱性に対する監査パッケージの依存関係

セキュリティ監査について

NuGet などのパッケージ マネージャーのセキュリティ監査とは、ソフトウェア プロジェクトに含まれるパッケージのセキュリティを分析するプロセスです。 このプロセスでは、脆弱性の特定、リスクの評価、セキュリティ向上のための推奨事項の作成が行われます。 監査の事項には、パッケージ自体のレビューのほか、依存関係とそれに関連するリスクの監査が含まれます。 監査の目的は、コードインジェクションやクロスサイト スクリプティングなどで、悪用される可能性のあるセキュリティの脆弱性を特定して軽減することです。

このブログ投稿で、既知の脆弱性を持つパッケージがプロジェクトに使用されていることが判明した場合に推奨される対策と、詳細情報の取得に役立つツールについても説明しています。

機能の利用可能状況

NuGet .NET SDK Visual Studio 機能
5.9 .NET 5 SDK (5.0.200) 該当なし dotnet list package --vulnerable
6.8 .NET 8 SDK (8.0.100) Visual Studio 2022 17.8 PackageReference に対する NuGetAudit
6.10 該当なし Visual Studio 2022 17.10 packages.config に対する NuGetAudit
6.11 .NET 8 SDK (8.0.400) Visual Studio 2022 17.11 PackageReference に対する NuGetAuditSuppress
6.12 .NET 9 SDK (9.0.100) Visual Studio 2022 17.12 監査ソース。 packages.config に対する NuGetAuditSuppress

restore を使用してセキュリティ監査を実行する

restore コマンドは、一般的なパッケージ操作を実行すると自動的に実行されます。たとえば、初めてプロジェクトを読み込んだり、新しいパッケージを追加したり、パッケージバージョンを更新したり、お気に入りの IDE でプロジェクトからパッケージを削除したりしたときです。 依存関係は監査ソースが提供する既知の脆弱性のリストに照らしてチェックされます。

  1. コマンド ラインで、プロジェクトかソリューション ディレクトリに移動します。
  2. お使いの任意のツール (dotnet、MSBuild、NuGet.exe、VisualStudio など) を使用してrestore実行します。
  3. 警告を確認し、既知のセキュリティ脆弱性に対処します。

NuGet 監査を構成する

監査は、プロジェクトの一部として評価される .csproj または MSBuild ファイルの MSBuild プロパティを使用して構成できます。 監査はリポジトリ レベルで構成することをお勧めします。

MSBuild のプロパティ 既定値 有効値 メモ
NuGetAuditMode all (1) direct および all トップレベルの依存関係と推移的な依存関係の両方を監査する場合は、値を all に設定できます。 NuGetAuditMode が packages.config プロジェクトに適用されない
NuGetAuditLevel low lowmoderatehigh、および critical レポートする最小重大度レベル。 moderatehighcritical アドバイザリ (low を除く) を表示する場合は、値を moderate に設定します
NuGetAudit true true および false セキュリティ監査レポートを受け取りたくない場合は、値を false に設定することでこの利用を完全にオプトアウトできます。

(1) NuGetAuditMode は、.NET 8.0.100 SDK および VS 17.8 で導入されたときにデフォルトで direct に設定されました。 .NET 9.0.100 SDK と VS 17.12 では、デフォルトが all に変更されました。

監査ソース

復元によって、サーバーの VulnerabilityInfo リソースがダウンロードされ、各プロジェクトで使用されているパッケージのリストに照らしてチェックされます。 ソースのリストは NuGet.Config の auditSources 要素によって定義され、監査ソースのいずれかが脆弱性情報を提供しない場合、警告 NU1905 が発生します。 auditSources が定義されていないか、ソースを何も追加せずに消去された場合、packageSources が使用され、警告 NU1905 が抑制されます。

パッケージ置き換え攻撃の一般的な軽減策は nuget.org からアップストリームした単一パッケージ ソースを使用することなので、NuGet はパッケージ ソースとして nuget.org を使用するように構成されていません。監査ソースを使うことで、nuget.org (または脆弱性情報を提供するその他のソース) を、パッケージ ソースとして使用せずに、脆弱性情報を取得するよう使うことができます。

nuget.org の脆弱性データベースのデータ ソースは GitHub Advisory Database です。 V2 プロトコルは非推奨となるためご注意ください。そのため、nuget.config がまだ V2 エンドポイントを使用している場合は、V3 エンドポイントに移行する必要があります。

<configuration>
    <auditSources>
        <clear />
        <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    </auditSources>
</configuration>

監査ソースは、NuGet 6.12 以降、.NET 9.0.100 SDK 以降、Visual Studio 2022 17.12 以降で使用できます。 このバージョンより前のバージョンでは、NuGet 監査はパッケージ ソースのみを使用して脆弱性情報をダウンロードします。 現時点では、監査ソースは dotnet list package --vulnerable では使用されません。

アドバイザリの除外

監査レポートから特定のアドバイザリを除外するには、各アドバイザリに新しい NuGetAuditSuppress MSBuild 項目を追加します。 Include= メタデータに抑制するアドバイザリ URL を設定して、NuGetAuditSuppress 項目を定義します。

<ItemGroup>
    <NuGetAuditSuppress Include="https://github.com/advisories/XXXX" />
</ItemGroup>

他の NuGet 監査構成プロパティと同様に、NuGetAuditSuppress 項目はプロジェクトまたはリポジトリ レベルで定義できます。

NuGetAuditSuppress は、NuGet 6.11、Visual Studio 17.11、および .NET 8.0.400 SDK 以降の PackageReference プロジェクトで使用できます。 これは、Visual Studio 17.12 と NuGet 6.12 を使用した packages.config で使用できます。

警告コード

警告コード 理由
NU1900 脆弱性情報を取得中にパッケージ ソースと通信中にエラーが発生しました。
NU1901 重大度が低いパッケージが検出されました
NU1902 重大度が中のパッケージが検出されました
NU1903 重大度が高いパッケージが検出されました
NU1904 重大度がかなり高いパッケージが検出されました
NU1905 監査ソースが脆弱性データベースを提供しない

これらの警告をエラーとして扱うようにビルドをカスタマイズできます。警告をエラーとして扱う、または、警告をエラーとして扱わないなどの設定ができます。 たとえば、(C#、NuGet、MSBuild などの)すべての警告をエラーとして扱うように <TreatWarningsAsErrors> が使用されている場合は、<WarningsNotAsErrors>NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors> を使用するとで、将来検出された脆弱性がビルドを壊すのを防ぐことができます。 または、低および中程度の脆弱性を警告として保持し、高および重大な脆弱性をエラーとして扱いたい場合で、TreatWarningsAsErrors が使用されていないのであれば、<WarningsAsErrors>NU1903;NU1904</WarningsAsErrors> を使用できます。

Note

メッセージの重大度を表す MSBuild プロパティ (NoWarnTreatWarningsAsErrors など) は、packages.config プロジェクトではサポートされていません。

dotnet list package --vulnerable

プロジェクトが正常に復元されると、dotnet list package--vulnerable 引数を持ち、どのパッケージが既知の脆弱性を持つのかに基づいてパッケージをフィルター処理します。 --include-transitive はデフォルトではないため、含める必要があることに注意してください

既知の脆弱性を持つパッケージが報告されたときのアクション

このブログ投稿で、既知の脆弱性を持つパッケージがプロジェクトに使用されていることが判明した場合に推奨される対策と、詳細情報の取得に役立つツールについても説明しています。

更新プログラムでセキュリティの脆弱性が見つかった場合

セキュリティの脆弱性が見つかり、パッケージの更新プログラムが利用可能な場合は、次のいずれかを実行できます。

  • セキュリティ修正プログラムを含む新しいバージョンで、 .csproj または他のパッケージ バージョンの場所 (Directory.Packages.props) を編集してください。
  • Visual Studio の NuGet パッケージ マネージャーを使用して、パッケージのアップデートを行ってください。
  • それぞれのパッケージ ID で dotnet add package コマンドを実行して、最新バージョンに更新してください。

更新していない状態でセキュリティの脆弱性見つかった場合

セキュリティ修正なしでパッケージに既知の脆弱性が見つかった場合は、次の操作を実行できます。

  • アドバイザリ レポートに記載されている軽減要因を確認します。
  • パッケージが非推奨にマークされている場合やまたは破棄されている場合は、推奨されるパッケージを使用してください。
  • パッケージがオープンソースされている場合は、修正プログラムの提供を検討してください。
  • パッケージの問題トラッカーで問題を開きます。

軽減要因を確認する

脆弱性のあるパッケージを引き続き使用できるようになる軽減要因があるかどうかは、セキュリティ アドバイザーを確認してください。 セキュリティ修正なしで脆弱性が見つかるのは、コードが特定のフレームワーク、オペレーティング システム使用されていたり、特定の関数で使用されている時です。

推奨パッケージを使用する

使用しているパッケージに対してセキュリティ アドバイザリが報告され、パッケージが非推奨にマークされている場合、または破棄されたと思われる場合は、パッケージ作成者が推奨している代替パッケージや同様の機能で構成されパッケージでメンテナンスが行われている物を使用することを検討してください。

修正プログラムを投稿する

セキュリティ アドバイザリの修正プログラムが存在しない場合は、パッケージのオープンソース リポジトリでプル要求の脆弱性に対処するための変更を提案するか、NuGet.org パッケージの詳細ページの Contact owners から作成者に問い合わせてください。

問題を開く

この脆弱性を修正しない場合、またはパッケージの更新や交換ができない場合は、パッケージの問題トラッカーで問題を開くか、作成者に連絡を取ります。 NuGet.org で、パッケージの詳細ページに移動して Report package をクリックすると、作成者と連絡を取ることができます。

セキュリティの脆弱性が見つらない場合

セキュリティの脆弱性が見つからない場合は、既知の脆弱性を持つパッケージが現在チェックした時点でパッケージ グラフに見つからなかったということです。 アドバイザリ データベースはいつでも更新できるため、dotnet restore を定期的にチェックし、継続的インテグレーション のプロセスでこの状態を保つようにしましょう。

まとめ

セキュリティ監査機能は、ソフトウェア プロジェクトのセキュリティと整合性を維持するために重要です。 これらの機能により、セキュリティの脆弱性に対する保護が行われるので、オープンソース パッケージを確実に使用することができます。