【问题标题】:Solution targeting .NET Core 2.1 builds with old System.ServiceModel.Primitives and System.Private.ServiceModel针对 .NET Core 2.1 的解决方案使用旧的 System.ServiceModel.Primitives 和 System.Private.ServiceModel 构建
【发布时间】:2018-08-31 23:34:39
【问题描述】:

我有一个由面向 .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 包引用之一是否可能导致回退到旧版本?我还应该检查哪些其他配置?


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

【问题讨论】:

    标签: c# .net-core .net-standard .net-standard-2.0 .net-core-2.1


    【解决方案1】:

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

    在 powershell 命令行上通过dotnet tool install --global dotnet-outdated 安装 并在您的解决方案文件夹中运行 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 并调查每个可疑依赖项以查看它使用的子依赖项的版本。

    【讨论】:

    • 您的回答让我找到了解决方案。最终,两种解决方案都引用的软件包之一是罪魁祸首。但是,非易受攻击的解决方案还引用了一个包,该软件包导致它选择了System.ServiceModel.Primitives 的后续非易受攻击版本。除了 dotnet-outdated 之外,用于确定如何将过时引用添加到您的解决方案中的出色工具是 dotnet-depends。遗憾的是,它目前适用于每个项目而不是每个解决方案,但仍然非常有用。
    猜你喜欢
    • 2016-10-24
    • 2018-12-11
    • 1970-01-01
    • 2018-10-08
    • 2019-04-22
    • 2021-04-26
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多