如何修复Microsoft.EntityFrameworkCore.SqlServer 6.0.3依赖的System.Drawing.Common 4.7.0漏洞
问题背景
我们在Visual Studio 2022中创建了基于.NET Core 6.0.6运行时的API项目,使用Microsoft.EntityFrameworkCore.SqlServer 6.0.3 NuGet包。近期发现依赖的System.Drawing.Common 4.7.0包存在安全漏洞,通过TFS CI构建流水线进行软件的构建与发布。
需求:在不升级至.NET Core 7.0、仍使用.NET Core 6.0.6运行时的前提下,解决该安全风险(通过Blackduck合规扫描检测),并明确TFS CI构建流水线脚本需做的补丁/修改及部署操作。
补充信息:已知System.Drawing.Common的漏洞在4.7.2、4.7.3及≥5.0.3版本中已修复,但Blackduck合规扫描仍报告风险;手动向项目中添加System.Drawing.Common 4.7.3包后,确认Microsoft.EntityFrameworkCore.SqlServer 6.0.3已内部引用该版本,但Blackduck仍报安全风险。
问题分析
手动添加高版本包后仍触发扫描告警,通常是以下原因:
- NuGet依赖解析时,间接引用的旧版本未被完全覆盖,项目输出中仍存在4.7.0版本的dll
- Blackduck扫描逻辑未正确识别项目实际使用的版本,或其漏洞数据库未同步更新修复版本信息
- TFS构建流水线未清理缓存,导致旧版本依赖被重复使用
解决方案步骤
1. 项目配置强制指定版本
在项目的.csproj文件中添加强制版本声明,确保所有直接/间接引用都指向System.Drawing.Common 4.7.3:
<ItemGroup> <!-- 直接引用指定版本 --> <PackageReference Include="System.Drawing.Common" Version="4.7.3" /> <!-- 强制覆盖所有间接引用的版本 --> <PackageReference Include="System.Drawing.Common" Version="4.7.3"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> </ItemGroup>
如果是多项目解决方案,推荐在根目录创建Directory.Packages.props文件全局强制版本:
<Project> <PropertyGroup> <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> </PropertyGroup> <ItemGroup> <PackageVersion Include="System.Drawing.Common" Version="4.7.3" /> </ItemGroup> </Project>
2. 本地验证依赖有效性
- 清理NuGet本地缓存:
dotnet nuget locals all --clear - 重新还原依赖:
dotnet restore - 检查项目的
obj/project.assets.json或.lock.json文件,确认所有System.Drawing.Common的引用版本均为4.7.3,无4.7.0条目
3. TFS CI构建流水线修改
- 添加缓存清理步骤:在
dotnet restore之前执行dotnet nuget locals all --clear,避免构建代理上的旧缓存干扰 - 强制还原依赖:将restore命令改为
dotnet restore --force,确保依赖完全更新 - 添加依赖验证步骤:在restore后添加命令
dotnet list package --include-transitive | findstr System.Drawing.Common,输出依赖版本并记录到构建日志,便于排查 - 确认.NET SDK版本:确保流水线使用的.NET SDK为6.0.x系列(兼容6.0.6运行时),避免SDK版本不匹配导致的依赖解析问题
4. Blackduck扫描适配
- 确保扫描目标为构建后的输出目录(如
bin/Release/net6.0),而非项目源码目录,保证扫描的是实际运行的dll文件 - 若扫描仍报风险,需确认Blackduck的漏洞数据库是否已将System.Drawing.Common 4.7.3标记为CVE-2021-24112的修复版本;若未同步,可在Blackduck平台手动标记该版本为合规
补充说明
System.Drawing.Common 4.7.2、4.7.3及≥5.0.3版本已修复CVE-2021-24112漏洞,核心是确保项目构建输出中不存在4.7.0版本的dll,同时让Blackduck正确识别实际使用的安全版本。
内容的提问来源于stack exchange,提问作者RAMA KRISHNA

