flawopen.com/Teardowns/cve-2025-39682-linux-ktls-zero-length-record-mishandling
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 CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HImaginez 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-754et attribue cette classification à CISA-ADP ; la fiche CVE de Linux n’attribue aucun CWE.
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-754
- CISA KEV — ajouté le 2026-09-18 — CVE-2025-39682
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
kTLS reçoit des enregistrements
Une application utilise un socket TCP avec la réception TLS du noyau activée.
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é.
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.
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.
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
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;
Liste de Contrôle de Sécurité pour l'Ingénierie
- ✓Inventoriez les charges de travail qui activent la réception kTLS de Linux ; TLS utilisateur ordinaire n’implique pas automatiquement une exposition.
- ✓Installez un paquet noyau fournisseur contenant le correctif et confirmez le build dans son avis.
- ✓Préservez l’invariant : un appel recvmsg traite des enregistrements DATA contigus ou un seul non-DATA, sans franchir la limite de type.
- ✓Exécutez ou conservez le test de régression upstream kTLS sur les enregistrements de longueur nulle ; les implémentations downstream de réception doivent aussi vérifier qu’un enregistrement non-DATA vide n’entraîne pas la consommation du suivant dans le même appel.
- ✓Distinguez « aucun type observé » de « zéro octet copié » ; vérifiez l’état sémantique tel que
control. - ✓Si le correctif tarde, suivez la mesure d’atténuation fournisseur pour kTLS et vérifiez son impact sur les charges qui en dépendent.