不能,dotnet list package --vulnerable 命令根本不存在于任何正式发布的 .NET SDK 中,运行会报错;官方推荐用 dotnet list package --include-transitive 导出依赖,再交由 SCA 工具或 CVE 数据库匹配分析。

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 目前只管前两项。










