2.15.0之前版漏洞相关文章
Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识
Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理
Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法)
Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理
2.15.0版漏洞相关文章
Log4j2中2.15.0版存在的漏洞(CVE-2021-45046)的注入原理、复现步骤和如何修复(2.16.0修复原理)
2.16.0版漏洞相关文章
Log4j2中2.16.0版中DOS攻击(CVE-2021-45105)的漏洞原理、复现步骤和修复方法(2.17.0修复原理)
通过前面一些列的文章,我们已经熟悉了Log4j2本次漏洞的原理,同时也基于该漏洞实现进行了模拟攻击,作为本系统作为一篇文章,我们就一起来看看官方是如何修复该漏洞的。
其实查看Log4j2最新提交的代码(https://github.com/apache/logging-log4j2),咱们很容易就能看到其修复方法。
官方主要通过两个途径来修复该问题:新增jndi开关(默认关闭)和新增jndi相关域名、协议和Class白名单。
在消息处理类MessagePatternConverter中增加了Lookup开关,通过lookups参数来控制。默认为false。 即默认消息中不解析${}配置。在2.15.0之前的版本,默认MessagePatternConverter会对消息进行lookup操作(具体请参考2.14.1的MessagePatternConverter类实现)。
但是我们可以通过在日志patter中新增lookups来开启消息中的lookup功能。
如果使用者通过配置lookups主动开启了消息查找功能。官方也为我们提供了另外一道屏障来解决该注入漏洞。官方使用了一个比较简单的办法,即给协议、class和域名都添加白名单。这样只要使用者合理的使用都不会有问题。
默认白名单的协议:JAVA、LDAP、LDAPS
默认白名单的域名:localhost
默认白名单支持的类:基本类型对应的对象。
在JndiManager执行lookup的时候,其会校验对应的白名单。
官方修复方案的介绍就到这里。这里我们只讲解了核心代码,具体逻辑大家可以下载Log4j2的源码,查看从5号开始的改动即可。
这个版本的绕过其实很有意思。原因是因为在JndiManager.lookup的方法中,当执行各类白名单过滤操作中,如果抛出异常。在RC1的版本中,其没有做任何处理,导致只要抛出异常就能够正常的执行后续的lookup逻辑。从而绕过了白名单检测。
于是后续做了修正,只要抛出异常就直接返回null。
那么我们可以如何绕过呢? 这里我们参考了文章安全漏洞之Log4j2漏洞复现绕过分析。通过URI
中不进行URL
编码会报报错URISyntaxException,在URL中添加一个空格即可触发,比如:${jndi:ldap://127.0.0.1:1389/ badClassName}。如下是对URI构造函数做空格测试的结果:
虽然
对空格做编码导致异常,但是lookup
时候会去掉这个空格。所以异常之后后续的lookup也能够正常执行。
这个比较简单,就是通过JVM设置一个参数formatMsgNoLookups=true。让Log4j2在处理${}消息的时候,不执行lookup操作。
其实这种方式也是可以解决漏洞的。但是存在一个问题:如果服务本身就需要利用Log4j2的jndi功能。配置参数后就无法使用。所以作为官方解决方案来说,该方法还是存在不妥之处。
于是官方最终采用了jdni开关+白名单的方式来解决了该问题。
这是因为在Thread Context Map场景下,也可以通过ldap方式实现注入。于是官方考虑到除此之后可能还有其他类似潜在漏洞,于是决定将消息中的Lookup功能去掉了,即在消息中填${}占位符,其不会在解析,也就不会执行Jndi相关的任何逻辑了。
至此Log4j2漏洞的深入剖析就和大家分享完了。如果你喜欢本文或觉得本文对你有所帮助,欢迎一键三连支持,非常感谢。
如果你喜欢本文或觉得本文对你有所帮助,欢迎一键三连支持,非常感谢。
如果你对本文有任何疑问或者高见,欢迎添加公众号lifeofcoder共同交流探讨(添加公众号可以获得楼主最新博文推送以及”Java高级架构“上10G视频和图文资料哦)。
Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识
Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理
Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法)
Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理