Aller au contenu

CVE-2025-39682 : utilisation après libération dans le sous-système kTLS du noyau Linux et élévation locale de privilèges

HERMES

SCORE DE MENACE HERMES & ÉLÉVATION DE PRIVILÈGES EN ESPACE NOYAU

Cible : Sous-système réseau du noyau Linux — net/tls/ (Chemin de réception logicielle kTLS)
Confiance : 99%
94 / 100
CRITIQUE

Mesure la pertinence opérationnelle réelle, la militarisation de l'exploit et la posture de menace active.

Décomposition des dimensions
Exploitabilité 19 / 20
Activité de menace 20 / 20
Militarisation 20 / 20
Exposition 17 / 20
Prévalence 20 / 20
Impact 19 / 20
Maturité de l'exploit 20 / 20
Potentiel d'attaque en chaîne 19 / 20
⚖️ Divergence & Justification opérationnelle

Le standard CVSS v3.1 attribue à la CVE-2025-39682 la note de 7.8 (Élevée) en raison de la nécessité d'un accès local (AV:L). Cependant, le score Hermes Threat Score l'élève à 94 (CRITIQUE / Priorité KEV Tier-1) suite à la confirmation de son exploitation active en conditions réelles répertoriée par la CISA le 18 septembre 2026. Dans les environnements cloud, les nœuds Kubernetes partagés et les passerelles web d'entreprise, le kTLS est fréquemment activé pour décharger les opérations cryptographiques. Des attaquants chaînant une évasion de conteneur ou une faille web exploitent ce bogue pour obtenir des droits root de manière déterministe sur l'ensemble des distributions Linux.

🕸️ Graphe de connaissances connecté & Provenance

CVE-2025-39682: Linux Kernel kTLS Receive Path Zero-Length Record Use-After-Free Privilege EscalationVULNÉRABILITÉ

Nœuds connectés : 1
Relations sortantes actives
→ affectsCOMPOSANTLinux Kernel Core
98% VERY_HIGH

Software platform affected by security vulnerabilities and agentic attack patterns.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Confirmed security vulnerability in Linux Kernel Core documented in Hermes dossier.”

Preuves vérifiées associées :

Le protocole kTLS s’initialise sur des sockets TCP classiques à l’aide de l’option TCP_ULP (Upper Layer Protocol) :

int sock = socket(AF_INET, SOCK_STREAM, 0);
connect(sock, (struct sockaddr *)&cible, sizeof(cible));
// Activation du protocole de couche supérieure kTLS
setsockopt(sock, SOL_TCP, TCP_ULP, "tls", sizeof("tls"));
// Configuration des paramètres cryptographiques pour la réception
setsockopt(sock, SOL_TLS, TLS_RX, &crypto_info, sizeof(crypto_info));

Une fois activé, l’ensemble du trafic chiffré entrant est déchiffré par le sous-système cryptographique du noyau, puis assemblé sous forme de tampons placés dans tls_sw_context_rx->rx_list.

ParamètreDétail techniqueImpact opérationnel
Identifiant CVECVE-2025-39682Inscription catalogue CISA KEV du 18-09-2026
Classe de vulnérabilitéUtilisation après libération (CWE-416) & condition anormale (CWE-754)Élévation locale de privilèges (LPE) vers root
Composant affecténet/tls/tls_sw.c (tls_sw_recvmsg)Sous-système réseau kTLS du noyau Linux
Vecteurs de déclenchementAppel non privilégié à recvmsg() sur une socket TCP kTLS localeShell local, conteneur ou RCE applicatif
Authentification requiseFaible (PR:L) / Utilisateur local non privilégié ou UID de conteneurAucun privilège ou capacité spéciale requise
ImpactExécution de code en Ring 0 / Extraction globale des identifiantsPrise de contrôle totale de l’hôte
Versions vulnérables6.0 à 6.1.148, 6.2 à 6.6.102, 6.7 à 6.12.43, 6.13 à 6.16.3, 6.17-rc1..2Distributions Linux avec CONFIG_TLS actif
Version correctiveNoyaux de maintenance 6.1.149, 6.6.103, 6.12.44, 6.16.4, 6.17Rétroportages éditeurs (RHEL, Ubuntu, Debian)

