Kafka反序列化RCE漏洞(CVE-2023-34040)

news2024/11/25 20:20:49

漏洞描述

Spring Kafka 是 Spring Framework 生态系统中的一个模块,用于简化在 Spring 应用程序中集成 Apache Kafka 的过程,记录 (record) 指 Kafka 消息中的一条记录。

受影响版本中默认未对记录配置 ErrorHandlingDeserializer,当用户将容器属性 checkDeserExWhenKeyNullcheckDeserExWhenValueNull 设置为 true(默认为 false),并且允许不受信任的源发布到 Kafka 主题中时,攻击者可将恶意 payload 注入到 Kafka 主题中,当反序列化记录头时远程执行任意代码。

影响版本

2.8.1 <= Spring-Kafka <= 2.9.10
3.0.0 <= Spring-Kafka <= 3.0.9

漏洞复现

这一个漏洞所影响的组件其实是 Spring-Kafka,严格意义上来说并不算是 kafka 的漏洞,应该算是 Spring 的漏洞。

漏洞前置知识

先来看一看 SpringBoot 和 Kafka 是怎么完成通讯/消费的

SpringBootToKafka.png

工作流程如下

1、生产者将消息发送到 Kafka 集群中的某个 Broker(也可以是多个)
2、Kafka 集群将消息存储在一个或多个分区中,并为每个分区维护一个偏移量
3、消费者订阅一个或多个主题,并从 Kafka 集群中读取消息。
4、消费者按顺序读取每个分区中的消息,并跟踪每个分区的偏移量。

  • ErrorHandlingDeserializer:是 Kafka中的一种反序列化器(Deserializer),它可以在反序列化过程中处理异常和错误。
  • checkDeserExWhenKeyNull && checkDeserExWhenValueNull:是 Kafka 中的一种序列化器(Serializer),它可以在序列化过程中检查键(key/value)是否为 null,并在发现值为 null 时抛出异常。

再简单整理一下漏洞条件

在受到影响的版本中,默认未对记录配置 ErrorHandlingDeserializer
容器属性 checkDeserExWhenKeyNullcheckDeserExWhenValueNull 设置为 true

环境搭建

其中需要我们起一个 Kafka 的服务,用来接收消息,本机上起比较麻烦,可以在 vps 上用 docker 迅速搭建,且需注意,Kafka 要能够接受外连,docker-compose.yml 如下

version: '2'

services:
  zookeeper:
    image: zookeeper
    restart: always
    ports:
      - "2181:2181"
    container_name: zookeeper

  kafka:
    image: wurstmeister/kafka
    restart: always
    ports:
      - "9092:9092"
      - "9094:9094"
    depends_on:
      - zookeeper
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 124.222.21.138
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,SSL://0.0.0.0:9094
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://124.222.21.138:9092,SSL://124.222.21.138:9094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,SSL:SSL
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
    container_name: kafka

