我有一个由面向.NET Standard 2.0和.NET Core 2.1.304的项目组成的解决方案。在构建时,此解决方案使用旧的易受攻击版本的System.ServiceModel.Primitives
和System.Private.ServiceModel
(CVE-2018-0786)。
我可能遗漏了一些关于整体解决方案的配置或导致使用旧版本的项目之一的显而易见的事情,但我知道检查的所有内容看起来都是正确的:
{
"sdk": {
"version": "2.1.302"
}
}
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<Configurations>Debug;Dev;Qual;Release</Configurations>
<LangVersion>7.1</LangVersion>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Configurations>Debug;Dev;Qual;Release</Configurations>
</PropertyGroup>
我确保所有NuGet包都是最新的。那就是说我的一个NuGet包引用可能会导致旧版本的回退?我应该检查哪些其他配置?
有趣的是,当我构建一个不同的但配置相似的解决方案(据我所知)时,该解决方案使用较新的非易受攻击版本生成构建。
您可以使用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并调查每个可疑依赖项以查看它使用的子依赖项的版本。