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至官方最新版本

漏洞复现环境搭建

  1. 使用vulhub搭建漏洞复现环境:

    https://github.com/vulhub/vulhub
    
  2. 参考EXP:

    https://github.com/projectdiscovery/nuclei-templates/blob/5d90e8275084b0ae9166ec38cacd22e5a5a94fb8/http/vulnerabilities/apache/apache-druid-kafka-connect-rce.yaml
    

攻击演示

  1. 构造payload,执行新建/tmp/test.txt文件
  2. 验证漏洞存在,检查文件是否成功创建

防护措施

RASP防护

  1. 业务优先模式

    • RASP会出现JNDI注入的告警
    • 拦截最终的命令执行
    • 提供详细的堆栈信息
  2. 防护模式

    • 直接在JNDI注入处拦截
    • 提供详细的堆栈信息

漏洞详细分析

攻击链分析

  1. 初始入口点

    org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(java.util.Properties)
    
  2. 调用链:

    org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(java.util.Properties, 
    org.apache.kafka.common.serialization.Serializer<K>, 
    org.apache.kafka.common.serialization.Serializer<V>)
    
  3. 配置处理:

    org.apache.kafka.common.utils.Utils#propsToMap
    
    • 对传入对象进行处理
    • 将map型的对象传入后续构造函数
  4. 序列化配置:

    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>)
    
  5. 配置处理:

    org.apache.kafka.clients.producer.ProducerConfig#appendSerializerToConfig
    
    • 返回newConfigs
    • 传入ProducerConfig构造函数
  6. 生产者初始化:

    org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(ProducerConfig, 
    Serializer<K>, Serializer<V>, 
    ProducerMetadata, KafkaClient, 
    ProducerInterceptors<K,V>, Time)
    
  7. 创建发送者:

    org.apache.kafka.clients.producer.KafkaProducer#newSender
    
  8. 创建通道构建器:

    org.apache.kafka.clients.ClientUtils#createChannelBuilder
    
  9. 客户端通道构建:

    org.apache.kafka.common.network.ChannelBuilders#clientChannelBuilder
    
    • 对值进行判断
    • 调用create方法
  10. 创建SASL通道:

    org.apache.kafka.common.network.ChannelBuilders#create
    
    • 得到map型的configs
    • 通过switch得到SaslChannelBuilder类型channelBuilder对象
    • 调用configure方法
  11. SASL配置:

    org.apache.kafka.common.network.SaslChannelBuilder#configure
    
  12. 登录管理:

    org.apache.kafka.common.security.authenticator.LoginManager#acquireLoginManager
    
    • 判断值
    • 创建LoginManager
  13. 登录过程:

    org.apache.kafka.common.security.authenticator.AbstractLogin#login
    
    • 调用LoginContext的login方法
    • 最终调用invoke方法
  14. 初始化:

    javax.security.auth.login.LoginContext#initialize
    
    • 获取userProvider
    • user.provider.url通过JNDI提供
  15. 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实现远程代码执行。防护措施应重点关注:

  1. 及时升级到修复版本
  2. 部署RASP等运行时防护方案
  3. 监控JNDI相关调用,特别是InitialContext.lookup方法
  4. 限制Kafka Connect的可配置参数范围
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搭建漏洞复现环境: 参考EXP: 攻击演示 构造payload,执行新建 /tmp/test.txt 文件 验证漏洞存在,检查文件是否成功创建 防护措施 RASP防护 业务优先模式 : RASP会出现JNDI注入的告警 拦截最终的命令执行 提供详细的堆栈信息 防护模式 : 直接在JNDI注入处拦截 提供详细的堆栈信息 漏洞详细分析 攻击链分析 初始入口点 : 调用链: 配置处理: 对传入对象进行处理 将map型的对象传入后续构造函数 序列化配置: 配置处理: 返回newConfigs 传入ProducerConfig构造函数 生产者初始化: 创建发送者: 创建通道构建器: 客户端通道构建: 对值进行判断 调用create方法 创建SASL通道: 得到map型的configs 通过switch得到SaslChannelBuilder类型channelBuilder对象 调用configure方法 SASL配置: 登录管理: 判断值 创建LoginManager 登录过程: 调用LoginContext的login方法 最终调用invoke方法 初始化: 获取userProvider user.provider.url通过JNDI提供 JNDI登录模块: 调用attemptAuthentication方法 通过InitialContext.lookup执行userProvider的值 关键漏洞点 漏洞最终触发点在 com.sun.security.auth.module.JndiLoginModule 中,通过JNDI注入执行恶意代码: RASP防护策略正是检测这个关键调用点来拦截攻击。 参考资源 CVE-2023-25194 Kafka JNDI注入漏洞分析 总结 该漏洞利用Kafka Connect的SASL/JAAS配置机制,通过构造恶意的JNDI URL实现远程代码执行。防护措施应重点关注: 及时升级到修复版本 部署RASP等运行时防护方案 监控JNDI相关调用,特别是InitialContext.lookup方法 限制Kafka Connect的可配置参数范围