直接项目全局搜索log4j,有就改掉pom.xml.
如何验证一下呢?
/**
* 测试漏洞
*
* @return
*/
@GetMapping("testLog")
public void testLog(@RequestParam String testLog){
log.info("testLog:"+testLog);
}
请求参数时:${java:os}
查看打印log。 出现 testLog:Linux。 说明传入的${java:os}竟然被执行了。
我们去看这次错误的相关报道时,会看到 JNDI注入缺陷 这个词语。
有兴趣可看这篇文章腾讯安全应急响应中心关于JNDI的文章
里面提到一个方法lookup()
原文:JNDI接口在初始化时,可以将RMI URL作为参数传入,而JNDI注入就出现在客户端的lookup()函数中,如果lookup()的参数可控就可能被攻击。
这里可以验证,Log4j2的漏洞就是通过这个lookup()进去的。
我们把传入的${java:os}改为传入的${java:os1}
查看打印的日志。
at org.apache.logging.log4j.core.lookup.JavaLookup.lookup(JavaLookup.java:116)
log4j打印日志时,如果以${}开始,就会进入此方法。此方法会造成的问题可自行百度(可远程执行任意代码)。
修复方法:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.15.0</version>
</dependency>
疑问
以后政府,军工,大厂会把所有代码的源码都自己审核吗?
maven用阿里巴巴,Apache的RELEASE版本,理论上,管理者也可以修改吧?
这个问题能潜伏这么久还是有点儿灯下黑的意思。可能会让某些大厂或者政府智慧工程重新审视开源软件。