工程上不可避免的引入的依赖发生CVE
漏洞的情况,像比较有名的log4j 1.x
的远程执行漏洞,对于已知的漏洞可以使用dependency check
来进行漏洞扫描,发现工程上的漏洞。本文旨在如何发现工程上的漏洞,如何解决依赖漏洞。
1、dependency check
官网 可以下载command line来执行扫描,第一次运行需要下载很多信息,时间较长(猜测是CVE相关的数据),查看帮助:
shell
bin/dependency-check.sh --help
扫描产出:
shell
bin/dependency-check.sh -s /path/to/jar -o /output
2、maven依赖分析
两个命令:
查看maven工程的依赖树
shell
mvn dependency:tree
查看具体某个依赖坐标的情况,比如查看groovy的依赖引入情况:
shell
mvn dependency:tree -Dverbose -Dincludes=org.codehaus.groovy:groovy
这样我们能看到依赖是如何引入的,以及引入的scope,在修复完成后,也能通过这种方式来验证依赖全部修复完成。
3、处理漏洞
发现了漏洞就需要对依赖做升级或者剔除处理:
- 升级 ,在
maven
中央仓库中寻找高版本,不含有CVE
漏洞的,进行版本升级,版本升级有可能涉及到工程代码的变动,比如log4j1.x
升级到log4j2.x
配置文件会有变动,版本之间的兼容性问题需要考虑和解决。 - 剔除,对于引入漏洞的jar包,我们可以进行定向剔除,追踪到引入漏洞的依赖,定点排除无用的jar,善用
xml
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
- 剔除and升级 , 当依赖的
jar
由transitive scope
是compile
来引入的,如果做简单的剔除,代码有问题,这时候可以做定向升级,做法是先进行定向排除,再单独引入高版本进行升级处理。比如:
xml
<dependency>
<groupId>xxxxx</groupId>
<artifactId>xxxx</artifactId>
<version>x.x.x</version>
<exclusions>
<exclusion>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.11.0</version>
</dependency>