CVE-2026-111108 in Kafka
Zusammenfassung
von VulDB • 28.10.2026
Der in Apache Kafka generierte Code für Protokoll-Leser dimensioniert die Sammlung eines Arrays basierend auf der vom Absender deklarierten Elementanzahl vor. Diese Anzahl wird lediglich gegen die im Anforderungspuffer verbleibenden Bytes geprüft, wobei von etwa einem Byte pro Element ausgegangen wird; da die meisten Elemente mehrere Bytes benötigen, kann eine Anfrage weit mehr Elemente deklarieren, als der Puffer aufnehmen kann, und dies dennoch bestehen lassen. Für ein key-basiertes Array weist der Leser dann eine ImplicitLinkedHashCollection mit einer Kapazität von (2 * count + 1) zu, sodass eine Anforderung im Bereich weniger Dutzend Megabytes vor dem Lesen eines einzelnen Elements eine Heap-Allokation erzwingen kann, die mehrere Male größer ist als die ursprüngliche Größe. Dieses Muster wird in jeden generierten Leser eingebaut und betrifft daher alle Kafka-API-Typen mit einem Array-Feld.
Auswirkung:
Die Anforderungsparsierung erfolgt vor jeder Autorisierungsprüfung. Bei einem Listener, der keine Authentifizierung erfordert (z. B. PLAINTEXT), kann ein nicht authentifizierter Angreifer einige gleichzeitige Anfragen senden, die jeweils eine sehr große Array-Länge deklarieren und im Broker-Heap das Vielfache ihrer Drahtgröße allokieren, was den Broker mit einem OutOfMemoryError abstürzen lässt. Der Melder demonstrierte drei gleichzeitige ~90 MB ProduceRequest (v3)-Verbindungen, die einen 1 GB großen Heap erschöpften (~8-fache Amplifikation). Bei Listeners, die eine Authentifizierung erfordern, benötigt der Angreifer gültige Anmeldeinformationen, jedoch keine spezifischen ACLs, da die Parsierung der Autorisierung vorangeht.
Minderung:
Aktualisieren Sie auf Apache Kafka 4.2.2, 4.3.2 oder 4.4.0. Bis dahin reduzieren das Herabsetzen von socket.request.max.bytes und die Einschränkung des Netzwerkzugriffs auf Broker-Listener die Exposition, beseitigen sie jedoch nicht.
Lösung:
Ab Apache Kafka 4.2.2, 4.3.2 und 4.4.0 begrenzen generierte Leser die initiale Array-Vorallokation an MessageUtil.MAX_PREALLOCATED_ARRAY_CAPACITY (1000) und vergrößern diese bei Bedarf; zudem wird eine deklarierte Array-Länge über MessageUtil.MAX_ARRAY_LENGTH (1.000.000) abgelehnt.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.