
0.前言
背景:公司項(xiàng)目掃描到 Spring-Kafka上使用通配符模式匹配進(jìn)行的安全繞過漏洞 CVE-2023-20873
漏洞
中等風(fēng)險(xiǎn) | 2023年8月23日 | CVE-2023-34040
在Spring for Apache Kafka 3.0.9及更早版本以及2.9.10及更早版本中,存在可能的反序列化攻擊向量,但只有在應(yīng)用了不常見的配置時(shí)才會(huì)出現(xiàn)。攻擊者必須在反序列化異常記錄頭中構(gòu)造一個(gè)惡意序列化對(duì)象。
spring-kafka 介紹
Spring Kafka 是 Spring 框架提供的一個(gè)庫(kù),它提供了使用 Apache Kafka 的便捷方式。Apache Kafka 是一個(gè)開源的流處理平臺(tái),主要用于構(gòu)建實(shí)時(shí)數(shù)據(jù)流管道和應(yīng)用。Spring Kafka 通過提供一種抽象和封裝的方法,使開發(fā)者能夠更容易地在 Spring 框架中使用 Apache Kafka。它大大簡(jiǎn)化了在 Spring 框架中使用 Apache Kafka 的復(fù)雜性,使得開發(fā)者可以更專注于業(yè)務(wù)邏輯的開發(fā)。
簡(jiǎn)化的 Kafka 生產(chǎn)者和消費(fèi)者配置:Spring Kafka 提供了一套簡(jiǎn)單的方法來(lái)配置 Kafka 生產(chǎn)者和消費(fèi)者。它提供了與 Spring Boot 的集成,使得配置更加簡(jiǎn)單。
異常處理:Spring Kafka 提供了一套機(jī)制來(lái)處理生產(chǎn)者和消費(fèi)者在使用過程中遇到的異常,包括發(fā)送消息失敗、消息格式錯(cuò)誤等異常。
消息轉(zhuǎn)換:Spring Kafka 提供了一套機(jī)制來(lái)轉(zhuǎn)換 Kafka 消息,使得可以使用喜歡的數(shù)據(jù)格式(如 JSON、Avro 等)來(lái)發(fā)送和接收 Kafka 消息。
事務(wù)支持:Spring Kafka 提供了對(duì) Kafka 事務(wù)的支持,使得可以在一個(gè)事務(wù)中發(fā)送多個(gè) Kafka 消息。
帶有回調(diào)的消息發(fā)送:Spring Kafka 提供了一種方法,可以在消息發(fā)送后獲取到發(fā)送結(jié)果的回調(diào),以便于進(jìn)行進(jìn)一步的處理。
1.參考文檔
CVE 官方網(wǎng)站 https://www.cve.org/CVERecord?id=CVE-2023-34040
spring官方網(wǎng)站 https://spring.io/security/cve-2023-34040
2.基礎(chǔ)介紹
CVE-2023-34040:當(dāng)配置不當(dāng)時(shí),Spring-Kafka中的Java反序列化漏洞
中等風(fēng)險(xiǎn) | 2023年8月23日 | CVE-2023-34040
描述
在Spring for Apache Kafka 3.0.9及更早版本以及2.9.10及更早版本中,存在可能的反序列化攻擊向量,但只有在應(yīng)用了不常見的配置時(shí)才會(huì)出現(xiàn)。攻擊者必須在反序列化異常記錄頭中構(gòu)造一個(gè)惡意序列化對(duì)象。
具體來(lái)說,當(dāng)滿足以下所有條件時(shí),應(yīng)用程序才會(huì)變得脆弱:
用戶未為記錄的鍵和/或值配置ErrorHandlingDeserializer
用戶明確地將容器屬性checkDeserExWhenKeyNull和/或checkDeserExWhenValueNull設(shè)置為true。
用戶允許不受信任的源發(fā)布到Kafka主題
默認(rèn)情況下,這些屬性為false,且只有在配置了ErrorHandlingDeserializer時(shí),容器才會(huì)嘗試反序列化這些頭。ErrorHandlingDeserializer通過在處理記錄之前移除所有此類惡意頭,阻止了此漏洞的發(fā)生。
受影響的Spring產(chǎn)品和版本
Spring for Apache Kafka
2.8.1至2.9.10
3.0.0至3.0.9
3.解決方案
3.1. 升級(jí)版本
- 2.8.x和2.9.x的用戶應(yīng)升級(jí)到2.9.11
- 3.0.x的用戶應(yīng)升級(jí)到3.0.10
- 已修復(fù)此問題的版本包括:
Spring for Apache Kafka
3.0.10
2.9.11 Spring boot 3.0.10(或更高)依賴管理將自動(dòng)使用Spring for Apache Kafka 3.0.10(或更高)。Spring Boot 2.7.x用戶應(yīng)將Boot的Spring for Apache Kafka 2.8.x依賴管理版本覆蓋為2.9.11(或更高)。
3.2. 替代方案
在不使用ErrorHandlingDeserializers時(shí),不要設(shè)置容器屬性checkDeserExWhenKeyNull或checkDeserExWhenValueNull,或者使用ErrorHandlingDeserializers
4.Spring kafka 使用教程代碼示例
pom.xml
文件中添加 Spring Kafka 的依賴:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
在application.properties文件中設(shè)置Kafka的配置:
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=myGroup
spring.kafka.template.default-topic=myTopic
創(chuàng)建一個(gè)消息生產(chǎn)者:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class KafkaProducer {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void sendMessage(String message) {
kafkaTemplate.sendDefault(message);
}
}
創(chuàng)建一個(gè)消息消費(fèi)者:
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;
@Service
public class KafkaConsumer {
@KafkaListener(topics = "myTopic", groupId = "myGroup")
public void listen(String message) {
System.out.println("Received message: " + message);
}
}
可以通過創(chuàng)建一個(gè)簡(jiǎn)單的REST API來(lái)測(cè)試消息的發(fā)送和接收:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-730366.html
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/kafka")
public class KafkaController {
@Autowired
private KafkaProducer producer;
@PostMapping(value = "/publish")
public void sendMessageToKafka(@RequestBody String message) {
this.producer.sendMessage(message);
}
}
這個(gè)API接收一個(gè)POST請(qǐng)求,并將請(qǐng)求體中的消息發(fā)送到Kafka。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-730366.html
到了這里,關(guān)于Spring boot使用Kafka Java反序列化漏洞 CVE-2023-34040的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!