来自 OWASP 的代码安全检查工具:Dependency-Check,为你消除安全隐患

来自 OWASP 的代码安全检查工具:Dependency-Check,为你消除安全隐患

[概述] 研发工程狮日常开发中,经常会使用各种开源库(比如 Java 的 Maven 依赖、Python 的 pip 包)来提高效率(站在前人的肩膀上,避免重复造轮子)。但这些 “第三方组件” 很可能隐藏着各种各样的安全漏洞。据 OWASP 报告,超过 90% 的应用程序安全问题源于依赖组件,而非自研代码,这听起来是不是有点吓人?


今天要介绍下 Dependency-Check 的代码安全检查工具,就是专门检测 “依赖组件漏洞” 的工具。无论你是开发、测试还是运维安全人员,掌握它都能帮你快速揪出项目里的 “隐形炸弹”。

什么是 Dependency-Check?

简单说,Dependency-Check 是一款免费开源的依赖漏洞扫描工具,由 OWASP(开放 Web 应用安全项目)维护。它的核心功能是:自动检测项目中使用的第三方组件(如 JAR、npm 包、Python 库等),并比对全球权威漏洞数据库,找出存在安全风险的组件及对应的漏洞。

举个例子:如果你的项目用了存在 Log4j 漏洞的 log4j-core-2.14.1.jar,Dependency-Check 会扫描到这个 JAR 包,并告诉你它包含 CVE-2021-44228 漏洞,风险等级为 “严重”,还会附上修复建议(比如升级到 2.17.0 版本)。

Dependency-Check 的核心特点

  • 支持多语言 / 多构建工具能扫描 Java(Maven/Gradle)、Python(pip)、JavaScript(npm/yarn)、.NET(NuGet)等几乎所有主流开发语言的依赖,兼容性极强。
  • 对接权威漏洞库内置 NVD(美国国家漏洞数据库)、CISA(美国网络安全局)已知被利用漏洞库、OSS Index 等多个数据源,漏洞信息实时更新,覆盖全面。
  • 操作简单,易集成支持命令行、GUI 图形界面,还能无缝集成到 Jenkins、GitLab CI 等自动化流程中,适合 DevOps 场景。

  • 报告清晰, actionable扫描后生成 HTML、XML、JSON 等格式的报告,不仅列出漏洞,还会标注风险等级(高危 / 中危 / 低危)、漏洞描述、修复方案(如推荐升级版本),直接指导修复。

漏洞修复建议:

安装 Dependency-Check(以 Linux 为例)

Dependency-Check 是 Java 开发的,安装前需确保本地有 JDK 8+ 环境(可通过 java -version 检查,新版本需要更高的Java版本),如最新的dependency-check-12.1.0需要jdk17.

下载安装包

到 官方 GitHub Releases 下载最新版(如

dependency-check-12.1.0-release.zip),或用命令行:

wget https://github.com/dependency-check/DependencyCheck/releases/

download/v12.1.0/dependency-check-12.1.0-release.zip

# 解压到 /opt 目录

unzip dependency-check-12.1.0-release.zip.zip -d /opt/

# 简化目录名(可选)

mv /opt/dependency-check-12.1.0 /opt/dependency-check

# 添加到环境变量(方便全局调用)

echo ‘export PATH=$PATH:/opt/dependency-check/bin’ >> ~/.bashrc

source ~/.bashrc

验证安装

运行以下命令,若显示对应的版本号则安装成功:

dependency-check.sh –version

返回:Dependency-Check Core version 12.1.0

漏洞库更新:保持扫描准确性的关键

Dependency-Check 依赖漏洞库(如 NVD、CISA 数据)进行检测,首次使用或定期需更新漏洞库,确保扫描结果是最新的。

手动更新漏洞库

# 仅更新漏洞库,不扫描项目

dependency-check.sh –updateonly

实际使用中,特别是在第一次更新漏洞库时会耗时很长,很可能更新失败:

