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

Kafka漏洞修复之CVE-2023-25194修复措施验证

Kafka漏洞修复之CVE-2023-25194修复措施验证

  • 前言
  • 风险分析
  • 解决方案
  • AdoptOpenJDK + Zookeeper + Kafka
    • 多版本OpenJDK安装切换
    • Zookeeper安装
    • Kafka安装与使用
  • 其他
    • Kafka消息发送流程
    • Linux配置加载顺序
  • 参考链接

前言

  • 场景介绍

    Kafka最近爆出高危漏洞CNNVD-202302-515,导致Apache Kafka Connect 服务在 2.3.0 至 3.3.2 版本中,由于连接时支持使用基于 JNDI 认证的 SASL JAAS 配置,导致配置在被攻击者可控的情况下,可能通过 JNDI 注入执行任意代码。

    此漏洞不影响 Kafka server (broker),Kafka Connect 服务通常用于在云平台中提供 Kafka 数据迁移、数据同步的管道能力,其默认 HTTP API 开放于 8083 端口

  • 补充

    Apache Kafka Connect 是 Kafka 中用于和其他数据系统传输数据的服务,其独立运行版本可以在 Kafka 发布包中通过 bin/connect-standalone.sh 启动,默认会在 8083 端口开启 HTTP REST API 服务,可对连接器(Connector)的配置进行操作。

风险分析

  • 业务场景

    受漏洞影响的通常是基于 Kafka Connect 提供的:

    1. 数据管道服务(数据迁移、同步);

    2. Kafka 相关的测试服务(用于对 broker 的测试)

  • 前提条件

    从利用条件上,漏洞要成功用于执行任意代码,需要同时满足:

    1. 攻击者可以控制连接器(Connector)的配置;

    2. Kafka 服务能够访问攻击者控制的 LDAP 服务(通常需要能访问互联网);

    3. 基于远程 LDAP 引用注入需要 java 版本小于 11.0.1、8u191、7u201、6u211,本地则需要其 classpath 中加载了可以用于构造利用链的类。

解决方案

  • 升级kafka至3.4.0

    从 Apache Kafka 3.4.0 开始,添加了一个系统属性(“-Dorg.apache.kafka.disallowed.login.modules”) 禁用在 SASL JAAS 配置中使用有问题的登录模块。也由默认“com.sun.security.auth.module.JndiLoginModule”被禁用在 Apache Kafka 3.4.0 中。

    注意:可使用kraft方式替换zookeeper

  • 升级JDK版本

    由于Oracle JDK后期开始收费,所以考虑采用AdoptOpenJDK替换使用,以jdk8为例,升级至8u362,并结合2.3.0 至 3.4.0中的任一版本是否正常运行。

    本文主要结合该场景进行验证,这样升级代价更小

AdoptOpenJDK + Zookeeper + Kafka

  • 概述

    跳过已经安装的Oracle JDK8和Zookeeper,下文不在赘述,主要在Linux环境下配置多版本JDK,并启用OpenJDK,最后安装Kafka验证。

    OpenJDK1.8.0_362 + Zookeeper3.6.3 + Kafka3.4.0

多版本OpenJDK安装切换

  • 安装OpenJDK8

    # 切换至非root用户su xxxx# 解压jdk tomcat至相关目录tar -zxvf OpenJDK8U-jdk_x64_linux_hotspot_8u362b09.tar.gz -C /opt/nbsp/java/openjdk1.8.0_362# 配置环境变量vi /etc/profile# 安装jdk1.8 export OPEN_JAVA_HOME=/opt/nbsp/java/openjdk1.8.0_362export CLASSPATH=.:${OPEN_JAVA_HOME}/lib/dt.jar:${OPEN_JAVA_HOME}/lib/tools.jarexport PATH=$PATH:${OPEN_JAVA_HOME}/bin# 配置生效source /etc/profile# 验证java -version
  • 切换不同版本JDK

    # 发现并不是新安装的jdk版本,使用命令更改当前系统使用的jdk版本alternatives --config java# 如果没有新安装的版本jdk,需要使用命令将新安装的jdk放入到java bin中alternatives --install /usr/bin/java java /opt/nbsp/java/openjdk1.8.0_362/bin/java 2alternatives --install /usr/bin/java java /opt/nbsp/java/jdk1.8.0_191/bin/java 3# 如果设置路径错了,可以使用 以下命令 删除一些 错误的 程序选择路劲alternatives --remove java /opt/nbsp/java/openjdk1.8.0_362/bin
    

