CVE-2021-44228: Apache Log4j2 远程代码执行漏洞分析
2021-12-13 10:17

报告编号:B6-2021-121301

报告来源:360CERT

报告作者:360CERT

更新日期:2021-12-13

0x01   漏洞简述

2021年12月09日,360CERT监测发现Apache Log4j 2存在JNDI远程代码执行,漏洞等级:严重,漏洞评分:10.0

Apache Log4j 2是一个开源的日志记录组件,使用非常的广泛,使用情况参考:

https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/usages

对此,360CERT建议广大用户尽快将·Apache Log4j 2进行升级,以免遭受黑客攻击。

0x02   漏洞最新情况

基本信息详情
相关组件Apache Log4j2
CVE编号CVE-2021-44228
漏洞类型远程代码执行
漏洞评分10.0
风险等级等级
威胁等级严重
影响范围广泛
攻击者价值极高
利用难度极低
利用状态最新情况
PoC/EXP已公开
在野利用已存在
漏洞细节已公开
安全补丁已发布

0x03   漏洞详情

2.14.0

log4j2 对error msg的处理在MessagePatternConverter#format在方法内,noLookups默认false,于是进入if判断。

 if (this.config != null && !this.noLookups) {
                for(int i = offset; i < workingBuilder.length() - 1; ++i) {
                    if (workingBuilder.charAt(i) == '$' && workingBuilder.charAt(i + 1) == '{') {
                        String value = workingBuilder.substring(offset, workingBuilder.length());
                        workingBuilder.setLength(offset);
                        workingBuilder.append(this.config.getStrSubstitutor().replace(event, value));
                    }
                }
            }

workBuilderlog前缀加上msg

这里会进行匹配,如果匹配到了${的字符,value是从前缀之后的部分开始,接着调用StrSubstitutor#replace一直跟到StrSubstitutor#substitute, 获取prefix($,{)和suffix(})的匹配。

该方法会进行递归调用,提取${}之间的value进行解析(这也是网上的一些嵌套其他协议绕过的点)。

然后调用StrSubstitutor#resolveVariable

Interpolator#lookup里对协议进行匹配,然后调用对应的lookup方法,这里还会对协议进行toLowerCase调用(也就存在一些特殊字符对waf的绕过)。

部分调用栈如下:

为何只能error/fotal触发

想要触发后续流程,需要调logMessage方法,需要isEnabletrue,跟进,发现会对level进行判断,infolevel400,只要小于等于200,才会返回true

小于等于200的只有100/200

static {
        OFF = new Level("OFF", StandardLevel.OFF.intLevel());
     //100
        FATAL = new Level("FATAL", StandardLevel.FATAL.intLevel());
     //200
        ERROR = new Level("ERROR", StandardLevel.ERROR.intLevel());
     //300
        WARN = new Level("WARN", StandardLevel.WARN.intLevel());
     //400
        INFO = new Level("INFO", StandardLevel.INFO.intLevel());
     //500
        DEBUG = new Level("DEBUG", StandardLevel.DEBUG.intLevel());
     //600
        TRACE = new Level("TRACE", StandardLevel.TRACE.intLevel());
     //2147483647
        ALL = new Level("ALL", StandardLevel.ALL.intLevel());
    }

2.15.0-rc1

在遍历formatter的时候,由之前的MessagePatternConverter变为MessagePatternConverter$SimpleMessagePatternConverter

MessagePatternConverter$SimpleMessagePatternConverter不存在危险操作,而另一个类存在lookup的是MessagePatternConverter$LookupMessagePatternConverter

看下初始化Converter的逻辑:

想要拿到LookupMessagePatternConverter,必须要lookupstrue,而默认情况下是false,跟一下loadLookups,需要设置options

手动设置options之后,一路跟到JndiManager

lookup内部执行了几个方法,会对协议内容进行检测,allowedProtocols检测协议,allowedHostsldap请求的host进行了检测,只允许请求本地ip,所以,看似这里已经对ldap做了检测,但是注意catch错误的时候,并没有return,所以可以利用抛出错误进行绕过。

具体绕过方式可以直接参考官方示例。

2.15.0-rc2

catch错误之后,return null,也就走不到lookup方法里了。

LOG4J2-3208

github上发布了最新的commit

https://github.com/apache/logging-log4j2/commit/44569090f1cf1e92c711fb96dfd18cd7dccc72ea

而本次commit的关键代码是:

isIsJndiEnabled默认返回false,即默认情况下,禁用了jndi协议的使用。

0x04   产品侧解决方案

若想了解更多产品信息或有相关业务需求,可移步至http://360.net。

360安全卫士

Windows用户可通过360安全卫士实现对应补丁安装、漏洞修复、恶意软件查杀,其他平台的用户可以根据修复建议列表中的安全建议进行安全维护。

360CERT建议广大用户使用360安全卫士定期对设备进行安全检测,以做好资产自查以及防护工作。

360安全卫士团队版

用户可以通过安装360安全卫士并进行全盘杀毒来维护计算机安全。360CERT建议广大用户使用360安全卫士定期对设备进行安全检测,以做好资产自查以及防护工作。

360本地安全大脑

360本地安全大脑是将360云端安全大脑核心能力本地化部署的一套开放式全场景安全运营平台,实现安全态势、监控、分析、溯源、研判、响应、管理的智能化安全运营赋能。360本地安全大脑已支持对相关漏洞利用的检测,请及时更新网络神经元(探针)规则和本地安全大脑关联分析规则,做好防护。

360终端安全管理系统

360终端安全管理系统软件是在360安全大脑极智赋能下,以大数据、云计算等新技术为支撑,以可靠服务为保障,集防病毒与终端安全管控功能于一体的企业级安全产品。

360终端安全管理系统已支持对相关漏洞进行检测和修复,建议用户及时更新漏洞库并安装更新相关补丁。

0x05   时间线

2021-12-10 360CERT发布预警通告

2021-12-13 360CERT发布分析

0x06   参考链接

1、 Apache Log4j 2 远程代码执行漏洞通告

2、 https://github.com/apache/logging-log4j2/commit/bac0d8a35c7e354a0d3f706569116dff6c6bd658