Le défaut réside au cœur de la boucle de traitement de tls_sw_recvmsg() qui parcourt la file de réception (ctx->rx_list) pour remplir le tampon de l’utilisateur.

Selon la spécification de kTLS, un appel unique à recvmsg() doit impérativement retourner :

  1. Soit un ou plusieurs enregistrements consécutifs de type DATA (données applicatives).
  2. Soit un seul enregistrement de contrôle non-DATA (alertes TLS, renégociations de session ou signaux de battement de cœur).

En aucun cas des trames de contrôle et des trames applicatives ne doivent être mélangées ou traitées de façon désynchronisée lors d’un même appel.

La faille des enregistrements de longueur nulle dans tls_sw_recvmsg()

Section intitulée « La faille des enregistrements de longueur nulle dans tls_sw_recvmsg() »

Lorsqu’un pair distant envoie un enregistrement déchiffré ne contenant aucun octet utile (par exemple une trame de données vide ou une alerte sans corps), le gestionnaire traite le paquet et place le sk_buff dans la liste rx_list :

/* Représentation simplifiée de la logique vulnérable dans net/tls/tls_sw.c */
static int tls_sw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
int flags, int *addr_len)
{
struct tls_context *tls_ctx = tls_get_ctx(sk);
struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx);
struct sk_buff *skb;
...
while (len && (skb = tls_wait_data(sk, flags, timeo, &err))) {
/*
* ANOMALIE : lorsque skb->len est nul, la vérification ne consomme pas
* correctement l'état de l'enregistrement de contrôle. La boucle libère
* le skb mais omet de réinitialiser le marqueur de type d'enregistrement.
*/
if (skb->len == 0) {
tls_rx_rec_done(ctx);
kfree_skb(skb);
continue; /* La boucle se poursuit avec un état désynchronisé */
}
...
err = process_rx_list(ctx, skb, &len);
}
return copied;
}

La libération du paquet via kfree_skb() sans mise à jour cohérente de la machine à états laisse des pointeurs obsolètes dans ctx->rx_list. Dès la trame suivante, le noyau référence une zone mémoire déjà restituée aux allocateurs kmalloc-512 ou skbuff_head_cache.

┌────────────────────────────────────────────────────────────────────────┐
│ CHRONOLOGIE DE L'USE-AFTER-FREE DANS kTLS │
├────────────────────────────────────────────────────────────────────────┤
│ T0 : Envoi d'un enregistrement vide suivi d'une trame de contrôle │
│ T1 : tls_sw_recvmsg() extrait le skb vide et le libère par kfree_skb │
│ T2 : Les drapeaux d'état ne sont pas réinitialisés ; pointeur résiduel │
│ T3 : L'attaquant vaporise le cache kmalloc avec un pseudo-skb contrôlé │
│ T4 : tls_sw_recvmsg() déréférence le pointeur obsolète -> UAF NOYAU │
│ T5 : Détournement de sk->sk_data_ready -> Exécution en Ring 0 (Root) │
└────────────────────────────────────────────────────────────────────────┘

Les groupes cybercriminels ont militarisé cette vulnérabilité pour transformer un accès initial restreint en compromission complète du serveur :

  1. Accès initial non privilégié : l’attaquant dispose d’un shell local restreint (usurpation d’identifiants SSH, évasion de conteneur ou faille RCE dans une application web).
  2. Création de la socket kTLS : le binaire d’exploitation ouvre une connexion TCP locale, active TCP_ULP avec la valeur "tls" et configure les clés symétriques via setsockopt(..., SOL_TLS, TLS_RX).
  3. Transmission du flux piégé : l’attaquant envoie sur la socket une séquence spécifique : un enregistrement applicatif chiffré de taille zéro immédiatement suivi d’une trame de contrôle hors séquence.
  4. Déclenchement de la libération prématurée : un appel à recvmsg() avec un tampon tronqué force tls_sw_recvmsg à libérer le sk_buff via kfree_skb() tout en maintenant une référence active dans la liste de réception.
  5. Vaporisation du tas noyau (slab spraying) : l’attaquant inonde le cache kmalloc-1024 à l’aide d’appels sendmsg() pour réallouer l’emplacement libéré avec des données contrôlées contenant des pointeurs de rappel forgés.
  6. Élévation de privilèges : lors d’une opération ultérieure sur la socket, le noyau exécute le pointeur manipulé en Ring 0. Le code injecté exécute commit_creds(prepare_kernel_cred(NULL)) et octroie les identifiants UID 0 (root) au processus de l’attaquant.

