Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)

系列文章

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漏洞修复原理

1、修复原理(官方如何修复)

其实查看Log4j2最新提交的代码(https://github.com/apache/logging-log4j2),咱们很容易就能看到其修复方法。

官方主要通过两个途径来修复该问题:新增jndi开关(默认关闭)和新增jndi相关域名、协议和Class白名单。

A、新增消息的Lookup开关(默认关闭)

在消息处理类MessagePatternConverter中增加了Lookup开关,通过lookups参数来控制。默认为false。 即默认消息中不解析${}配置。在2.15.0之前的版本,默认MessagePatternConverter会对消息进行lookup操作(具体请参考2.14.1的MessagePatternConverter类实现)。

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第1张图片

但是我们可以通过在日志patter中新增lookups来开启消息中的lookup功能。

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第2张图片

B、新增白名单

如果使用者通过配置lookups主动开启了消息查找功能。官方也为我们提供了另外一道屏障来解决该注入漏洞。官方使用了一个比较简单的办法,即给协议、class和域名都添加白名单。这样只要使用者合理的使用都不会有问题。

默认白名单的协议:JAVA、LDAP、LDAPS

默认白名单的域名:localhost

默认白名单支持的类:基本类型对应的对象。

 在JndiManager执行lookup的时候,其会校验对应的白名单。

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第3张图片

官方修复方案的介绍就到这里。这里我们只讲解了核心代码,具体逻辑大家可以下载Log4j2的源码,查看从5号开始的改动即可。 

2、2.15.0-RC1版本为何会被绕过

这个版本的绕过其实很有意思。原因是因为在JndiManager.lookup的方法中,当执行各类白名单过滤操作中,如果抛出异常。在RC1的版本中,其没有做任何处理,导致只要抛出异常就能够正常的执行后续的lookup逻辑。从而绕过了白名单检测。

于是后续做了修正,只要抛出异常就直接返回null。

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第4张图片Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第5张图片

那么我们可以如何绕过呢? 这里我们参考了文章安全漏洞之Log4j2漏洞复现绕过分析。通过URI中不进行URL编码会报报错URISyntaxException,在URL中添加一个空格即可触发,比如:${jndi:ldap://127.0.0.1:1389/ badClassName}。如下是对URI构造函数做空格测试的结果: 

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第6张图片

虽然对空格做编码导致异常,但是lookup时候会去掉这个空格。所以异常之后后续的lookup也能够正常执行。

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第7张图片

3、JVM参数formatMsgNoLookups的修复原理(不建议)

这个比较简单,就是通过JVM设置一个参数formatMsgNoLookups=true。让Log4j2在处理${}消息的时候,不执行lookup操作。

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第8张图片

 其实这种方式也是可以解决漏洞的。但是存在一个问题:如果服务本身就需要利用Log4j2的jndi功能。配置参数后就无法使用。所以作为官方解决方案来说,该方法还是存在不妥之处。

于是官方最终采用了jdni开关+白名单的方式来解决了该问题。

4、2.16.0发布与解决问题

这是因为在Thread Context Map场景下,也可以通过ldap方式实现注入。于是官方考虑到除此之后可能还有其他类似潜在漏洞,于是决定将消息中的Lookup功能去掉了,即在消息中填${}占位符,其不会在解析,也就不会执行Jndi相关的任何逻辑了。

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第9张图片 源码:MessagePatternConverter

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)_第10张图片

至此Log4j2漏洞的深入剖析就和大家分享完了。如果你喜欢本文或觉得本文对你有所帮助,欢迎一键三连支持,非常感谢。

三、惯例

如果你喜欢本文或觉得本文对你有所帮助,欢迎一键三连支持,非常感谢。

如果你对本文有任何疑问或者高见,欢迎添加公众号lifeofcoder共同交流探讨(添加公众号可以获得楼主最新博文推送以及”Java高级架构“上10G视频和图文资料哦)。

系列文章

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法)

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理

你可能感兴趣的:(技术分享,源码分析,安全,web安全,java)