🔍 CVE-2026-111115

0.0
CVSS Score
UNKNOWN
2026-10-28
2026-10-29 15:04
✅ 완료

🇰🇷 한글 설명

Apache Kafka의 유연한 프로토콜 버전용 코드 생성 리더가 발신자가 선언한 태그 필드 개수를 검증 없이 읽어, 필드마다 RawTaggedField 객체를 할당합니다. 이 개수는 소켓 요청 최대 크기로만 제한되어, 작은 요청으로도 수천만 개의 객체 할당을 유발할 수 있습니다. 요청 헤더 파싱은 인증 이전에 수행되므로 인증 없이도 브로커 서비스 거부가 가능합니다.

💡 쉬운 설명

공격자가 몇십 MB 정도의 특수하게 조작된 요청을 보내면 Kafka 브로커가 수천만 개의 객체를 만들어 메모리를 모두 소진합니다. 인증 전에도 이 과정이 일어나 브로커가 응답하지 못하게 됩니다.

🇺🇸 원문 (English)

Apache Kafka's code-generated readers for flexible protocol versions read a tagged-field count declared by the sender and retain a RawTaggedField object for each unknown field. That count was bounded only by the outer request frame size (socket.request.max.bytes); it was not checked against the remaining buffer bytes or capped. Because each entry can be encoded in as little as two bytes (unknown tag 0, size 0), a modest request can declare tens of millions of tagged fields and force one object allocation per declared field. Flexible request headers (header version 2, used by flexible APIs such as ApiVersions v3) are parsed this way, so the amplification applies to the request header itself. Impact: The flexible request header is parsed on the network thread before authorization, request dispatch, and request-time quota accounting. A client can send a request of a few tens of megabytes whose header declares about 20 million tagged fields, forcing roughly that many RawTaggedField allocations and exhausting broker heap or inducing process-wide GC stalls, denying broker service. Because the header is parsed for pre-authentication APIs such as ApiVersions (v3), the allocation can occur before authentication; no Kafka resource ACL or quota is required. Mitigation: Upgrade to Apache Kafka 4.2.2, 4.3.2, or 4.4.0. Until then, lowering socket.request.max.bytes and restricting network access to broker listeners reduces, but does not remove, exposure. Resolution: From Apache Kafka 4.2.2, 4.3.2, and 4.4.0: generated readers bounds-check the tagged-field count for flexible-versioned messages, rejecting a negative count, a count exceeding the remaining buffer bytes, or a count exceeding a fixed maximum (10,000), before any per-field allocation.

📍 영향받는 시스템

Apache Kafka 4.2.2 미만, 4.3.2 미만, 4.4.0 미만 버전 (유연한 헤더 버전 2 사용 API 포함)

⚔️ 공격 벡터

인증 없이 브로커 리스너에 조작된 요청 헤더를 전송하여 태그 필드 개수를 수천만으로 선언해 힙 메모리 고갈 및 GC 지연을 유발

🛡️ 대응 방법

Apache Kafka 4.2.2, 4.3.2, 4.4.0 이상으로 업그레이드하고, 그 전까지 socket.request.max.bytes를 낮추고 브로커 리스너 네트워크 접근을 제한

🔧 검증 코드

출력된 버전이 4.2.2/4.3.2/4.4.0 이상이면 패치된 것이고, 그보다 낮은 버전이면 취약하므로 업그레이드가 필요합니다.

Shell / Script
kafka-broker-api-versions.sh --version 2>/dev/null || (ls /opt/kafka*/libs/kafka_*.jar 2>/dev/null | head -1)

💻 영향받는 소프트웨어

Spring for Apache Kafka