En-tête négligent

Clockwork Root : Anatomie de la condition de course du noyau Linux CVE-2025-38352

Nous sommes en 2025, et tandis que les équipes de sécurité renforcent leurs périmètres, les listes de diffusion du noyau Linux bruissent d'une nouvelle menace. Le groupe d'analyse des menaces (TAG) de Google a confirmé l'utilisation d'armes à feu dans les systèmes d'exploitation. CVE-2025-38352.

Il ne s'agit pas d'un simple bogue de corruption de la mémoire. Il s'agit d'un bogue sophistiqué, dépendant du temps. État de la course résidant au plus profond du sous-système POSIX CPU timer du noyau Linux. Avec un score CVSS de 7,4, elle peut sembler gérable à première vue, mais ne vous laissez pas tromper par ce score. Entre les mains des vendeurs de logiciels espions commerciaux, cette vulnérabilité a déjà été exploitée pour obtenir des résultats fiables. L'escalade des privilèges locaux (LPE) sur des appareils Android entièrement corrigés, en contournant les mesures d'atténuation modernes telles que KASLR et PAN.

Pour l'élite des ingénieurs en sécurité, CVE-2025-38352 représente le summum de l'exploitation "Race-to-Use-After-Free". Elle exploite l'écart microscopique entre l'entrée d'un processus dans l'état "Zombie" et le nettoyage des temporisateurs par le noyau. Cet article abandonne les résumés de haut niveau pour effectuer une dissection chirurgicale de kernel/time/posix-cpu-timers.cL'analyse temporelle pilotée par l'IA est le seul moyen de détecter ce que les auditeurs humains n'ont pas vu.

La faille fatale du noyau : une danse de spinlock brisée

Pour comprendre CVE-2025-38352, nous devons examiner la manière dont le noyau Linux gère la concurrence lors de la fin d'un processus. La vulnérabilité provient d'une violation d'atomicité dans la façon dont le noyau traite les minuteries CPU expirées alors qu'un thread tente simultanément de les supprimer.

Le chemin du code vulnérable

La faille réside dans le handle_posix_cpu_timers() Cette fonction est chargée de parcourir la liste des minuteries actives et de déclencher celles qui ont expiré. Cette fonction est chargée d'itérer sur une liste de temporisateurs actifs et de désactiver ceux qui ont expiré. Pour effectuer cette itération, elle doit contenir la valeur soupir->siglock.

Cependant, avant le correctif, la logique contenait une séquence fatale :

  1. Acquisition de l'écluse : Le noyau acquiert soupir->siglock pour parcourir la liste des minuteries.
  2. La chute : Pour gérer une capacité d'expiration spécifique (en particulier CPUCLOCK_PERTHREAD), le code brièvement fait tomber la serrure pour effectuer une opération de vérification ou de remise en file d'attente.
  3. L'utilisation : Il récupère le verrou et procède au déréférencement de l'objet timer.

La fenêtre de la course

C'est à l'intérieur de cette fenêtre microscopique - là où la serrure tombe - que l'attaquant frappe.

Un thread concurrent (Thread B) émet un syscall timer_delete(). Comme le verrou est libre, le thread B l'acquiert avec succès, supprime le minuteur de la liste et libère la mémoire via kfree_rcu ou slab deallocation.

Lorsque le Thread A (le contexte victime) récupère le verrou, il détient un pointeur sur un objet de type posix_cputimer qui, techniquement, n'existe plus. Il procède à l'écriture dans cette mémoire (par exemple, en mettant à jour le délai d'expiration), ce qui déclenche une alerte de Utilisation sans restriction (UAF) écrire.

Clockwork Root : Anatomie de la condition de course du noyau Linux CVE-2025-38352

L'armement du zombie : Les primitives d'exploitation

L'exploitation d'une condition de course du noyau est souvent comparée au fait de gagner à la loterie. Cependant, les développeurs d'exploits avancés ne jouent pas aux dés ; ils truquent le jeu. Dans le contexte de CVE-2025-38352, les attaquants truquent le jeu en utilisant les éléments suivants Processus zombies.

1. Élargir la fenêtre (la technique de la "zombification")

La fenêtre de course standard peut n'être large que de quelques nanosecondes. Pour rendre l'exploitation fiable (taux de réussite de 90%+), les attaquants utilisent l'état de sortie du processus.

En créant un processus enfant et en le faisant sortir - mais délibérément pas le récolter (via waitpid) - le processus entre dans le EXIT_ZOMBIE état. Dans cet état, la structure de la tâche reste en mémoire, mais la logique de nettoyage est en attente. Les attaquants ont découvert que le déclenchement d'opérations de temporisation sur un processus Zombie force le noyau à emprunter un chemin de code plus lent et plus complexe au sein du processus posix_cpu_timer_delLa fenêtre de course est ainsi artificiellement dilatée, passant de la nanoseconde à la microseconde.

2. SLUB Feng Shui (pulvérisation en tas)

Une fois que l'UAF est déclenché, le noyau écrit des données dans un emplacement de mémoire libéré. Si cet emplacement est vide, le noyau se bloque (DoS). Pour obtenir Root, l'attaquant doit remplacer l'objet timer libéré par une charge utile.

Les attaquants tirent parti de la SLUB allocator's un comportement prévisible (dernier entré, premier sorti).

  1. Gratuit : Déclencher la course pour libérer le minuterie struct.
  2. Pulvérisation : Inonder immédiatement le tas du noyau avec des objets contrôlés par l'utilisateur ayant exactement la même taille (par exemple, à l'aide de la fonction sendmsg des données auxiliaires ou clé_série objets).
  3. Corruption : Le noyau, pensant mettre à jour la minuterie, écrit dans l'objet de l'attaquant. Si l'attaquant a pulvérisé une structure contenant un pointeur de fonction (par exemple, un tty_struct ou opérations_fichier), le noyau écrase ce pointeur.
  4. Exécution : Lorsque l'attaquant invoque l'objet pulvérisé (par exemple, en fermant le fichier), le noyau passe à l'adresse écrasée -> chaîne ROP -> racine.
