审核安全漏洞的包依赖项

安全性审核简介

NuGet 等包管理器的安全审核是一个过程,涉及分析软件项目中所包含包的安全性。 具体包括识别漏洞、评估风险,并提出建议以提高安全性。 审核可以包括对包本身、任何依赖项及其关联风险的审查。 审核的目标是识别和减少攻击者可能利用的任何安全漏洞,例如代码注入或跨站点脚本攻击。

项目类型 NuGet .NET SDK Visual Studio
PackageReference 6.8 .NET 8 SDK (8.0.100) Visual Studio 2022 17.8
packages.config 6.10 空值 Visual Studio 2022 17.10

使用 restore 运行安全审核

restore 命令会在执行常见包操作时自动运行,如首次加载项目、添加新包、更新包版本或删除收藏 IDE 中项目的包。 根据 GitHub Advisory Database 中的已知漏洞报告检查依赖项的说明。

重要

若要审核检查包,必须使用提供漏洞数据库的包源。 NuGet.org 的 V3 URL 就是这样的示例 (https://api.nuget.org/v3/index.json),但请注意,不提供 NuGet.org 的 V2 终结点。

  1. 在命令行中,导航到项目或解决方案目录。
  2. 使用首选工具(例如 dotnet、MSBuild、NuGet.exe、VisualStudio 等)运行 restore
  3. 查看警告并解决已知的安全漏洞。

更新后发现的安全漏洞

如果发现安全漏洞并且更新可用于包,则可以:

  • 使用包含安全修补程序的较新版本编辑 .csproj 或其他包版本位置 (Directory.Packages.props)。
  • 使用 Visual Studio 中的 NuGet 包管理器用户界面更新单个包。
  • 使用相应的包 ID 运行 dotnet add package 命令以更新到最新版本。

发现安全漏洞但未更新

如果包中存在已知漏洞且没有安全修补程序,可以执行以下操作。

  • 检查顾问报告中概述的任何缓解因素。
  • 如果包标记为已弃用或放弃,请使用建议的包。
  • 如果包为开放源代码,请考虑提供修补程序。
  • 在包的问题跟踪器中打开问题。

检查缓解因素

查看安全顾问,了解可能允许你继续使用包含漏洞的包的任何缓解因素。 仅当在特定框架、操作系统或调用特殊函数上使用代码时,该漏洞才存在。

使用建议的包

如果针对正在使用的包报告了安全公告,并且包被标记为已弃用或似乎被放弃,请考虑使用包作者声明的任何建议备用包,或者包含维护的类似功能的包。

参与修复

如果安全公告不存在修补程序,建议对包的开放源代码存储库拉取请求中的漏洞进行更改,或者通过 NuGet.org 包详细信息页上 Contact owners 的部分联系作者。

打开问题

如果不想修复漏洞或无法更新或替换包,请在包的问题跟踪器或首选联系人方法中打开问题。 在 NuGet.org 上,你可以导航到包详细信息页,然后单击 Report package,这将引导你与作者取得联系。

未找到安全漏洞

如果未发现任何安全漏洞,这意味着在检查的当前时刻,包图中找不到具有已知漏洞的包。 由于随时可以更新咨询数据库,因此我们建议定期检查 dotnet restore 输出并确保在持续集成过程中相同。

配置 NuGet 审核

审核可以通过 .csproj 中的 MSBuild 属性进行配置,也可以通过作为项目一部分评估的 MSBuild 文件进行配置。 建议在存储库级别配置审核。

MSBuild 属性 默认 可能值 备注
NuGetAuditMode 直通 directall 如果要审核顶级依赖项和可转移依赖项,则可以将值设置为 all。 NuGetAuditMode 不适用于 packages.config 项目
NuGetAuditLevel low lowmoderatehighcritical 如果想要查看 moderatehighcritical 公告,请将值设置为 moderate
NuGetAudit truefalse 如果不希望收到安全审核报告,则可以通过将值设置为 false 来完全退出体验

排除公告

可以选择通过为每个公告添加一个新的 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。 目前暂时不能供 packages.config 项目使用。

此外,可以选择根据警告的严重性取消警告。 你可以使用 <NoWarn> 禁止 NU1901-NU1904 警告或使用 <NuGetAuditLevel> 功能来确保审核报告对工作流有用。

警告代码

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

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

注意

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

总结

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