FlawOpen

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

● CVE-2025-39682 · CVSS 9.8 · Critique
Recherche · FlawOpen

Linux CVE-2025-39682 : enregistrement vide dans kTLS

Un enregistrement TLS non-DATA de longueur nulle dans la file de réception kTLS de Linux pouvait contourner le contrôle du type par recvmsg. Le correctif vérifie le type traité même si aucun octet n’a été copié. L’évaluation CVSS de Linux décrit une possible divulgation du tas du noyau vers l’espace utilisateur, une corruption mémoire et des plantages distants du noyau ; ce sont des conséquences évaluées, et non l’affirmation que chaque système affecté subira chacun de ces effets.

Vecteur CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
💡 Explication en Langage Simple (ELI5)

Imaginez un trieur de courrier qui ne peut placer que des lettres d’une même catégorie dans chaque bac. Une enveloppe vide garde une catégorie, mais l’ancien trieur changeait de bac en comptant les lettres. Avec zéro lettre, il ignorait la catégorie et mélangeait le type suivant. Le correctif du noyau vérifie le marqueur de catégorie même si l’enveloppe ne contient aucune donnée.

Concepts Clés et Termes

kTLS
TLS du noyau : Linux peut traiter les enregistrements TLS dans le noyau pour un socket TCP associé.
recvmsg()
Appel de réception socket utilisé par l’application et le chemin de réception kTLS.
Type de contenu TLS
Champ qui classe l’enregistrement, par exemple données applicatives ou contrôle.
rx_list
File des enregistrements de réception en attente, traités par les appels recvmsg suivants.
CWE-754
Vérification incorrecte de conditions inhabituelles ou exceptionnelles. Le NVD répertorie CWE-754 et attribue cette classification à CISA-ADP ; la fiche CVE de Linux n’attribue aucun CWE.

Correspondances de référentiels

Analyse de Cause Racine

La réception kTLS de Linux doit renvoyer des enregistrements DATA contigus ou un seul enregistrement non-DATA par appel recvmsg(). Lorsque process_rx_list() traitait un premier enregistrement non-DATA de longueur nulle, il pouvait définir le type TLS tout en renvoyant err == 0. tls_sw_recvmsg() copiait ce zéro dans copied et utilisait (copied && control != TLS_RECORD_TYPE_DATA) dans sa condition d’arrêt. Comme copied valait zéro, le type déjà traité était ignoré et le chemin continuait avec les données suivantes. Le correctif amont vérifie directement control : si un type a été signalé et qu’il n’est pas DATA, il s’arrête ; zéro reste le marqueur « aucun type signalé ». L’exposition nécessite que la réception TLS du noyau Linux (kTLS) soit activée et utilisée ; il ne s’agit pas d’un défaut de tous les analyseurs TLS en espace utilisateur. Le vecteur CVSS 3.1 publié par Linux est 9,8 Critique (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H). Évaluez l’exposition selon l’usage réel de kTLS et l’état du noyau fourni par votre éditeur.

Déroulement de l'Attaque Étape par Étape

Étape 1

kTLS reçoit des enregistrements

Une application utilise un socket TCP avec la réception TLS du noyau activée.

Étape 2

Un enregistrement non-DATA vide en attente est traité

Le cas survient si le premier élément de rx_list n’a pas de charge utile. Le traitement peut signaler un type tout en renvoyant zéro octet copié.

Étape 3

L’ancienne condition dépend des octets copiés

Comme copied vaut zéro, elle ne vérifie pas si le type traité était non-DATA.

Étape 4

La boucle franchit la limite de type

Les données suivantes peuvent être traitées dans le même appel recvmsg, contrairement à la règle de type unique. L’évaluation CVSS de Linux décrit une possible divulgation du tas du noyau vers l’espace utilisateur, une corruption mémoire et des plantages distants du noyau ; ce sont des conséquences évaluées, et non l’affirmation que chaque système affecté subira chacun de ces effets.

Étape 5

Le correctif vérifie le marqueur sémantique

La condition corrigée s’arrête lorsque control indique un type non-DATA, quel que soit le nombre d’octets copiés.

Code Source : Vulnérable vs Sécurisé

Extrait de net/tls/tls_sw.c, et non fonction complète. Le correctif amont utilise le marqueur du type signalé plutôt que le nombre d’octets copiés. control == 0 signifie qu’aucun type n’a été signalé ; une valeur non nulle différente de DATA arrête cet appel recvmsg. Il s’agit du changement logique exact du correctif.

Extrait source: net/tls/tls_sw.c — fonction tls_sw_recvmsg

IMPLÉMENTATION VULNÉRABLE
copied = err;
if (len <= copied ||
    (copied && control != TLS_RECORD_TYPE_DATA) || rx_more)
    goto end;
PATCH SÉCURISÉ ET ROBUSTE
copied = err;
if (len <= copied || rx_more ||
    (control && control != TLS_RECORD_TYPE_DATA))
    goto end;

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources