Apache Log4j是Apache的一个开源项目,Apache log4j2是Log4j的升级版本,我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。
近日发现Apache Log4j存在任意代码执行漏洞(CVE-2021-44228),经过分析,Apache Log4j2 <=2.14.1 配置、日志消息和参数中使用的 JNDI 功能部件不能抵御攻击者控制的 LDAP 和其他 JNDI 相关端点。启用消息查找替换后,能够控制日志消息或日志消息参数的攻击者可以执行从 LDAP 服务器加载的任意代码。
风险等级:高危(较大事件)
查看
log4j2
各种不同层级的日志函数处理方式,发现都会调用
logIfEnabled
函数进行处理,以
error
为例:
来到程序入口,从LogManager中获取指定日志信息,赋值给log,然后记录下info级别的信息
找到
logIfEnabled
函数:把数据存储在了
logMessage
中
在对日志的处理函数中,发现在第116行会循环提取
${
的内容,不符合格式的请求将直接返回。
然后进入
StrSubstitutor#substitute
函数,主要进行字符串的提取:
然后进入467行的
resolveVariable
函数,根据提交的协议提取不同的
resolver
进行
lookup
处理。
最终进入
JndiLookup#lookup
,触发JNDI请求,完成RCE
RC1绕过【dnslog/ exp】 /后加空格
1.若程序使用Maven打包,查看项目的pom.xml文件中是否存在下图所示的相关字段,若版本号为小于2.15.0,则存在该漏洞。
2.若程序使用gradle打包,可查看build.gradle编译配置文件,若在dependencies部分存在org.apache.logging.log4j相关字段,且版本号为小于2.15.0,则存在该漏洞。
1、攻击者在利用前通常采用dnslog方式进行扫描、探测,常见的漏洞利用方式可通过应用系统报错日志中的"javax.naming.CommunicationException"、"javax.naming.NamingException: problem generating object using object factory"、"Error looking up JNDI resource"关键字进行排查。
2、攻击者发送的数据包中可能存在"${jndi:}" 字样,推荐使用全流量或WAF设备进行检索排查
绿盟科技远程安全评估系统(RSAS)与WEB应用漏洞扫描系统(WVSS)、网络入侵检测系统(IDS)已具备对该漏洞的扫描与检测能力。
阿里云安全中心也支持对此漏洞的检测
1、厂商已发布升级修复漏洞,用户请尽快更新至安全版本:log4j-2.15.0-rc2
下载链接:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
2、升级已知受影响的应用及组件,如srping-boot-strater-log4j2/Apache Solr/Apache Flink/Apache Druid等