代码依赖包安全漏洞检测工具
工具1:Dependency-Check
Dependency-Check概述
-
Dependency-Check 是 OWASP(Open Web Application Security Project)的一个实用开源程序,用于识别项目依赖项并检查是否存在任何已知的,公开披露的漏洞。目前,已支持Java、.NET、Ruby、Node.js、Python等语言编写的程序,并为C/C++构建系统(autoconf和cmake)提供了有限的支持。而且该工具还是OWASP Top 10的解决方案的一部分。
-
Dependency-Check 支持面广(支持多种语言)、可集成性强,作为一款开源工具,在多年来的发展中已经支持和许多主流的软件进行集成,比如:命令行、Ant、Maven、Gradle、Jenkins、Sonar等;具备使用方便,落地简单等优势。
Dependency-Check实现原理
依赖性检查可用于扫描应用程序(及其依赖库),执行检查时会将 Common Platform Enumeration (CPE)国家漏洞数据库及NPM Public Advisories库下载到本地,再通过核心引擎中的一系列分析器检查项目依赖性,收集有关依赖项。
NVD概述
Dependency-Check依赖NVD漏洞数据库(美国国家通用漏洞数据库)进行依赖漏洞检查(全球信息安全领域著名的漏洞数据库包括中国国家信息安全漏洞库,美国国家信息安全漏洞库NVD,赛门铁克漏洞库等等)官网:https://nvd.nist.gov/
NVD的更新频率是出现问题实时更新,具体链接:https://nvd.nist.gov/general/nvd-dashboard
CVSS概述
NVD评级依赖CVSS(CommonVulnerability Scoring System),即“通用漏洞评分系统”,是一个“行业公开标准,其被设计用来评测漏洞的严重程度,并帮助确定所需反应的紧急度和重要度,具体评分标准如下:
1)CRITICAL(9.0 - 10.0):这些漏洞通常具有最高的严重性,可能导致远程代码执行、大规模数据泄露、系统完全被攻陷等影响。应立即修复或采取其他补救措施。
2)HIGH(7.0 - 8.9):这些漏洞可能会导致重大安全问题,如数据泄露、拒绝服务攻击等。应尽快修复。
3)MEDIUM(4.0 - 6.9):这些漏洞可能会导致中等程度的安全问题,但利用难度较大或者影响范围有限。虽然不需要紧急处理,但应在合理的时间内修复。
4)LOW(0.1 - 3.9):这些漏洞通常不会造成重大影响。可以在日常维护过程中进行修复。
5)NONE*(0):无问题。
Dependency-Check报告漏洞划分标准
Dependency-check对漏洞严重程度判定有四档分别为:
1)CRITICAL:这些漏洞通常会导致非常严重的后果,如远程代码执行、大规模数据泄露等。应优先处理。
2)HIGH:高危漏洞可能导致严重的后果,但不一定能直接被利用。也应尽快修复。
3)MEDIUM:中等风险漏洞可能会导致较大的安全问题,但利用难度较大或影响范围有限。
4)LOW:低风险漏洞一般不会造成重大影响,但在有余力的情况下也应考虑修复。
环境要求
1、Java 8 或更高版本
2、至少2GB内存(建议更多)
3、有网络连接,或身边拥有互联网设备(用于下载漏洞数据库)
安装
网盘地址:https://pan.baidu.com/s/1xXsVEtYe2xp6_LYh01PY6A?pwd=YmXz
官网地址:https://owasp.org/www-project-dependency-check (点击【Command Line】下载最新版本的ZIP包)
使用
进入\dependency-check\bin
目录下,打开cmd
窗口
执行命令dependency-check.bat --update
下载最新缺陷库(首次下载时间较长,等待执行完成即可)
依赖项扫描
执行以下命令对目标项目包进行扫描:
dependency-check.bat -n --project "test" --scan "E://home/lib" -o E://home/report/
- --project 代表指定项目名称,这个名称将出现在生成的报告中,用于标识不同的扫描项目,扫描时将test替换成实际项目名;
- -s 代表检查的项目文件夹,扫描时将E:\test\ems-jars替换成实际项目包路径;
- --format 代表指定输出报告的格式,支持的格式包括HTML、XML、JSON等,扫描时按实际需求填写,推荐HTML;
- -o 代表指定输出报告的文件路径,若不填写则默认输出到D:\dependency-check-10.0.2-release\dependency-check\bin路径下,扫描时将test.html替换成实际报告名称
- --disableHostedSuppression 代表禁用Hosted Suppressions更新,若自动或手动更新过publishedSuppressions.xml文件即可添加此命令。
报告分析
1、打开扫描报告,查看报告中的报告概览
- dependency-check version(工具版本): 6.5.1
- Report Generated On(报告生成时间): Thu, 12 Dec 2024 09:30:44 +0800
- Dependencies Scanned(依赖项扫描数): 259 (191 unique)
- Vulnerable Dependencies(漏洞依赖项数): 57
- Vulnerabilities Found(总计漏洞数): 184
- Vulnerabilities Suppressed(抑制的漏洞数): 0(抑制的漏洞指的是在扫描过程中,被工具识别并且被用户或配置文件明确忽略的漏洞数量。这些被“抑制”的漏洞不会出现在最终的报告中)
2、分析过报告概览后查看报告详细信息。
Dependency | Vulnerability IDs | Package | Highest Severity | CVE Count | Confidence | Evidence Count |
---|---|---|---|---|---|---|
代表存在漏洞的依赖项 | 代表对应NVD的漏洞ID | 代表依赖中的包 | 代表漏洞的严重程度 | 代表与依赖包与漏洞关联的数量 | 代表工具对漏洞检测结果的置信度 | 代表支持该漏洞检测结果的证据数量 |
测试终端不可连接互联网
通过把安装好的目录用刻录等方式移动至不可连接互联网得终端中即可进行使用。
在不可连接互联网情况下进行扫描,扫描结果主要来自于验证NVD缺陷库,连接互联网情况下工具还会自动与Maven Central、OSS Index等开源软件库和三方库连接获取额外的漏洞数据,故离线扫描结果没有连接互联网扫描结果全面。
因测试终端不可连接互联网,所以此处扫描命令需进行更改。
dependency-check.bat -n --project "test" --scan "E://home/lib" -o E://home/report/ --disableHostedSuppression --disableCentral --disableOssIndex
- --disableCentral 此选项用于禁用对 Maven Central Repository 的访问。Maven Central 是一个公共的 Maven 仓库,其中存储了许多开源和第三方库的信息。在分析过程中,Dependency-Check 会尝试从 Maven Central 获取相关依赖项的安全漏洞信息,因设备无法连接互联网所以要将该功能禁用。
- --disableOssIndex 此选项用于禁用对 OSS Index 的访问。OSS Index 是一个专门用于扫描开源组件安全性的平台,它提供了有关开源库和其漏洞的信息。Dependency-Check 可以通过 OSS Index 来获取额外的漏洞数据,因设备无法连接互联网所以要将该功能禁用。
工具2:Grype
在开发和部署 Java 应用时,确保依赖库和项目文件中的安全性至关重要。Grype 是一款强大的开源工具,用于扫描项目文件(如 .jar 包)中的已知漏洞。本篇博客将介绍如何手动安装 Grype 并使用它检测 .jar 包中的安全漏洞。
一、手动安装 Grype
Grype 提供了一个简单的命令行工具来检测软件依赖项中的漏洞,支持包括 .jar 在内的多种文件格式。以下是如何在 Linux 系统上手动安装 Grype 的步骤。
1. 下载 Grype
前往Grype官网,下载适合你的操作系统的 Grype 版本。
2. 下载适合你的 Linux 版本
在页面中找到最新的发布版本,并下载与系统匹配的二进制文件。对于 Linux 用户,可以选择 grype_0.80.0_linux_amd64.tar.gz 这样的文件。
3. 上传到linux上
如: /www/wwwroot/grype
4. 解压文件
下载完成后,使用 tar 命令解压缩文件:
tar -xzf grype_0.80.0_linux_amd64.tar.gz
5. 将 Grype 移动到系统路径
将解压出来的 grype 二进制文件移动到 /usr/local/bin/
,这样系统会自动识别该命令。
sudo mv grype /usr/local/bin/
6. 检查 Grype 是否安装成功
执行以下命令,检查 Grype 是否已成功安装并可用:
grype version
如果安装成功,终端将显示 Grype 的版本信息,如:
Application: grype
Version: 0.80.0
BuildDate: 2024-01-01
二、检测 .jar 包中的漏洞
Grype 安装成功后,就可以开始扫描 .jar 文件中的安全漏洞了。Grype 支持扫描多种文件格式(如 .jar、.tar、.tgz 等),并会根据已知漏洞数据库提供详细的安全报告。
1. 使用 Grype 检查 .jar 包中的漏洞
假设我们已经生成了一个 .jar 包并希望检测其中的漏洞,可以使用以下命令:
grype path/to/your/file.jar
例如,如果你的 .jar 文件名为 app.jar,并且位于当前目录下,可以运行:
grype ./app.jar
Grype 将自动分析 .jar 文件的依赖项,并匹配公开的漏洞数据库(如 NVD、GitHub Advisories)中的信息,生成详细的安全扫描结果。
2. 输出信息
扫描完成后,Grype 会输出漏洞检测报告,包括以下内容:
- 漏洞 ID: 表示漏洞的唯一标识符(例如,CVE-编号)。
- 漏洞严重性: 表示该漏洞的严重性等级(低、中、高、关键)。
- 修复建议: 包含可能的修复方案或版本建议。
- 受影响的组件: 展示受影响的库或依赖项的版本信息。
输出示例如下:
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
Java-WebSocket 1.3.7 1.5.0 java-archive GHSA-gw55-jm4h-x339 High
bcprov-jdk15on 1.65 1.67 java-archive GHSA-73xv-w5gp-frxh High
bcprov-jdk15on 1.65 java-archive GHSA-wjxj-5m7g-mg7q Medium
bcprov-jdk15on 1.65 1.78 java-archive GHSA-v435-xc8x-wvr9 Medium
bcprov-jdk15on 1.65 1.78 java-archive GHSA-m44j-cfrm-g8qc Medium
bcprov-jdk15on 1.65 java-archive GHSA-hr8g-6v94-x4m9 Medium
bcprov-jdk15on 1.65 1.78 java-archive GHSA-8xfc-gm6g-vgpv Medium
bcprov-jdk15on 1.65 1.66 java-archive GHSA-6xx3-rg99-gc3p Medium
classgraph 4.8.83 4.8.112 java-archive GHSA-v2xm-76pq-phcf Medium
commons-compress 1.19 1.21 java-archive GHSA-xqfj-vm6h-2x34 High
commons-compress 1.19 1.21 java-archive GHSA-mc84-pj99-q6hh High
commons-compress 1.19 1.21 java-archive GHSA-crv7-7245-f45f High
commons-compress 1.19 1.21 java-archive GHSA-7hfm-57qf-j43q High
commons-compress 1.19 1.26.0 java-archive GHSA-4g9r-vxhx-9pgx High
commons-fileupload 1.4 1.5 java-archive GHSA-hfrx-6qgj-fp6c High
jackson-databind 2.12.6.1 2.12.7.1 java-archive GHSA-rgv9-q543-rqg4 High
jackson-databind 2.12.6.1 2.12.7.1 java-archive GHSA-jjjh-jjxp-wpff High
jdom 1.1 java-archive GHSA-2363-cqg2-863c High
jettison 1.1 1.5.2 java-archive GHSA-x27m-9w8j-5vcw High
jettison 1.1 1.5.4 java-archive GHSA-q6g2-g7f3-rr83 High
jettison 1.1 1.5.2 java-archive GHSA-grr4-wv38-f68w High
jettison 1.1 1.5.2 java-archive GHSA-7rf3-mqpx-h7xg High
jettison 1.1 1.5.1 java-archive GHSA-56h3-78gp-v83r Medium
logback-classic 1.2.11 1.2.13 java-archive GHSA-vmq6-5m68-f53m High
logback-core 1.2.11 1.2.13 java-archive GHSA-vmq6-5m68-f53m High
mysql-connector-java 8.0.28 8.2.0 java-archive GHSA-m6vm-37g8-gqvh High
netty-handler 4.1.75.Final 4.1.94.Final java-archive GHSA-6mjq-h674-j845 Medium
okio 3.2.0 3.4.0 java-archive GHSA-w33c-445m-f8w7 Medium
okio-jvm 3.2.0 3.4.0 java-archive GHSA-w33c-445m-f8w7 Medium
pagehelper 5.3.0 5.3.1 java-archive GHSA-w559-623p-vfg8 Critical
ruoyi-common 3.8.2 java-archive GHSA-vp22-232w-h9x8 Medium
snakeyaml 1.28 2.0 java-archive GHSA-mjmj-j48q-9wg2 High
snakeyaml 1.28 1.31 java-archive GHSA-3mc7-4q67-w48m High
snakeyaml 1.28 1.32 java-archive GHSA-w37g-rhq8-7m4j Medium
在报告中,Grype 会显示受影响的依赖项、受影响的版本、修复后的版本(如果存在)、漏洞 ID 和严重性等信息。通过这些信息,可以判断 .jar 文件中的潜在安全风险,并采取相应的修复措施。
总结
使用 Grype 可以轻松扫描 Java .jar 包中的安全漏洞,帮助开发者及安全工程师及时发现项目中的已知漏洞并尽快修复。通过本教程的手动安装和使用指南,你可以快速在 Linux 系统上部署 Grype,并进行漏洞扫描,确保你的项目依赖库的安全性。
场景描述
Java项目中往往会使用很多第三方类库或开源类库。在完成项目开发,并准备上线时,经常需要做漏洞扫描。一旦扫描出的上千的漏洞往往会让我们不知所措。如果上线要求非常严格,针对漏扫结果,我们需要逐个jar包查找有没有对应的升级或补丁。而即便我们找到了升级Jar包,在升级过程中也可能遇到版本不兼容的情况,甚至导致整个系统无法运行。
事实上,对于局域网类项目,或者内部网络已经做了严格的安全防护措施,甚至于各种端口全部关闭的情况下,单个软件包的漏扫并不能说明太大问题。
但为了满足漏扫规定,我们仍然需要处理,这里提供一种快速的清除项目中安全漏洞的方法。需要特别说明的是本插件仅仅针对我们项目打包出的Jar包清除了漏扫特征文件,使漏扫软件无法扫描出安全漏洞,并未进行事实上的软件包升级或任何填补漏洞的工作,请您要特别注意这一点。
项目常见漏洞
-
弱口令,密码太简单(增加复杂度)
-
口令明文传输问题(登录密码加密传输,使用HTTPS协议)
-
敏感信息泄露(关闭Swagger等服务,加密敏感数据、限制访问权限)
-
未授权可访问druid(关闭监控页面)
-
暴力破解短信验证码登录(设置验证码有效期和剩余次数)
-
恶意短信轰炸骚扰用户(有效期内不重复发送,次数限制)
-
低版本Fastjson导致RCE漏洞(更新Fastjson到最新版本)
-
健康监控Actuator暴露端口(禁用端点)
-
跨站XSS脚本攻击(对输入参数进行清理,转义输出到HTML的数据)
-
跨站请求伪造(CSRF)攻击:攻击者利用受信任用户的身份,执行未经授权的操作。(接口使用权限控制)
-
SQL注入攻击(使用预编译的SQL语句或ORM框架,避免直接拼接SQL字符串)
-
不安全的反序列化(确保反序列化的数据来源可信,使用安全的序列化机制)
-
未验证的重定向(仅允许重定向到可信域名)
-
文件上传漏洞(检查文件类型、大小、内容)
依赖漏洞修复
-
版本升级
最直接的修复方法是将存在漏洞的依赖升级到安全版本。但在升级前,需仔细阅读发布说明,确保新版本与项目兼容,避免引入新的问题。 -
替换依赖
有时,某个库的维护不再活跃,或者安全漏洞长时间未修复,可以考虑替换为功能相似但更安全的替代品。 -
临时缓解措施
对于短期内无法直接修复的漏洞,可以通过配置防火墙规则、增加额外的安全检查或限制不安全功能的使用来减轻风险。 -
补丁应用
部分情况下,供应商会提供补丁而非新版本来修复漏洞。及时应用这些补丁也是有效的修复手段。
存在问题
Spring依赖漏洞问题比较坑,免费版本的依赖很多都有漏洞,需要升级到商业版或更高的免费版本。
目前我们大多数项目用的都是JDK8和Springboot2.x版本,如果要把依赖升级到更高版本的依赖,就可能需要升级到JDK17和SpringBoot3.x版本,这又会遇到与现有代码和第三方库不兼容等等问题,需要大量的代码检查和修复工作,升级要谨慎!
处理建议
1、在不升级JDK和SpringBoot版本的情况下,先尝试升级到安全版本的依赖;
2、利用防火墙机制,确保只有合法的请求才可以访问您的应用程序;
3、使用Nginx代理,拦截未知或潜在的恶意请求;
4、在Spring Security配置中启用严格的安全措施,以减少漏洞的潜在攻击面;
5、找到依赖漏洞的具体问题,具体分析,可以尝试人为修复。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步