ARTICLE DETAIL

资讯详情

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

OWASP dependency-check Node Package Analyzer 深度解析:从 package.json 构建 Node.js 依赖清单(BOM)

OWASP dependency-check Node Package Analyzer 深度解析:从 package.json 构建 Node.js 依赖清单(BOM) 应用安全供应链安全漏洞扫描开发工具【免费下载链接】DependencyCheckOWASP dependency-check is a software composition analysis utility that detects publicly disclosed vulnerabilities in application dependencies.项目地址https://gitcode.com/GitHub_Trending/dep/DependencyCheck点击查看免费下载导读本指南围绕 OWASP dependency-check 的Node Package AnalyzerNode 包分析器展开讲解它如何通过扫描package.json、package-lock.json与npm-shrinkwrap.json三类 npm 包描述文件为 Node.js 项目构建软件物料清单bill-of-materials, BOM并与 Node Audit Analyzer 协同完成已知漏洞的检测。读完本文你将掌握该分析器的扫描范围、内部解析逻辑、配置开关、最佳实践以及各类依赖边角场景的处理方式。分析器定位Node.js 依赖清单的信息采集员Node Package Analyzer 是 OWASP dependency-check 众多分析器analyzer之一其核心职责是从 npm 的包规范文件中抽取依赖信息生成每个 Node.js 模块的 Dependency 对象为后续的漏洞匹配如 NVD CPE 匹配、Node Audit、OSS Index提供数据基础。它的设计意图非常明确与分析器配合为 Node.js 项目创建一份完整的软件物料清单BOM。其中Node Package Analyzer负责解析包规范文件把依赖树展开成一个个依赖项名称、版本、生态、证据、purl 标识等Node Audit Analyzer负责将package-lock.json提交给 npm audit API返回安全公告advisory并注入到报告中。二者的关系在原文档中被称为协同工作works in conjunction从源码看这种协同是强耦合的Node Package Analyzer 在初始化时prepareFileTypeAnalyzer见 NodePackageAnalyzer.java会校验 Node Audit Analyzer 或 OSS Index Analyzer 是否启用若二者都未启用会直接抛出初始化异常Invalid Configuration: enabling the Node Package Analyzer without using the Node Audit Analyzer or OSS Index Analyzer is not supported.也就是说单靠 Node Package Analyzer 只能产出清单真正的漏洞判定必须依赖后续的审计类分析器这是使用本功能前必须理解的整体架构。扫描范围三类 npm 包规范文件原文档明确列出了该分析器扫描的文件类型package.jsonnpm 的包描述文件项目自身元数据 直接依赖声明package-lock.jsonnpm v5 生成的锁文件锁定完整依赖树npm-shrinkwrap.json可发布、可共享的锁文件变体。在源码中这三类文件通过统一的文件过滤器注册NodePackageAnalyzer.javaprivate static final FileFilter PACKAGE_JSON_FILTER FileFilterBuilder.newInstance() .addFilenames(PACKAGE_JSON, PACKAGE_LOCK_JSON, SHRINKWRAP_JSON).build();对应的三个常量分别是package.json、package-lock.json、npm-shrinkwrap.json见同文件 L88-L96。单测testSupportsFiles也验证了analyzer.accept(new File(package-lock.json))与npm-shrinkwrap.json均返回true见 NodePackageAnalyzerTest.java。需要注意两个重要边界不扫描node_modules内部分析器继承自AbstractNpmAnalyzer其shouldProcess方法会检查文件的规范路径canonical path凡是包含/node_modules/或/bower_components/的路径都会被跳过AbstractNpmAnalyzer.java。原因在于锁文件已经固化了依赖树无需再遍历磁盘上的模块副本这既避免重复扫描也大幅降低扫描量。对package.json的去重处理当同一目录下同时存在锁文件时package.json的分析会被跳过——因为锁文件包含更精确、完整的依赖树NodePackageAnalyzer.java。优先级为npm-shrinkwrap.jsonpackage-lock.jsonpackage.json。工作流程从锁文件到依赖对象分析器在INFORMATION_COLLECTION信息采集阶段运行其核心处理入口是analyzeDependency与递归方法processDependenciesNodePackageAnalyzer.java。整体流程可概括为五步前置校验文件必须非空且不在node_modules内部若启用了 Node Audit 且当前分析的是package.json而非锁文件则直接将其从依赖列表中移除engine.removeDependency避免与锁文件重复。锁文件检查若目录下既没有package-lock.json、npm-shrinkwrap.json也没有yarn.lock会输出警告并提示潜在误报false negativesNo lock file exists - this will result in false negatives; please runnpm install --package-lock同时若node_modules目录不存在也会给出提示请先执行npm install再运行 dependency-checkL251-L256。解析 JSON使用 Jakarta JSON 读取器解析文件内容提取项目自身的name与version作为父包标识parentPackage。递归展开依赖树processDependencies根据lockfileVersion选择解析路径lockfileVersion 2读取顶层packages对象npm v7 的扁平化结构v2/v3 均适用lockfileVersion 1或缺失读取dependencies对象两者皆无跳过处理。对于每个依赖项分析器会定位其在node_modules下的实际模块目录读取该模块的package.json并递归处理其嵌套dependencies从而覆盖传递依赖。构造 Dependency 对象为每个模块创建 Dependency带rootFile?ref/name:version形式的虚拟文件路径设置生态为Ecosystem.NODEJS、计算 MD5/SHA1/SHA256 校验和、调用gatherEvidence采集证据并生成pkg:npm/nameversion形式的 Package URLpurl软件标识。单测testAnalyzeShrinkwrapJson验证了传递依赖的展开扫描npm-shrinkwrap.json后braces与expand-rangebraces的传递依赖均出现在依赖列表中见 NodePackageAnalyzerTest.java。证据采集package.json 中哪些字段会被利用gatherEvidence定义于 AbstractNpmAnalyzer.java负责从每个模块的package.json中提取证据供后续 CPE/NVD 匹配使用package.json 字段证据类型用途说明nameVENDOR / PRODUCT模块名同时以name_project形式补充厂商证据descriptionVENDOR模块描述authorVENDOR作者信息不存在时回退到maintainersmaintainersVENDOR维护者列表homepageVENDOR项目主页bugsVENDORBug 跟踪地址versionVERSION版本号并生成 npm 类型 purllicense—写入依赖的许可证信息支持字符串、数组、对象三种形态从源码注释可以看到一个重要的取舍description 只作为 VENDOR 证据加入避免参与 CPE 分析因为描述文本容易造成大量误报L326 的 TODO 注释。这解释了为什么 Node 生态的漏洞匹配更多依赖 Node Audit / OSS Index 而非 NVD CPE。配置项与默认值启用开关分析器默认启用对应配置项定义在 Settings.javaanalyzer.node.package.enabled是否启用 Node Package Analyzer默认true见 dependencycheck.propertiesanalyzer.node.package.skipdev是否跳过devDependencies开发依赖默认false。在 CLI 中可通过--enable/--disable或属性文件覆盖Maven 插件则通过analyzerNodePackageEnabled等参数配置。若禁用了 Node Package Analyzer 而仅保留 Node Audit源码会提示报告中将只包含已知漏洞依赖而不再包含 Node 项目的完整物料清单AbstractNpmAnalyzer.java。关联分析器配置由于 Node Package Analyzer 强依赖审计类分析器以下几个默认配置与之直接相关dependencycheck.propertiesanalyzer.node.audit.enabledtrueNode Audit Analyzer默认启用需联网访问 npm audit APIanalyzer.node.audit.urlhttps://registry.npmjs.org/-/npm/v1/security/audits审计 API 地址analyzer.node.audit.use.cachetrue审计结果缓存analyzer.ossindex.enabledtrueOSS Index Analyzer默认启用。源码中的初始化校验逻辑NodePackageAnalyzer.java进一步细化了三种组合场景Node Package Node Audit 都未启用仅用 OSS Index提示 Node.js 使用 OSS Index 可能产生大量误报建议启用 Node Audit Analyzer跳过 Node 生态的 CPE 分析且未启用 OSS Index 与 Node Audit直接抛出初始化异常拒绝运行跳过 Node 生态 CPE 且 Node Audit 未启用若缺少package-lock.json/npm-shrinkwrap.json抛出异常Missing package.lock or npm-shrinkwrap.lock file: Unable to scan a node project without a package-lock.json or npm-shrinkwrap.json.依赖边角场景与跳过规则shouldSkipDependencyNodePackageAnalyzer.java定义了哪些依赖不进入清单这是实战中经常遇到的坑npm 别名alias版本以npm:开头如npm:hot-loader/react-dom会被跳过因为npm audit不支持别名源码会记录警告package.json contain an alias ... npm audit doesnt support aliases可选但未安装的模块optional: true且磁盘上不存在对应package.json时跳过如fsevents仅在 macOS 安装非 Mac 平台扫描时被跳过——单测testLock中对此有显式断言见 NodePackageAnalyzerTest.java本地模块引用版本以file:开头或以./~开头的相对路径如file:fake_submodulenpm audit 不支持本地引用模块直接跳过单测同样验证了fake_submodule不应出现L197-L199空名称name为空的条目跳过常见于 package-lock v2 中的根条目链接依赖linklink: true的条目跳过避免后续解析崩溃。此外若启用了analyzer.node.package.skipdevtruedev: true的开发依赖也会被过滤。依赖去重与合并依赖树展开后同一模块可能被多个父包引用。分析器通过findDependency按生态 名称 版本匹配AbstractNpmAnalyzer.java查找已存在的依赖再进行合并NodePackageAnalyzer.java已存在的是虚拟依赖virtual调用DependencyMergingAnalyzer.mergeDependencies合并后替换已存在的是真实依赖调用DependencyBundlingAnalyzer.mergeDependencies归并将新引用作为 project reference 追加。因此最终报告中每个 npm 模块只出现一次但会记录它被哪些项目/作用域引用便于追溯调用关系。最佳实践总结结合原文档与源码使用 Node Package Analyzer 的推荐姿势如下务必提交锁文件package-lock.json或npm-shrinkwrap.json是准确构建 BOM 的前提。缺失锁文件时分析器会输出误报警告且部分场景下直接拒绝初始化配置了 skip-ecosystem 时。扫描前执行npm install分析器需要读取node_modules下各模块的package.json来计算校验和与采集证据目录缺失时会跳过分析。保持 Node Audit Analyzer 启用默认即启用需联网。仅依赖 OSS Index 可能引入大量误报两者都关闭则无法完成 Node 项目的漏洞判定。合理使用skipdev若只关心生产依赖的漏洞可开启analyzer.node.package.skipdev以缩小扫描范围、加快速度。注意别名与本地依赖的局限npm:别名、file:本地模块、可选未安装模块不会被纳入清单这是 npm audit 生态的固有边界需要在报告中结合人工审计补充。验证与进一步阅读分析器实现NodePackageAnalyzer.java公共抽象基类证据采集、purl 生成、去重AbstractNpmAnalyzer.java单元测试覆盖 v1/v2/v3 锁文件、无锁文件、本地依赖、别名跳过等场景NodePackageAnalyzerTest.java默认配置dependencycheck.properties配套分析器文档Node Audit Analyzer分析器总览见 analyzers/index.md总而言之Node Package Analyzer 是 dependency-check 在 JavaScript 生态中的清单构建引擎它把 npm 的声明文件转化为结构化、可追溯、带 purl 标识的依赖集合再交由 Node Audit 与 NVD/OSS Index 完成漏洞判定。理解其扫描边界、配置联动与跳过规则是在 CI 中准确落地 Node.js 软件成分分析SCA的关键一步。赞分享应用安全供应链安全漏洞扫描开发工具【免费下载链接】DependencyCheckOWASP dependency-check is a software composition analysis utility that detects publicly disclosed vulnerabilities in application dependencies.项目地址https://gitcode.com/GitHub_Trending/dep/DependencyCheck点击查看免费下载相关推荐如何5分钟掌握res-downloader解锁全网视频音乐图片资源下载神器如何5分钟掌握res downloader解锁全网视频音乐图片资源下载神器 还在为无法下载微信视频号、抖音无水印视频、QQ音乐等平台资源而烦恼吗res do桌面应用网络音视频推荐文章OWASP Dependency-Check —— 构建安全的软件依赖环境推荐文章OWASP Dependency Check —— 构建安全的软件依赖环境 在当今快速发展的软件行业安全性已成为软件开发不可或缺的一部分。OWASP漏洞扫描应用安全供应链安全开发工具OWASP Dependency-Check与Grafana集成构建依赖安全监控仪表盘OWASP Dependency Check与Grafana集成构建依赖安全监控仪表盘 OWASP Dependency Check是一款强大的软件成分分析工应用安全供应链安全漏洞扫描开发工具上一篇TypeSpec HTTP Linter 使用指南op-reference-container-route 路由规则详解下一篇Node.js 18.14.2 (LTS) 发布公告深度解读npm 9.5.0 升级、安全变更与全平台下载校验指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表