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



赶紧点击上方话题进行订阅吧!

报告编号:B6-2021-121301

报告来源:360CERT

报告作者:360CERT

更新日期:2021-12-13


1
 漏洞简述



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进行升级,以免遭受黑客攻击。


2
 漏洞最新情况



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

3
 漏洞详情



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

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

而本次commit的关键代码是:

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


4
 产品侧解决方案



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

360安全卫士

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

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

360安全卫士团队版

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

360本地安全大脑

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

360终端安全管理系统

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

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


5
 时间线



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

2021-12-13 360CERT发布分析


6
 参考链接



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

https://cert.360.cn/warning/detail?id=d5dd5bbdfbb3d58c3a633e4e105e22bb

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


7
 特制报告相关说明



一直以来,360CERT对全球重要网络安全事件进行快速通报、应急响应。为更好地为政企用户提供最新漏洞以及信息安全事件的安全通告服务,现360CERT推出了安全通告特制版报告订阅服务,以便用户做资料留存、传阅研究与查询验证。

今后特制报告将不再提供公开下载,用户可扫描下方二维码进行服务订阅。




往期推荐
01

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

02

《网络安全十一月月报》(附下载链接)

03

Grafana 任意文件读取漏洞通告


360CERT

https://cert.360.cn/

进入官网查看更多资讯

长按扫码关注我们


点击在看,进行分享

查看原文