安全漏洞(1)-Log4j2远程代码执行漏洞,log4j2漏洞验证

漏洞描述

Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。

漏洞评级

CVE-2021-44228 Apache Log4j 远程代码执行漏洞 严重

影响版本

Apache Log4j 2.x >=2.0-beta9 且 < 2.15.0

注:Apache Log4j 1.x 版本不受此次漏洞影响。

安全建议

1、排查应用是否引入了Apache log4j-core Jar包,若存在依赖引入,且在受影响版本范围内,则可能存在漏洞影响。请尽快升级Apache Log4j2所有相关应用到安全 log4j-2.15.0 及其以上版本,地址 Log4j – Download Apache Log4j 2

2、升级已知受影响的应用及组件,如 spring-boot-starter-log4j2/Apache Struts2/Apache Solr/Apache Druid/Apache Flink

3、临时缓解方案。可升级jdk版本至6u211 / 7u201 / 8u191 / 11.0.1以上,可以在一定程度上限制JNDI等漏洞利用方式。对于大于2.10版本的Log4j,可设置属性log4j2.formatMsgNoLookups 或 环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPS 为 True。对于>=2.0-beta9 且 <=2.10.0 版本,将 JndiLookup 类从 classpath 中去除,例如 zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class 。 对于 >=2.7 且 <=2.14.1 版本,对于所有的 PatternLayout 可设置其格式为 %m{nolookups} 而不仅仅是 %m

漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。2021年12月10日,阿里云安全团队发现 Apache Log4j 2.15.0-rc1 版本存在漏洞绕过,请及时更新至 Apache Log4j 2.15.0 正式版本。阿里云应急响应中心提醒 Apache Log4j2 用户尽快采取安全措施阻止漏洞攻击。

临时防护

从官方给的信息和复现情况来看,利用手段是jndi注入无疑,jndi注入无非ldap、rmi,需要外连请 求Idap-server/exp-server,禁止外连能在一定程度上缓解,但是不能防御攻击者已控其他内部服务 器的情况。此外,JDK11.0.1、8u191、7u201、6u211或者更高版本默认是无法利用JNDI注入,JDK6u141、7u131、8u121或者更高版本无法利用RMI注入,网 上的一些bypas s方法也是依赖本地特定的lib(相当于找了新的gadgets),所以总结:

1、禁止使用Iog4j的服务器外连(日志服务器正常不需要外连), 并在边界对dnslog相关域名访问进行检测。 部分公共dnslog平台如下:

  •      ceye.io
  •      dnslog.link
  •      dnslog.cn
  •      dnslog.io
  •      tu4.org
  •      awvsscan119.autoverify.cn
  •      burpcollaborator.net
  •      s0x.cn

2、建议JDK使用高版本

3、添加jvm启动参数:-Dlog4j2.formatMsgNoLookups=true

4、在应用classpath下添加log4j2.component.properties配置文件,文件内容为:log4j2.formatMsgNoLookups=true

5、将系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true
 

验证方法:

其验证思路,是创建一个jndi:ldap的server端,代码请参考文档JNDI之初探LDAP - FreeBuf网络安全行业门户

客户端验证的代码很简单,写一个main方法,同时配置好log4j2.xml,即可验证。调用lookup方法主要是log4j2在MessagePatternConverter进行格式化message的时候,调用的StrSubstitutor对象引发的。

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4j2LookupTest {
    private static final Logger logger = LogManager.getLogger(Log4j2LookupTest.class);

    public static void main(String args[]){
        logger.info("${jndi:ldap://127.0.0.1:1389/#Th3windObject}");
    }
}

参考文档

引用:JNDI之初探LDAP - FreeBuf网络安全行业门户

引用:深入理解JNDI注入与Java反序列化漏洞利用 - 博客 - 腾讯安全应急响应中心

引用:阿里云帮助中心-阿里云,领先的云计算服务提供商

你可能感兴趣的:(安全体系_加解密算法,安全,log4j2,安全漏洞)