flawopen.com/Teardowns/cve-2025-39682-linux-ktls-zero-length-record-mishandling
Linux CVE-2025-39682: falha de registro vazio no kTLS
Um registro TLS não-DATA de comprimento zero na fila de recepção kTLS do Linux podia ignorar a verificação de tipo por recvmsg. A correção verifica o tipo processado mesmo quando nenhum byte foi copiado. A avaliação CVSS do Linux descreve possíveis exposição do heap do kernel a processos no espaço de usuário, corrupção de memória e falhas remotas do kernel; são consequências avaliadas, não uma afirmação de que todo sistema afetado sofrerá cada resultado.
Vetor CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HImagine um carteiro que só pode colocar cartas de uma categoria em cada bandeja. Um envelope vazio ainda tem uma categoria, mas o carteiro antigo só decidia trocar de bandeja contando as cartas. Com zero cartas, ignorava a categoria do envelope e misturava o tipo seguinte na mesma bandeja. A correção do kernel verifica o marcador de categoria mesmo quando não há dados no envelope.
Conceitos Centrais e Termos
kTLS- TLS no kernel: o Linux pode processar registros TLS no kernel para um socket TCP associado.
recvmsg()- Chamada de recebimento de socket usada pela aplicação e pelo caminho de recepção kTLS.
Tipo de conteúdo TLS- Campo que classifica o registro, como dados de aplicação ou registro de controle.
rx_list- Fila de registros pendentes de recepção processados por chamadas recvmsg posteriores.
CWE-754- Verificação inadequada de condições incomuns ou excepcionais. O NVD lista
CWE-754e atribui a classificação ao CISA-ADP; o próprio registro CVE do Linux não atribui um CWE.
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-754
- CISA KEV — adicionado em 2026-09-18 — CVE-2025-39682
Análise de Causa Raiz
O recebimento kTLS do Linux deve retornar registros DATA contíguos ou um único registro não-DATA por chamada recvmsg(). Quando process_rx_list() tratava um registro inicial não-DATA de comprimento zero, podia definir o tipo TLS e retornar err == 0. tls_sw_recvmsg() copiava esse zero para copied e usava (copied && control != TLS_RECORD_TYPE_DATA) como parte da condição de parada. Como copied era zero, o tipo já processado era ignorado e o fluxo continuava para os dados seguintes. O patch upstream verifica diretamente control: se um tipo foi informado e não é DATA, para; zero continua sendo o marcador de “nenhum tipo informado”. A exposição exige o caminho de recepção TLS do kernel Linux (kTLS) habilitado e em uso; não é uma falha de todos os parsers TLS em espaço de usuário. O vetor CVSS 3.1 publicado pelo Linux é 9,8 Crítico (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H). Avalie a exposição pelo uso real de kTLS e pelo estado do kernel do fornecedor.
Fluxo de Ataque Passo a Paso
kTLS recebe registros
Uma aplicação usa um socket TCP com recepção TLS do kernel habilitada.
Um registro não-DATA vazio pendente é processado
O caso ocorre quando o primeiro registro retirado de rx_list não tem payload. O processamento pode informar um tipo e retornar zero bytes copiados.
A condição antiga considera os bytes copiados
Como copied vale zero, a condição antiga não verifica se o tipo processado era não-DATA.
O loop cruza a fronteira de tipo
Os dados seguintes podem ser processados na mesma chamada recvmsg, contra a regra de tipo único. A avaliação CVSS do Linux descreve possíveis exposição do heap do kernel a processos no espaço de usuário, corrupção de memória e falhas remotas do kernel; são consequências avaliadas, não uma afirmação de que todo sistema afetado sofrerá cada resultado.
A correção verifica o marcador semântico
A condição corrigida para quando control indica um tipo não-DATA, independentemente da quantidade copiada.
Código-Fonte: Vulnerável vs. Seguro
Trecho de net/tls/tls_sw.c, não uma função completa. O upstream alterou a condição de parada para usar o marcador de tipo informado, em vez de verificar se bytes foram copiados. control == 0 significa que nenhum tipo foi informado; um valor não zero diferente de DATA interrompe esta chamada recvmsg. Esta é a alteração lógica exata do patch upstream.
Trecho de origem: net/tls/tls_sw.c — função tls_sw_recvmsg
copied = err;
if (len <= copied ||
(copied && control != TLS_RECORD_TYPE_DATA) || rx_more)
goto end;
copied = err;
if (len <= copied || rx_more ||
(control && control != TLS_RECORD_TYPE_DATA))
goto end;
Lista de Verificação de Segurança para Engenharia
- ✓Inventarie as cargas que habilitam a recepção kTLS do Linux; TLS comum em espaço de usuário não significa exposição automática.
- ✓Atualize para um pacote de kernel do fornecedor que contenha a correção e confirme o build no aviso correspondente.
- ✓Preserve a regra: uma chamada recvmsg processa registros DATA contíguos ou um registro não-DATA, sem cruzar o limite de tipo.
- ✓Execute ou mantenha o teste de regressão upstream do kTLS para registros de comprimento zero; implementações downstream do caminho de recepção também devem garantir que um registro não-DATA vazio não permita consumir o próximo registro na mesma chamada.
- ✓Não confunda “nenhum tipo observado” com “zero bytes copiados”; verifique estado semântico como
control. - ✓Se o patch atrasar, siga a mitigação do fornecedor para kTLS e valide o impacto nas cargas que dependem de TLS no kernel.