Les tentatives d’exploitation infructueuses ou instables laissent des signatures explicites dans le tampon circulaire du noyau (dmesg / /var/log/messages) :

  • Fautes de protection générale : rechercher des plantages provenant du sous-système net/tls/ :
    BUG: unable to handle page fault for address: ffff888012345678
    #PF: supervisor read access in kernel mode
    #PF: error_code(0x0000) - not-present page
    Workqueue: events tls_sk_proto_close
    RIP: 0010:tls_sw_recvmsg+0x3ba/0x780 [tls]
    Call Trace:
    <TASK>
    inet_recvmsg+0x54/0x130
    sock_recvmsg+0x3f/0x70
    __sys_recvmsg+0x8a/0x100
    do_syscall_64+0x58/0x80
  • Rapports KASAN : sur les machines disposant d’un noyau instrumenté avec Kernel Address Sanitizer, des alertes use-after-free in tls_sw_recvmsg identifient directement l’objet libéré par kfree_skb.
  • Configuration de sockets non autorisées : surveiller les processus s’exécutant sous des comptes de service (www-data, nobody) appelant setsockopt avec le niveau SOL_TCP (6) et l’option TCP_ULP (31) avec la chaîne "tls".
  • Transitions de privilèges brutales : corréler les journaux auditd signalant des appels à setuid non précédés d’authentification PAM classique (sudo, su).

title: Crash ou panique du sous-système kTLS du noyau Linux
id: d82e1456-913a-4e2b-8711-2b8c9e253968
status: experimental
description: Détecte les messages de plantage, fautes de protection ou alertes KASAN liés à kTLS, signalant l'exploitation de la CVE-2025-39682.
logsource:
product: linux
service: kernel
detection:
selection:
- 'tls_sw_recvmsg'
- 'BUG: unable to handle page fault'
- 'kernel NULL pointer dereference'
- 'KASAN: use-after-free in tls_sw_recvmsg'
condition: selection
level: critical
tags:
- attack.privilege_escalation
- attack.t1068
- cve.2025-39682

  1. Mise à jour du noyau : appliquer sans délai les correctifs de maintenance publiés par les éditeurs :
    • RHEL 9 / Rocky / AlmaLinux : déployer les avis de sécurité RHSA correspondants.
    • Ubuntu 24.04 / 22.04 LTS : installer les noyaux 6.8.0-45-generic ou 5.15.0-118-generic.
    • Debian 12 bookworm : appliquer la version linux-image-6.1.0-25-amd64 ou plus récente.
  2. Conformité CISA KEV : pour les entités assujetties aux directives opérationnelles contraignantes (BOD 22-01), la remédiation doit être finalisée avant le 9 octobre 2026.

Mesure de contournement d’urgence (liste noire du module)

Section intitulée « Mesure de contournement d’urgence (liste noire du module) »

S’il est impossible de redémarrer immédiatement les serveurs de production, bloquer le chargement du module kTLS :

Fenêtre de terminal
# Inscription du module kTLS sur liste noire
echo "install tls /bin/true" | sudo tee /etc/modprobe.d/disable-tls.conf
echo "blacklist tls" | sudo tee -a /etc/modprobe.d/disable-tls.conf
# Déchargement du module s'il n'est pas utilisé par un service actif :
sudo modprobe -r tls

Remarque : la désactivation de kTLS entraîne le basculement automatique du trafic TLS vers l’espace utilisateur (OpenSSL / BoringSSL), occasionnant une légère augmentation de la charge CPU sans interruption de service.