FlawOpen

flawopen.com/Teardowns/cve-2025-39682-linux-ktls-zero-length-record-mishandling

● CVE-2025-39682 · CVSS 9.8 · Crítica
Pesquisa · FlawOpen

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 CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
💡 Explicação em Linguagem Simples (ELI5)

Imagine 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-754 e atribui a classificação ao CISA-ADP; o próprio registro CVE do Linux não atribui um CWE.

Mapeamentos de frameworks

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

Passo 1

kTLS recebe registros

Uma aplicação usa um socket TCP com recepção TLS do kernel habilitada.

Passo 2

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.

Passo 3

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.

Passo 4

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.

Passo 5

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

IMPLEMENTAÇÃO VULNERÁVEL
copied = err;
if (len <= copied ||
    (copied && control != TLS_RECORD_TYPE_DATA) || rx_more)
    goto end;
PATCH SEGURO E ROBUSTO
copied = err;
if (len <= copied || rx_more ||
    (control && control != TLS_RECORD_TYPE_DATA))
    goto end;

Lista de Verificação de Segurança para Engenharia

Fontes