Zookeeper安装

  • 主要过程

    zookeeper之前已经安装过,本文直接略过。下面是常用启停命令

    # 启动zookeeper(进入对应的新版本目录)bin/zkServer.sh start# 查看zookeeper状态(进入对应的新版本目录)bin/zkServer.sh status# 停止zookeeper(进入对应的新版本目录)bin/zkServer.sh stop

Kafka安装与使用

  • 安装Kafka

    # 创建文件夹kafkamkdir /home/nbsp/java/kafka# 解压压缩包到 /usr/kafka目录下tar -zxvf kafka_2.13-3.4.0.tgz -C /home/nbsp/java/kafka/# 创建日志文件夹 kafka-logsmkdir /home/nbsp/java/kafka/kafka_2.13-3.4.0/kafka-logs# 修改kafka的配置文件vim bin/config/server.properties#broker.id=0#log.dirs=/usr/local/kafka/kafka_2.12-2.2.0/kafka-logs#zookeeper.connect=localhost:2181#delete.topic.enble=true#advertised.listeners=PLAINTEXT://localhost:9092
  • 配置环境变量

    方式一:修改/etc/profile

    # 修改 profile 文件 (我使用的该方法,也推荐用这一种,两钟区别需自行查阅相关资料)vim /etc/profile#export KAFKA_HOME=/home/nbsp/java/kafka/kafka_2.13-3.4.0#export PATH=KAFKA_HOME/bin:$PATH# 使配置生效source /etc/profile

    方式二:修改 .bashrc 文件

    # 输入命令修改环境变量vim ~/.bashrc# 直接在最下面添加下面这些配置# export KAFKA_HOME=/usr/local/kafka/kafka_2.13-3.4.0# export PATH=KAFKA_HOME/bin:$PATH# 使配置生效source ~/.bashrc
  • 启动kafka

    # 查看当前zookeeper状态/home/nbsp/java/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh status# 启动kafka(在 kafka 的根目录下使用命令)./bin/kafka-server-start.sh config/server.properties &# 停止kafka# ./bin/kafka-server-start.sh config/server.properties &
  • 创建Topic

    # 创建topic(必须指定bootstrap-server)./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --partitions 1 --replication-factor 1 --topic nbsp# 查看 kafka 的 topic 情况./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list # 描述 topic,查看topic的详细信息bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic nbsp
  • 消息生产消费

    # 生产消息,生产者客户端命令,在 kafka 的根目录下使用命令./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic nbsp# bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic nbsp# 消费消息,消费者客户端命令,在 kafka 的根目录下使用命令./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic nbsp --from-beginning# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic nbsp
  • 删除topic

    ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic nbsp  
  • 注意事项

    注意:kafka在启动服务之前,在server.properties文件中要设定3个参数:broker.id、log.dirs、zookeeper.connect

  • 主要参数

    delete.topic.enble=true :对以后删除kafka中的topic有影响,在文件尾部添加上即可

    listeners=PLAINTEXT://:9092 :这个命令也很重要,需要记住(这个命令在文章里先不做分析)

    advertised.listeners=PLAINTEXT://localhost:9092:这个localhost我用的是主机ip地址

  • 常见问题

    不同版本创建topic区别

    #  kafka3.0.0及以上需要指定bootstrap-server,且剔除zookeeper参数(因为可以使用kraft替代zookeeper)./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --partitions 1 --replication-factor 1 --topic nbsp# kafka3.0.0以下./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic nbsp

其他

Kafka消息发送流程

  • 原理分析

    在消息发送的过程中,涉及到了两个线程:main 线程和 Sender 线程
    main 线程中创建了一个双端队列 RecordAccumulator,main 线程将消息发送给 RecordAccumulator;
    Sender 线程不断从 RecordAccumulator 中拉取消息发送到 Kafka Broker。
    kafka消息发送流程

