C# 依赖项漏洞扫描方法 C#如何使用dotnet list package --vulnerable

来源:这里教程网 时间:2026-02-21 17:41:00 作者:

dotnet list package --vulnerable 真的能直接扫描漏洞吗?

不能。截至 .NET SDK 8.0(2024 年中),

dotnet list package --vulnerable
命令**根本不存在**——它从未被合并进任何正式发布的 .NET CLI 版本。你在文档、GitHub issue 或某些博客里看到的,基本是早期设计提案、PR 草案或误传。运行该命令只会得到
Unrecognized command or argument '--vulnerable'
错误。

替代方案:用 dotnet list package + 三方服务做漏洞映射

官方推荐路径是分两步:先导出依赖树,再交由支持 CVE 匹配的工具分析。核心命令仍是

dotnet list package --include-transitive
,但需配合外部数据源:

执行
dotnet list package --include-transitive --out dependencies.txt
导出所有包名+版本到文本
dependencies.txt
丢给 Dependabot(GitHub 自动扫描)、Attack Surface Analyzer 或商业 SCA 工具(如 Snyk、WhiteSource)
注意:NuGet.org 官方 API
https://api.nuget.org/v3/registration3/{id}/index.json
不提供 CVE 关联数据,必须依赖第三方漏洞数据库

为什么不用 NuGet Package Explorer 或手动查 CVE?

人工方式在中大型项目里不可行,原因很实际:

一个
Microsoft.AspNetCore.Mvc
包可能间接拉入 30+ 子依赖,每个子依赖又有自己的补丁版本链
CVE 编号和 NuGet 包名不一一对应——比如
CVE-2023-36799
影响的是
System.Text.Json
,但漏洞描述里可能只写 “.NET Runtime”,需要人工定位到具体包
dotnet --list-sdks
显示的 SDK 版本 ≠ 运行时漏洞面;真正要扫的是
obj/project.assets.json
里解析出的实际解析版本(含 patch 版本)

最轻量可行的本地检查脚本(PowerShell 示例)

如果你只想快速确认几个关键包是否已知高危,可结合 NuGet V3 API 和公开 CVE 数据源(如 NVD JSON feed)写简单匹配逻辑:

Invoke-RestMethod "https://services.nvd.nist.gov/rest/json/cves/2.0?keywordSearch=system.text.json&resultsPerPage=20" | 
  Select-Object -ExpandProperty vulnerabilities |
  Where-Object { $_.cve.metrics.cvssMetricV31.cvssData.baseScore -ge 7.5 } |
  ForEach-Object { $_.cve.descriptions | Where-Object { $_.lang -eq 'en' } | Select-Object -ExpandProperty value }

但注意:这仅查关键词,无法自动关联到你项目中

System.Text.Json 6.0.1
是否真受影响——仍需人工核对 CVE 的
versionsAffected
字段范围。真正的自动化,绕不开专用 SCA 工具或 CI 集成。

别指望一条 CLI 命令解决所有问题;漏洞映射的本质是「包坐标 + 版本范围 + CVE 上下文」三者对齐,而 .NET CLI 目前只管前两项。

相关推荐