Clockwork Root : Anatomie de la condition de course du noyau Linux CVE-2025-38352

Au-delà de Syzkaller : Pourquoi le Fuzzing traditionnel a échoué

CVE-2025-38352 n'a pas été détecté par les fuzzers automatisés comme Syzkaller de Google pendant des années. Pourquoi ?

Le fuzzing traditionnel guidé par la couverture est probabiliste. Il lance des appels de service aléatoires au noyau dans l'espoir de le faire planter.

  • Il ne comprend pas Calendrier.
  • Il ne comprend pas Dépendances des États (par exemple, "Le fil A doit se terminer pendant que le fil B supprime un minuteur").

La probabilité statistique qu'un fuzzer aveugle rencontre cette condition de course spécifique, avec le processus dans l'état exact où il se trouve. ZOMBIE est astronomiquement bas.

La solution IA : L'analyse temporelle de Penligent

Cet échec des outils traditionnels souligne la nécessité de Analyse logique pilotée par l'IA. C'est ici que Penligent.ai change le paradigme de "Fuzzing" à "Reasoning".

Penligent utilise une méthode spécialisée Agent d'intelligence artificielle sensible au temps conçu pour la recherche de bogues dans le domaine de la concurrence :

1. Reconnaissance des formes de concomitance

Au lieu d'entrées aléatoires, le modèle de Penligent analyse l'AST (Abstract Syntax Tree) de la source du noyau. Il identifie les "paires dangereuses", c'est-à-dire les appels système qui modifient la même ressource partagée (dans ce cas, posix_cputimer), mais suivent des chemins de verrouillage différents. Il a signalé timer_delete et handle_posix_cpu_timers comme une cible de collision à haute probabilité.

2. Dilatation de la fenêtre de course par l'IA

Penligent ne se contente pas d'exécuter des appels de service, il les orchestre. Reconnaissant la nécessité d'élargir la fenêtre de course, l'IA a automatiquement déduit l'appel de service de l'appel de service. EXIT_ZOMBIE en analysant les rapports de vulnérabilité "Ref-Count" précédents. Il a généré une preuve de concept qui bloque le processeur de manière programmatique (à l'aide de la fonction sched_yield ou des barrières de mémoire étendues) pour garantir la collision.

Pour l'ingénieur en sécurité, cela signifie que Penligent ne se contente pas de signaler des "bogues potentiels", mais qu'il délivre exploits vérifiés et militarisés qui démontrent le véritable profil de risque du code.

Remédiation et détection par l'équipe bleue

Le correctif, intégré au noyau Linux à la fin de l'année 2025, implique une vérification logique plutôt qu'un simple verrouillage.

La solution :

Dans run_posix_cpu_timers(), le noyau vérifie maintenant explicitement si (tsk->exit_state). Si la tâche est déjà morte ou mourante, il interrompt immédiatement le traitement de l'horloge. Cela supprime effectivement la variable "Zombie" de l'équation.

Stratégies de détection (EDR/Syslog) :

Les équipes bleues doivent rechercher les indicateurs de compromission (IoC) suivants sur les serveurs Linux/Android :

  • Changement de minuterie à haute fréquence : Un processus qui crée et supprime rapidement des milliers de minuteries POSIX par seconde.
  • Inondations de zombies : Une accumulation inhabituelle de Z des processus d'état qui sont rapidement engendrés et non récoltés.
  • Tache du noyau (Kernel Taint) : dmesg les journaux indiquant des "défauts de protection générale" ou une "corruption de la dalle" en kmalloc-192 (ou la taille spécifique de la dalle pour les minuteries de votre arche).

Conclusion

CVE-2025-38352 est un rappel festif que le code hérité est un champ de mines. Le code de la minuterie POSIX a été écrit il y a plusieurs dizaines d'années, mais il contenait une faille latente qui a nécessité le paysage complexe de la mémoire de 2025 pour être exploitée.

Pour l'ingénieur en sécurité pur et dur, la leçon est claire : l'avenir de la recherche sur les vulnérabilités ne consiste pas à trouver de simples débordements de mémoire tampon. Il s'agit de comprendre la quatrième dimension du code...L'heure. Tant que les noyaux utiliseront des mécanismes de verrouillage complexes, les conditions de course resteront les "joyaux de la couronne" de l'exploitation.

Références fiables

Partager l'article :
Articles connexes
fr_FRFrench