Spring Kafka 的生产者和消费者可以通过使用 Spring Kafka 提供的 KafkaTemplate 和 ``@KafkaListener` 注解来编写。

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

生产者可以使用 KafkaTemplate 来发送消息到 Kafka 集群:

package com.drunkbaby.springkafkatest.controller;  
  
import com.drunkbaby.springkafkatest.common.KafkaInfo;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.kafka.core.KafkaTemplate;  
import org.springframework.kafka.support.SendResult;  
import org.springframework.util.concurrent.ListenableFuture;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
import java.time.LocalDateTime;  
import java.util.concurrent.ExecutionException;  
  
@RestController  
@RequestMapping("/producer")  
public class ProducerController {  
    @Autowired  
    private KafkaTemplate<String,String> kafkaTemplate;  
  
    @PostMapping("/fireAndForget")  
    public String fireAndForget() {  
        kafkaTemplate.send(KafkaInfo.TOPIC_WELCOME, "fireAndForget:" + LocalDateTime.now());  
        return "success";  
    }  
}

消费者可以使用 @KafkaListener 注解来监听 Kafka 集群中的消息:

package com.drunkbaby.springkafkatest.consumer;  
  
import com.drunkbaby.springkafkatest.common.KafkaInfo;  
import org.springframework.kafka.annotation.KafkaListener;  
import org.springframework.messaging.MessageHeaders;  
import org.springframework.messaging.handler.annotation.Headers;  
import org.springframework.messaging.handler.annotation.Payload;  
import org.springframework.stereotype.Component;  
  
@Component  
public class Consumer {  
    @KafkaListener(topics = KafkaInfo.TOPIC_WELCOME)  
    public String consumer2(@Payload String message, @Headers MessageHeaders headers) {  
        System.out.println("消费者(注解方式):收到消息==> ");  
        System.out.println("  message:" + message);  
        System.out.println("  headers:");  
        headers.keySet().forEach(key -> System.out.println("    " + key + ":" + headers.get(key)));  
        return "success";  
    }

连接成功

SuccessConnectKafka.png

访问 http://localhost:8083/producer/sync 发送一条记录

post

构造 payload

实际影响到的是 Consumer,且 Consumer 要设置 checkDeserExWhenKeyNullcheckDeserExWhenValueNull 为 true

ConcurrentKafkaListenerContainerFactory<String, Greeting> factory = new ConcurrentKafkaListenerContainerFactory<>();  
factory.getContainerProperties().setCheckDeserExWhenValueNull(true);  
factory.getContainerProperties().setCheckDeserExWhenKeyNull(true);

payload 参考 https://github.com/Contrast-Security-OSS/Spring-Kafka-POC-CVE-2023-34040

漏洞分析

主要是来看反序列化的部分

断点会先走到 org.springframework.kafka.listener.ListenerUtils#getExceptionFromHeader 方法,它这里面会获取到 PoC 中的 KEY_DESERIALIZER_EXCEPTION_HEADER,并将其作为 headers

key.png

往下跟进 byteArrayToDeserializationException() 方法,这里就直接到反序列化的部分了,而在反序列化之前做了一次 resolveClass() 的校验。

resolveClass.png

而这里的 resolveClass() 校验是一次性的,这就代表我们可以构造其他的 Payload,如 CC 链等,证实是可以打通的

readObject.png

之后便会进入到对应类的 readObject() 方法

漏洞修复

https://github.com/spring-projects/spring-kafka/commit/25ac793a78725e2ca4a3a2888a1506a4bfcf0c9d

相当于把这里的 header 头加黑了

blackHeader.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1167477.html

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

相关文章

PSP - 蛋白质-核酸复合物结构预测 RoseTTAFoldNA 算法框架 (Protein-RNA、Protein-DNA、RNA)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134208615 Paper: Accurate prediction of nucleic acid and protein-nucleic acid complexes using RoseTTAFoldNA GitHub: RoseTTAFold2NA 蛋白…

分享99个工作总结PPT,总有一款适合您

分享99个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1ETaGRUsTRRQq3i5PJUX7tA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 黑金商务路演工作汇报PPT模板 古韵中国风财务计…

JavaSE java对象的比较

目录 1 问题提出2 元素的比较2.1 基本类型的比较2.2 对象的比较 3 对象的比较3.1 覆写基类的equal3.2 基于Comparble接口类的比较3.3 基于比较器比较3.4 三种方式对比 4 集合框架中PriorityQueue的比较方式5 总结 1 问题提出 上节课我们讲了优先级队列&#xff0c;优先级队列在…

汇编-字符串

字符串常量是用单引号或双引号括起来的一个字符序列 当以下面例子中的方式使用时&#xff0c;嵌入引号也是允许的&#xff1a; 正如字符常量以整数形式存放一样&#xff0c;字符串常量在内存中的存储形式为整数字节值的序列。例如&#xff0c; 字符串字面量“ABCD”包含四个字…

SPSS单样本K-S检验

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

第25期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

GEE:GEE中实现简单计算器

作者&#xff1a;CSDN _养乐多_ 本文记录了在 Google Earth Engine&#xff08;GEE&#xff09;上实现简单计算器的代码。 APP链接&#xff1a;https://949384116.users.earthengine.app/view/simplecalculator 文章目录 一、完整代码二、代码链接 一、完整代码 // 定义初始…

二十、泛型(1)

本章概要 基本概念 与 C 的比较 简单泛型 一个元组类库一个堆栈类RandomList 基本概念 普通的类和方法只能使用特定的类型&#xff1a;基本数据类型或类类型。如果编写的代码需要应用于多种类型&#xff0c;这种严苛的限制对代码的束缚就会很大。 多态是一种面向对象思想的泛…

预制构建生产管理系统

在建筑施工领域&#xff0c;预制构件的使用越来越广泛&#xff0c;它能够提高工程质量和施工效率&#xff0c;减少施工现场对环境的影响。通过凡尔码的二维码管理平台&#xff0c;系统从&#xff1a;生产过程、生产数据、生产计划、生产管理、成品交付等多个环节、工序和流程进…

mermaid学习第一天/更改主题颜色和边框颜色/《需求解释流程图》

mermaid 在线官网&#xff1a; https://mermaid-js.github.io/ 在线学习文件&#xff1a; https://mermaid.js.org/syntax/quadrantChart.html 1、今天主要是想做需求解释的流程图&#xff0c;又不想自己画&#xff0c;就用了&#xff0c;框框不能直接进行全局配置&#xff0…

如何助力机构单位提升运营效率?有什么靠谱的大数据管理平台?

随着数字化时代的到来&#xff0c;大数据管理平台已成为机构单位提高效率、优化资源配置的关键工具。其中&#xff0c;工单管理系统作为大数据管理平台的重要组成部分&#xff0c;对于机构单位运营的优化和提升具有举足轻重的地位。本文小编将为您介绍一款优秀的工单管理系统—…

Zygote进程通信为什么用Socket而不是Binder?

Zygote进程是Android系统中的一个特殊进程&#xff0c;它在系统启动时被创建&#xff0c;并负责孵化其他应用进程。它的主要作用是预加载和共享应用进程的资源&#xff0c;以提高应用启动的速度。 在Android系统中&#xff0c;常用的进程通信方式有以下几种&#xff1a; Intent…

概率论和数理统计(一)基本概念

前言 生活中对于事件的发生,可以概括为 确定现象&#xff1a;在一定条件下必然发生&#xff0c;如日出随机现象&#xff1a;在个别试验中其结果呈现出不确定性&#xff0c;在大量重复试验中其结果又具有统计规律的现象&#xff0c;称之为随机现象。 随机现象的特点&#xff…

独家分享 | BI零售数据分析模板,可视化,更易懂

“人、货、场”是零售数据分析的三大关键&#xff0c;只要能又快又透彻地掌握这三大关键的数据情况&#xff0c;即可为零售运营决策提供关键的数据支持&#xff0c;提高盈利、降低成本、优化采购库存结构等。奥威BI软件这套BI零售数据分析模板套装围绕“人、货、场”预设了数十…

低代码平台如火如荼,告诉我它具体能做什么?

目录 一、前言 二、低代码平台 三、低代码平台的优劣 四、低代码能解决哪些问题&#xff1f; 五、好用且强大的低代码平台 六、结语 一、前言 目前低代码平台如火如荼。这一新兴技术为企业提供了一种高效、灵活、快速开发应用程序的方法&#xff0c;并在短时间内取得了巨大成功…

游戏中找不到d3dx9_43.dll怎么办,教你快速解决方法

在计算机的世界里&#xff0c;我们经常会遇到一些让人头疼的问题。比如&#xff0c;有一天&#xff0c;小明正在玩他最喜欢的游戏&#xff0c;突然弹出了一个错误提示&#xff1a;“由于找不到d3dx9_43.dll,无法继续执行代码”。小明感到非常困惑&#xff0c;不知道这是什么意思…

【python VS vba】(5) 在python中使用xlwt操作Excel(待完善ing)

目录 1 什么是xlwt 2 导入xlwt 3 相关语法 3.1 创建新的workbook 3.2 创建新的sheet 3.3 保存workbook 4 python里表格的形式 4.1 矩阵 4.2 EXCEL的数据形式 完全等于矩阵的数字结构 4.3 python里矩阵 5 具体代码 5.1 代码 5.2 结果 5.3 要注意的问题 5.3.1 不能…

PostgreSQL manual

set path D:\DB\PostgreSQL\16\binconnect to database –h is host name -p is port number -d is database name -U is for user name psql -h localhost -p 5432 -d postgres -U postgresexport dump file 參考 pg_dump -h 192.168.1.1 -U uesername dbname > dbna…

项目实现思路-建设工程监理现场用表管理系统

项目实现思路-建设工程监理现场用表管理系统 文章目录 项目实现思路-建设工程监理现场用表管理系统1.架构&#xff08;B/S&#xff09;2.主要功能3.**技术细节**3.1 总体概要3.2 **技术细节之流程审批**3.3 **技术细节之电子签名和公章** 1.架构&#xff08;B/S&#xff09; 系…

期中成绩怎么发布?

作为一名老师&#xff0c;期中考试结束后&#xff0c;你可能正在为如何发布成绩而烦恼。传统的纸质方式不仅耗时而且容易出错&#xff0c;那么有没有一种方式可以让学生自助查询成绩呢&#xff1f;答案是肯定的。下面就为你介绍几种实用的方法&#xff0c;让成绩发布变得轻松又…