Linux配置加载顺序

  • 简述

    linux配置读取顺序

  • 登录式方式 shell

    /etc/profile -> /etc/profile.d目录下脚本文件 -> $HOME/.bash_profile(用户环境变量文件) -> $HOME/.bashrc(用户环境变量文件)-> /etc/bashrc(全局环境变量文件)

    /etc/profile > /etc/profile.d/*.sh , /etc/profile.d/sh.local > ~/.bash_profile > ~/.bashrc > ~/.bash_login > ~/.profile >

  • 非登录式 Shell

    只会加载$HOME/.bashrc(用户环境配置文件) -> /etc/bashrc(全局环境变量文件)

    如果以非登录的方式启动 Shell,那么就不会读取以上所说的配置文件,而是直接读取 ~/.bashrc。

    所以一般建议将配置直接添加在 ~/.bashrc 中,这样不管是登录式 Shell 还是 非登录式 Shell 都可以读到。

  • /etc/profile源码解析

    for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; doif [ -r "$i" ]; thenif [ "${-#*i}" != "$-" ]; then. "$i"else. "$i" >/dev/nullfifidone# $- 显示shell使用的当前选项# $* 这个程式的所有参数,此选项参数可超过9个。# $# 这个程式的参数个数

    遍历 /etc/profile.d 目录下所有以 .sh 结尾的文件和 sh.local 文件。判断它们是否可读([ -r “$i”]),如果可读,判断当前 Shell启动方式是不是交互式($- 中包含 i)的,如果是交互式的,在当前 Shell 进程中执行该脚本(. “$i”,source “$i” 的简写, Shell 的模块化方式),否则,也在当前 Shell 进程中执行该脚本,只不过将输出重定向到了 /dev/null 中。

    ${-#*i} 这个表达式的意思是:从左向右,在 - 变量中找到第一个 i ,并截取 i 之后的子串

参考链接

  • Apache Kafka Connect JNDI注入漏洞(CVE-2023-25194)安全风险通告

  • Apache Kafka Connect 模块 JNDI 注入(CVE-2023-25194)

  • Kafka在Linux下载安装及部署

  • Linux下安装JDK(多个版本) 切换

  • Linux安装JDK,并配置多个JDK切换

  • Linux中配置文件加载顺序

  • /etc/bashrc和/etc/profile

  • linux环境变量文件区别&加载顺序

  • Linux安装Kafka

  • Kafka3.0.0教程(从入门到调优,深入全面)

相关文章:

Kafka漏洞修复之CVE-2023-25194修复措施验证

Kafka漏洞修复之CVE-2023-25194修复措施验证前言风险分析解决方案AdoptOpenJDK Zookeeper Kafka多版本OpenJDK安装切换Zookeeper安装Kafka安装与使用其他Kafka消息发送流程Linux配置加载顺序参考链接前言 场景介绍 Kafka最近爆出高危漏洞CNNVD-202302-515,导致Apa…...

中后序遍历构建二叉树与应用I

目录 题目描述 思路分析 AC代码 题目描述 按中序遍历和后序遍历给出一棵二叉树&#xff0c;求这棵二叉树中叶子节点权值的最小值。 输入保证叶子节点的权值各不相同。 输入 测试数据有多组 对于每组测试数据&#xff0c;首先输入一个整数N (1 < N < 10000)&#x…...

随机退化模型--基础篇(1)

随机退化模型--基础篇(1) 1. 随机退化建模1.1 瞬间失效1.2 存在缓慢退化过程的失效2. 通俗解释2.1 包引入2.2 参数定义2.3 基于递归函数的更新2.4 结果可视化1. 随机退化建模 随机模型亦称“非确定的、概率的模型”,是按随机变量建立的模型。其特点是; 模型参数、模拟对象发…...

2023.2.15工作学习记录 git Docker compose容器编排

关于Git错误提交了target目录 是因为在ignore目录中没有加入biz这个工程 以后提交代码时一定要检查好自己提交的代码 首先把所有的全部取消 然后再根据自己要提交的内容一个个来勾选 Docker网络 container模式&#xff1a;新建的容器和已经存在的一个容器共享一个网络…...

基于jeecgboot的flowable流程增加节点自动跳过功能

为了满足有时候需要在某个节点没有人员处理的时候需要自动跳过&#xff0c;所以增加了这个功能。 一、FlowComment意见里增加一个类型8&#xff0c;跳过流程 /** * 流程意见类型 * */ public enum FlowComment { /** * 说明 */ NORMAL("1", "…...

流程引擎之Activiti简介

背景Activiti 是一个开源架构的工作流引擎&#xff0c;基于 bpmn2.0 标准进行流程定义&#xff0c;其前身是 jBPM&#xff0c;Activiti 相对于 jBPM 更轻量&#xff0c;更易上手&#xff0c;且天然集成了 Spring。2010年 jBPM 创始人 Tom Baeyens 离开 JBoss&#xff0c;随之加…...

4.打包子应用 投票

接上回 最终得到这样的目录 mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.pypolls/__init__.pyadmin.pyapps.pymigrations/__init__.py0001_initial.pymodels.pystatic/polls/images/background.gifstyle.csstemplates/polls/detail.htmlindex.htmlresult…...

华为OD机试 - 服务依赖(JavaScript) | 机试题算法思路 【2023】

服务依赖 题目 在某系统中有众多服务,每个服务用字符串(只包含字母和数字,长度<=10)唯一标识,服务间可能有依赖关系,如A依赖B,则当B故障时导致A也故障。 传递具有依赖性,如A依赖B,B依赖C,当C故障时导致B故障,也导致A故障。给出所有依赖关系以及当前已知故障服务…...

目标检测综述(一份全的自制PPT): 涵盖各种模型简介对比,适合入门和了解目标检测现状

[TOC](目标检测综述(一份全的自制PPT): 涵盖各种模型简介对比&#xff0c;适合入门和了解目标检测现状) 注&#xff1a;本文仅供学习&#xff0c;未经同意勿转。分享的PPT请勿二次传播&#xff0c;或者用于其他商用途径。若使用本文PPT请注明来源&#xff0c;感谢配合 前言&…...

Vulnhub-DC-2实战靶场

Vulnhub-DC-2实战靶场 https://blog.csdn.net/ierciyuan/article/details/127560871 这次试试DC-2&#xff0c;目标是找到官方设置的5个flag。 一. 环境搭建 1. 准备工具 虚拟机Kali&#xff1a; 自备&#xff0c;我的kali的IP为192.168.3.129 靶场机&#xff1a; https…...

从输入URL到渲染的过程中到底发生了什么?

CDN缓存DNSTCP三次握手、四次挥手浏览器渲染过程输入URL到页面渲染过程的一些优化 下面我将“从输入URL到渲染的全过程”大概的描述出来&#xff0c;再对其过程加以解释&#xff0c;了解过程中可以做哪些优化。文章内容有点长&#xff0c;需要有足够的耐心看完哟&#xff01;&…...

旋转屏幕导致 Fragment 中的 onConfigurationChanged 被调用两次

环境 IDE Android Studio Dolphin 2021.3.1&#xff1b; 项目配置 Android Gradle plugin version: 7.1.3 Gradle Version: 7.2 Gradle JDK: 11 Compile Sdk Version: 32 问题描述 项目使用的 Bottom Navigation Activity 基本结构&#xff0c;在调试程序时发现&#xff0c…...

23年校招DL/NLP/推荐系统/ML/算法基础面试必看300问及答案

2020年校招已经开始了&#xff0c;在疫情全球肆虐的背景下&#xff0c;全球就业情况异常艰难&#xff0c;加上美国对中国企业打压持续升级&#xff0c;对于马上开始秋招找工作的毕业生而言&#xff0c;更是难上加难。我们不能凭一己之力改变现状&#xff0c;但我们可以凭借自己…...

Python基础知识汇总(字符串二)

目录 检索字符串 count()方法 find()方法 in关键字 index()方法 rindex()方法 startswith()方法...

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display

写在前面&#xff1a;本章主要内容为理解七点数码管显示的概念&#xff0c;并使用 Verilog 实现。生成输入信号后通过仿真确认各门的动作&#xff0c;通过 FPGA 检查在 Verilog 中实现的电路的操作。 Ⅰ. 前置知识 七段数码管是利用多重输出功能的非常有用的元件。该元件用于字…...

Android开发:Activity启动模式

1.怎样设置Activity的启动模式 可以在清单文件中自己添加活动的启动模式, android : launchMode"standard", 不写的话系统默认就是标准模式. 2.启动模式 2.1.默认启动模式 标准启动模式就是栈, 打开一个活动就将活动压入栈中, 返回就将活动退出栈中. 不同的Activit…...

01_Docker 简介

01_Docker 简介 文章目录01_Docker 简介1.1 Docker 简介1.2 Docker 组件1.2.1 Docker 客户端和服务区1.2.2 Docker 镜像1.2.3 Registry1.2.4 Docker 容器参考资料https://www.runoob.com/docker/ubuntu-docker-install.html 1.1 Docker 简介 Docker 是一个能够把开发的应用程…...

一文精通MVCC机制

MVCC(Multi-Version Concurrency Control)多版本并发控制机制使用串行化隔离级别时&#xff0c;mysql会将所有的操作加锁互斥&#xff0c;来保证并发安全。这种方式必然降低并发性能。mysql在读已提交和可重复读隔离级别下&#xff0c;对一行数据的读和写两个操作默认是不会通过…...

商用ESP32协议采集器源码分享开篇

这是一个关于chatGPT帮助嵌入式程序员开发商业项目的故事. 在开发这个项目的过程中,chatGPT发布了,在它的帮助下,项目开发量减少了10%,所以这个专栏,既是一个关于Micropython开发ESP32的专栏,也是一个程序员在AI的帮助下,提升效率,加速挣钱的案例. 看完之后,你将知道如何用mic…...

代码随想录算法训练营第三十四天 | 860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球

一、参考资料柠檬水找零https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html 根据身高重建队列 https://programmercarl.com/0406.%E6%A0%B9%E6%8D%AE%E8%BA%AB%E9%AB%98%E9%87%8D%E5%BB%BA%E9%98%9F%E5%88%97.html 用最少数量的箭引爆气球ht…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...