ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

osv-scanner 包弃用检测实战:用 --experimental-flag-deprecated-packages 识别 Deprecated 与 Yanked 依赖

osv-scanner 包弃用检测实战:用 --experimental-flag-deprecated-packages 识别 Deprecated 与 Yanked 依赖 osv-scanner 包弃用检测实战用 --experimental-flag-deprecated-packages 识别 Deprecated 与 Yanked 依赖【免费下载链接】osv-scannerVulnerability scanner written in Go which uses the data provided by https://osv.dev项目地址: https://gitcode.com/GitHub_Trending/os/osv-scanner本文是 osv-scanner 实验性功能包弃用检测Flag Deprecated Packages的完整使用指南。该功能在常规漏洞扫描之外额外识别依赖中被作者标记为已弃用Deprecated或从软件源注册表中撤下Yanked的软件包覆盖项目源码扫描与容器镜像扫描两类场景。读完本文你将掌握该实验性标志的启用方式、五种输出格式下的呈现形态以及从 deps.dev 数据源到各输出器的底层实现链路。功能概述扫描不再被维护的依赖传统的漏洞扫描只关注存在已知安全漏洞的依赖而弃用检测关注的是作者已放弃或从仓库移除的依赖。两者互补一个弃用包即便暂时没有已知漏洞也可能意味着它不再接收安全修复、存在供应链维护风险。OSV-Scanner 通过--experimental-flag-deprecated-packages标志开启该能力其数据来源于 deps.dev API该 API 聚合了多个软件生态的包元数据。需要说明的是该功能当前属于实验性特性文档中标注为 Experimental且明确不支持在spdx格式下输出。从源码看该标志在 flags.go 中被定义为布尔开关cli.BoolFlag{ Name: experimental-flag-deprecated-packages, Usage: report if package versions are deprecated, },其值经由 getters.go 中的GetExperimentalScannerActions读取并传入扫描动作func GetExperimentalScannerActions(cmd *cli.Command) osvscanner.ExperimentalScannerActions { return osvscanner.ExperimentalScannerActions{ PluginsEnabled: cmd.StringSlice(experimental-plugins), PluginsDisabled: cmd.StringSlice(experimental-disable-plugins), PluginsNoDefaults: cmd.Bool(experimental-no-default-plugins), FlagDeprecatedPackages: cmd.Bool(experimental-flag-deprecated-packages), } }Deprecation Statusdeprecated 字段的两种含义检测结果的载体是package对象上的deprecated字段它是一个布尔值为true表示该软件包被标记为不受支持。该状态包含但不限于以下两类情形Deprecated已弃用软件包作者主动标记该包或某个版本为弃用状态通常意味着作者建议迁移到替代方案。Yanked已撤回软件包已从软件源注册表中移除。例如 npm 生态中发布后又被撤下的版本这类版本通常不能再被正常安装或引用。在数据模型层面该字段定义于 results.go 的PackageInfo结构体中type PackageInfo struct { Name string json:name OSPackageName string json:os_package_name,omitempty Version string json:version Ecosystem string json:ecosystem Commit string json:commit,omitempty Deprecated bool json:deprecated,omitempty ImageOrigin *ImageOriginDetails json:image_origin_details,omitempty Inventory *extractor.Package json:- }注意其 JSON 标签带omitempty当包未被标记弃用时该字段在 JSON 输出中会被省略这与文档中未检测到弃用包时省略对应字段的行为一致。项目源码扫描对本地项目目录执行扫描时在scan source子命令后追加该标志即可osv-scanner scan source --experimental-flag-deprecated-packages -r /path/to/project-r表示递归扫描目录及其子目录下的所有锁文件与清单文件。该命令会同时报告漏洞与弃用包退出码与常规扫描相同检测到问题时为非 0。更完整的源码扫描用法参见 Project Source Scanning。仓库自带的集成测试 command_test.goTestCommand_FlagDeprecatedPackages覆盖了四种典型场景测试数据位于 exp-plugins-pkgdeprecate 目录下测试用例输入预期行为package_deprecated_false_no_vuln_jsonclean/Cargo.lock无弃用包、无漏洞退出码 0package_deprecated_true_no_vuln_jsondeprecated-novuln/Cargo.lock存在弃用包但无漏洞退出码 1package_deprecated_true_with_vuln_jsondeprecated-vuln/Cargo.lock弃用包与漏洞并存退出码 1package_deprecated_npm_jsondeprecated-npm/package-lock.jsonnpm 生态弃用包检测退出码 1可见弃用包本身就会被视为需要处理的问题计入非零退出码而不仅是信息提示。容器镜像扫描scan image子命令同样支持该标志可扫描本地或远程镜像以及导出的镜像归档文件# 按名称扫描本地或远程镜像 osv-scanner scan image --experimental-flag-deprecated-packages my-image:tag # 扫描导出的镜像归档文件 osv-scanner scan image --experimental-flag-deprecated-packages --archive ./path/to/my-image.tar其中my-image:tag为镜像名与标签--archive指定通过docker save等工具导出的 tar 归档。镜像场景的集成测试见 image/command_test.go。更完整的镜像扫描说明参见 Container Image Scanning。输出格式五种呈现形态开启该标志后弃用包信息会按所选输出格式分别呈现Table / Markdown / HTML输出一个专门的弃用包分区dedicated section列出所有弃用包此外在表格视图中只要存在弃用包主表会追加一列Deprecated用True/--标识每个包是否弃用实现见 table.go。JSON在package对象中输出deprecated字段布尔值。SARIF在 Affected Packages 表格中增加 Deprecated 列实现见 sarif.go。CycloneDX在component中输出deprecated属性实现见 cyclonedx_common.go。GitHub Actions 注解作为补充githubannotation.go 也会在注解输出中包含弃用状态。若未检测到任何弃用包则对应分区、列或字段会被整体省略不会输出空章节。以下是文档给出的 JSON 输出示例{ results: [ { source: { path: /path/to/lockfile, type: lockfile }, packages: [ { package: { name: deprecated-package, version: 1.0.0, ecosystem: npm, deprecated: true } }, { package: { name: not-deprecated-package, version: 2.0.0, ecosystem: npm } } ] } ] }注意示例中第二个包因未弃用而没有deprecated字段这正是omitempty标签的实际效果。底层实现链路从数据源到输出从源码结构看弃用检测的完整数据流可以梳理为以下四个阶段标志解析CLI 层读取--experimental-flag-deprecated-packages通过GetExperimentalScannerActions注入扫描配置getters.go。元数据获取扫描过程中通过 deps.dev API 查询各依赖包的弃用状态并将结果写入PackageInfo.Deprecated字段。结果扁平化在 results.go 的Flatten()方法中弃用包与漏洞、许可证违规一起被展开为独立的扁平化结果条目便于下游各输出器统一处理if pkg.Package.Deprecated { results append(results, VulnerabilityFlattened{ Source: res.Source, Package: pkg.Package, Deprecated: pkg.Package.Deprecated, }) }统计与渲染output_result.go 在聚合阶段累计PkgDeprecatedCount各输出器表格、JSON、SARIF、CycloneDX、GitHub 注解依据该计数与每个包的Deprecated布尔值决定是否渲染对应列、分区或字段。此外包去重与分组环节也会透传弃用状态见 package_grouper.go确保同一包在多个来源中出现时弃用标记不会丢失。适用前提与限制该功能依赖 deps.dev API 提供包元数据因此离线环境下无法获取弃用信息使用时应确保网络可达。输出格式为spdx时不支持弃用报告需改用上述五种格式之一。功能当前标记为实验性Experimental标志名以experimental-前缀区分后续版本可能调整。弃用检测与漏洞检测相互独立一个包可能已弃用但无漏洞见deprecated-novuln测试也可能已弃用且存在漏洞见deprecated-vuln测试两者都应纳入依赖维护决策。小结包弃用检测为 osv-scanner 的依赖治理补上了维护健康度这一维度--experimental-flag-deprecated-packages让开发者以零成本的方式识别那些被作者放弃或从仓库撤回的依赖并借助 JSON、SARIF、CycloneDX、表格、Markdown、HTML 等多种输出与 CI/CD 流程集成。建议结合 usage.md、output.md 与 experimental.md 了解完整的命令体系与输出定制方式。【免费下载链接】osv-scannerVulnerability scanner written in Go which uses the data provided by https://osv.dev项目地址: https://gitcode.com/GitHub_Trending/os/osv-scanner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表