针对使用旧 System.ServiceModel.Primitives 和 System.Private.ServiceModel 构建的 .NET Core 2.1 的解决方案

Solution targeting .NET Core 2.1 builds with old System.ServiceModel.Primitives and System.Private.ServiceModel

我有一个由针对 .NET Standard 2.0 和 .NET Core 2.1.304 的项目组成的解决方案。构建时,此解决方案利用旧的易受攻击版本 System.ServiceModel.PrimitivesSystem.Private.ServiceModel (CVE-2018-0786).

我可能遗漏了一些关于整体解决方案或导致使用旧版本的项目之一的明显配置,但我所知道的一切检查看起来都是正确的:

Global.json

{
  "sdk": {
    "version": "2.1.302"
  }
}

.NET Core 项目文件示例

<PropertyGroup>
  <TargetFramework>netcoreapp2.1</TargetFramework>
  <Configurations>Debug;Dev;Qual;Release</Configurations>
  <LangVersion>7.1</LangVersion>
</PropertyGroup>

示例 .NET 标准项目文件

<PropertyGroup>
  <TargetFramework>netstandard2.0</TargetFramework>
  <Configurations>Debug;Dev;Qual;Release</Configurations>
</PropertyGroup>

我已确保所有 NuGet 包都是最新的。也就是说,是否有可能是我的 NuGet 包引用之一导致回退到旧版本?我应该检查哪些其他配置?


有趣的是,当我构建一个不同但配置相似的解决方案(据我所知)时,该解决方案使用较新的不易受攻击的版本生成了一个构建。

您可以使用 dotnet-outdated 之类的工具来确定项目中依赖项和传递依赖项的版本。

通过 dotnet tool install --global dotnet-outdated 在 powershell 命令行上安装 和 运行 dotnet outdated -t -td 100 在您的解决方案文件夹中查看 100 级传递依赖项。

您的输出将如下所示

» MyProject
  [.NETCoreApp,Version=v2.1]
  System.Private.ServiceModel [T]                 4.4.0  -> 4.5.3
  System.ServiceModel.Primitives [T]              4.4.0  -> 4.5.3

然后您可以使用上述过时的依赖项来追踪解决方案中的哪些项目需要进一步调查。

从那里消除已知安全的依赖项,因为它们出现在不依赖于错误库的其他项目中(无论版本如何)。在这一点上,可能需要使用 nuget.org 并调查每个可疑依赖项以查看它使用的子依赖项的版本。