经过一周时间的 log4j2 RCE 事件的发酵,事情也变也越来越复杂和有趣,就连 log4j 官方紧急发布了 2.15.0 版本之后没有过多久,又发声明说 2.15.0 版本也没有完全解决问题,然后进而继续发布了 2.16.0 版本。刚刚熬夜费劲升级了 2.15.0 版本的小伙伴们是不是心中一万个小羊驼奔过。然而在网络上也有各种文章和博客进行激烈的讨论,例如高版本的 JDK 也可以避免,开启 formatMsgNolookups 的方案,还有log4j1 可以幸免于难等等各种说法。在这里笔者针对这些讨论详细介绍一下,JDK 高版本是否可以避免,开启 formatMsgNolookups 的方案是否可行,log4j1 是否真的可以幸免于难。
JDK高版本是否可以避免问题
在上一篇文章里,我们以 RMI 下载远程的恶意代码的方式介绍如何复现 RCE,这里有一个前提就是被害方的 JVM 里打开了 RMI/LDAP 等协议的 truseURLCodebase 这个属性设置。由于在 java8u121 以上的版本中这些属性默认就是没有开启的,所以网上有了这样的讨论,那么事实我们真的就没有办法了么?被害方的机器环境里得到 RIM 的 reference 对象之后首先会在本地尝试加载该对象指定的类,如果没有就去该对象中指定的远程地址中去加载,那些属性只是在远程加载类的时候起作用。那么如果被害方的机器环境能找到一些可以运行危险代码的类,这样就可以绕过 java 版本的问题了, 原理如下图:
根据上面的原理,还真有这样的类可以被利用,这些类就是:
1. org.apache.naming.factory.BeanFactory
2. javax.el.ELProcessor
而这两个类就在 spring boot 的内置 tomcat 服务器里可以找到,惊不惊喜,意不意外,是不是顿时觉得自己又中招了。大名鼎鼎的 spring boot,有几个 java 应用没有使用这个框架呢,下面展示了内置 tomcat 服务器中的这些类:
下面来介绍如何利用这两个类触发 log4j 的 RCE漏洞和原理,RMI 服务端和触发的客户端程序例子如下图:
根据上面介绍,java 版本在比较高的情况下可以避免也是有前提的,那就是你的本地的 JVM 环境中没有上面两个类的引用。但是我们已经看到了,这两个类就在 spring boot 框架中的内置 tomcat 服务器中,所以还是有不保险的机会。
开启 formatMsgNolookups 是否可以
还有的方案说开启 formatMsgNolookups 就可以避免这个问题,那么情况真的是这样么。笔者在开启该设置的前提下,依然复现了问题:
Log4j2 2.15.0 的隐患是什么
官网已经明确说明 2.15.0 版本有问题,那么隐患是什么呢?引用官网的一段原文如下:
Log4j1 就可以幸免于难么
有的讨论说 log4j1 版本就可以避免这个问题的发生,但是事实真的是这样么?在下面两种情况下 log4j1 也有可能被攻击,首先是我们有向消息队列中发送日志:
我们再来看看 log4j1 中的 socket server,它是可以启动一个基于 tcp 的 socket 网络服务,用来接受远端发送过来的日志:
目前先我们写到这里,这个漏洞自打暴露以来网络上有各种各种的讨论和方案,但是最终要的是不盲从,不跟风,不人云亦云。问题确实严重,我们需要的是实实在在分析,找到根本原因。由上面分析看每种情况都有特定的条件,我们一定要在找到每种情况的根本原因基础上,结合实际能否复现的条件来做出合理的修复方案。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有