审核安全漏洞的包依赖项

安全性审核简介

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 全部 (1) directall 如果要审核顶级依赖项和可转移依赖项,则可以将值设置为 all。 NuGetAuditMode 不适用于 packages.config 项目
NuGetAuditLevel low lowmoderatehighcritical 要报告的最低严重性级别。 如果想要查看 moderatehighcritical 公告(不包括 low),请将值设置为 moderate
NuGetAudit truefalse 如果不希望收到安全审核报告,则可以通过将值设置为 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 顾问数据库。 请注意,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 Audit 将仅使用包源来下载漏洞信息。 dotnet list package --vulnerable 目前不使用审核源。

排除公告

可以选择通过为每个公告添加一个新的 NuGetAuditSuppress MSBuild 项,在审核报告中排除特定的公告。 定义一个 NuGetAuditSuppress 项,其中的 Include= 元数据设定为希望抑制的公告 URL。

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

与其他 NuGet 审核配置属性类似,NuGetAuditSuppress 项可以在项目或仓库级别定义。

NuGet 6.11、Visual Studio 17.11 和 .NET 8.0.400 SDK 起,PackageReference 项目可以使用 NuGetAuditSuppress。 它适用于具有 Visual Studio 17.12 和 NuGet 6.12 的 packages.config。

警告代码

警告代码 原因
NU1900 与包源通信时出错,同时获取漏洞信息。
NU1901 检测到低严重性的包
NU1902 检测到中严重性的包
NU1903 检测到高严重性的包
NU1904 检测到严重严重性的包
NU1905 审核源不提供漏洞数据库

可以自定义生成,将这些警告视为错误,将警告视为错误,或将警告视为错误。 例如,如果已用于 <TreatWarningsAsErrors> 将所有(C#、NuGet、MSBuild 等)警告视为错误,则可以用于 <WarningsNotAsErrors>NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors> 防止将来发现的漏洞破坏生成。 或者,如果要将低漏洞和中等漏洞保留为警告,但将高漏洞和严重漏洞视为错误,并且未使用 TreatWarningsAsErrors,则可以使用 <WarningsAsErrors>NU1903;NU1904</WarningsAsErrors>

注意

packages.config 项目不支持消息严重性的 MSBuild 属性(如 NoWarnTreatWarningsAsErrors)。

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 输出并确保在持续集成过程中相同。

总结

安全审核功能对于维护软件项目的安全性和完整性至关重要。 这些功能提供针对安全漏洞的附加保护层,并确保你可以放心地使用开放源代码包。