我这里临时解决办法是使用代理,另外把known_exploited_vulnerabilities.json下载后放入到本地http服务中,通过“–kevURL”参数指定新的下载地址,如:

./dependency-check.sh \

–updateonly –kevURL \

http://myhost/sectools/known_exploited_vulnerabilities.json

开始安全检查:扫描你的项目

基础扫描命令

进入项目根目录(如 Java 项目的 pom.xml 所在目录、npm 项目的 package.json 所在目录),执行:

# 扫描当前目录,输出报告到 ./report 文件夹

dependency-check.sh –scan . –out ./report

我这边是要检查mvn编译后打包成的jar,所以实际的扫描命令如下

dependency-check.sh -n –project myproject –scan /code/project/target/ –out /opt/Dependency-Check/report/ –disableOssIndex –disableAssembly

关键参数说明

  • –scan 路径:指定要扫描的项目目录(必填)。
  • –out 路径:指定报告输出目录(默认在当前目录生成)。
  • –format 格式:指定报告格式(如 HTML、XML,默认生成 HTML)。
  • –failOnCVSS 数值:当漏洞的 CVSS 评分(0-10,越高越危险)超过指定值时,扫描失败(适合 CI 流程拦截)。例如 –failOnCVSS 7 表示高危漏洞(≥7)时阻断构建。
  • –disableAssembly 禁止对. NET的扫描
  • –disableOssIndex Disable the Sonatype OSS,我这边没有更新成功OSS

检测开始,最后生成检测报告

解读扫描报告:从报告中找问题

扫描完成后,在输出目录(如 ./report)会生成 dependency-check-report.html,用浏览器打开即可查看。

报告核心内容

摘要统计:总依赖数、存在漏洞的依赖数、高危 / 中危 / 低危漏洞数量。

漏洞详情:

受影响的组件(如 log4j-core-2.14.1.jar);

漏洞 ID(如 CVE-2021-44228);

风险等级(CVSS 评分)、漏洞描述(如 “远程代码执行”);

修复建议(如 “升级到 2.17.0 及以上版本”)。

因为有太多项目需要扫描,所以按照项目作为目录区分,然后生成了一个整体报告页面,方便查看。

进阶:集成到CI/CD自动化流程

为了让漏洞检测成为开发流程的一部分,可将 Dependency-Check 集成到 Jenkins、GitLab CI 等工具中,实现 “提交代码即自动扫描”。

Jenkins 集成示例

安装 Jenkins 插件 Dependency-Check Plugin;

在 Jenkins 任务中添加 “执行 shell” 步骤:

dependency-check.sh –scan ./src –out ./dc-report –failOnCVSS 7

勾选 “Publish Dependency-Check Results”,指定报告路径(如./dc-report/dependency-check-report.xml);保存后,每次构建都会自动扫描,若存在高危漏洞则构建失败。

OK,这里总结一下

Dependency-Check 就像一个 “依赖安检仪”,帮你在项目上线前排查第三方组件的安全隐患。它免费、易用、覆盖广,是开发和安全人员的必备工具。

不过很多时候安全检测工具和报告都有了,但是总是会因为这样或那样的原因无法修复,比如(领导们担心版本升级带来的兼容性,研发人员要考虑升级修复,测试验证的排期等等)这也是很多工具无法真正返回其作用的原因。开发人员可是不关心引入的依赖包的安全问题的。

我司工具上线后真正修复的就是常见的几个严重的依赖,如log4j,fastjson等,只能慨叹英雄无用武之地!

实际上由于依赖引发的漏洞不是 “要不要修” 的问题,而是 “什么时候修”,这就需要安全人员的坚持和领导的重视,如果根据引入的依赖漏洞直接可以渗透成功且拿到shell后,你看看研发和各位领导会是啥表情~

(全文完)

Comments

No comments yet. Why don’t you start the discussion?

发表回复