Apache Kafka 远程代码执行漏洞复现及攻击拦截 (CVE-2023-25194)
字数 1242 2025-08-24 16:48:07
Apache Kafka 远程代码执行漏洞分析及防护指南 (CVE-2023-25194)
漏洞概述
Apache Kafka是一个分布式数据流处理平台,能够实时发布、订阅、存储和处理数据流。Kafka Connect是Kafka的一个组件,用于在Kafka和其他系统之间可扩展、可靠地流式传输数据。
该漏洞存在于Kafka Connect worker中,攻击者可以利用基于SASL/JAAS配置和SASL协议的任意Kafka客户端,在创建或修改连接器时,通过构造特殊的配置进行JNDI注入,从而实现远程代码执行。
影响版本
- 受影响版本:2.4.0 ≤ Apache Kafka ≤ 3.3.2
- 修复方案:更新Apache Kafka至官方最新版本
漏洞复现环境搭建
-
使用vulhub搭建漏洞复现环境:
https://github.com/vulhub/vulhub -
参考EXP:
https://github.com/projectdiscovery/nuclei-templates/blob/5d90e8275084b0ae9166ec38cacd22e5a5a94fb8/http/vulnerabilities/apache/apache-druid-kafka-connect-rce.yaml
攻击演示
- 构造payload,执行新建
/tmp/test.txt文件 - 验证漏洞存在,检查文件是否成功创建
防护措施
RASP防护
-
业务优先模式:
- RASP会出现JNDI注入的告警
- 拦截最终的命令执行
- 提供详细的堆栈信息
-
防护模式:
- 直接在JNDI注入处拦截
- 提供详细的堆栈信息
漏洞详细分析
攻击链分析
-
初始入口点:
org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(java.util.Properties) -
调用链:
org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(java.util.Properties, org.apache.kafka.common.serialization.Serializer<K>, org.apache.kafka.common.serialization.Serializer<V>) -
配置处理:
org.apache.kafka.common.utils.Utils#propsToMap- 对传入对象进行处理
- 将map型的对象传入后续构造函数
-
序列化配置:
org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(java.util.Map<String,Object>, org.apache.kafka.common.serialization.Serializer<K>, org.apache.kafka.common.serialization.Serializer<V>) -
配置处理:
org.apache.kafka.clients.producer.ProducerConfig#appendSerializerToConfig- 返回newConfigs
- 传入ProducerConfig构造函数
-
生产者初始化:
org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(ProducerConfig, Serializer<K>, Serializer<V>, ProducerMetadata, KafkaClient, ProducerInterceptors<K,V>, Time) -
创建发送者:
org.apache.kafka.clients.producer.KafkaProducer#newSender -
创建通道构建器:
org.apache.kafka.clients.ClientUtils#createChannelBuilder -
客户端通道构建:
org.apache.kafka.common.network.ChannelBuilders#clientChannelBuilder- 对值进行判断
- 调用create方法
-
创建SASL通道:
org.apache.kafka.common.network.ChannelBuilders#create- 得到map型的configs
- 通过switch得到SaslChannelBuilder类型channelBuilder对象
- 调用configure方法
-
SASL配置:
org.apache.kafka.common.network.SaslChannelBuilder#configure -
登录管理:
org.apache.kafka.common.security.authenticator.LoginManager#acquireLoginManager- 判断值
- 创建LoginManager
-
登录过程:
org.apache.kafka.common.security.authenticator.AbstractLogin#login- 调用LoginContext的login方法
- 最终调用invoke方法
-
初始化:
javax.security.auth.login.LoginContext#initialize- 获取userProvider
- user.provider.url通过JNDI提供
-
JNDI登录模块:
com.sun.security.auth.module.JndiLoginModule#login- 调用attemptAuthentication方法
- 通过InitialContext.lookup执行userProvider的值
关键漏洞点
漏洞最终触发点在com.sun.security.auth.module.JndiLoginModule中,通过JNDI注入执行恶意代码:
javax.naming.InitialContext#lookup(String)
RASP防护策略正是检测这个关键调用点来拦截攻击。
参考资源
总结
该漏洞利用Kafka Connect的SASL/JAAS配置机制,通过构造恶意的JNDI URL实现远程代码执行。防护措施应重点关注:
- 及时升级到修复版本
- 部署RASP等运行时防护方案
- 监控JNDI相关调用,特别是InitialContext.lookup方法
- 限制Kafka Connect的可配置参数范围