Présentation de GhostLock

GhostLock (CVE-2026-43499) est une vulnérabilité du noyau Linux découverte par VEGA, présente dans toutes les distributions majeures depuis 2011. Elle permet à un attaquant local non privilégié d'obtenir un pointeur kernel pendouillant vers la mémoire de la pile du noyau avec des appels système de threading réguliers, d'écrire un pointeur vers une adresse presque arbitraire et de pirater une table de fonctions pour obtenir un contrôle du flux d'exécution et éventuellement accéder à la racine.

Fonctionnement de la vulnérabilité

La vulnérabilité a été introduite avec la refonte de rtmutex dans le commit 8161239a8bcc et est restée non touchée pendant environ quinze ans jusqu'à la correction d'avril 2026 dans le commit 3bfdc63936dd. La plage affectée va de v2.6.39-rc1 à v7.1-rc1, avec CONFIG_FUTEX_PI=y comme seul requis et sans besoin de capacités ou d'espaces de noms d'utilisateur.

remove_waiter() dans kernel/locking/rtmutex.c nettoie current->pi_blocked_on

Ceci est correct sur le chemin lent normal, où current est la tâche qui possède le waiter. Cependant, cela est incorrect sur le chemin proxy. rt_mutex_start_proxy_lock() met en file d'attente, et en cas d'erreur, annule un rt_mutex_waiter au nom d'une autre tâche, donc current est le requeueur et non le waiter.

Exploitation de la vulnérabilité

La vulnérabilité peut être exploitée en créant un cycle de dépendance PI à partir de trois mots futex et de trois threads. Le sequenceur prend f_pi_chain, puis bloque dans FUTEX_WAIT_REQUEUE_PI(f_wait -> f_pi_target). Son rt_mutex_waiter est maintenant sur sa pile. Le propriétaire prend f_pi_target, puis bloque sur f_pi_chain, que le sequenceur détient. Le thread principal appelle FUTEX_CMP_REQUEUE_PI(f_wait -> f_pi_target). La réorganisation tente de proxy le sequenceur sur f_pi_target.

La primitive initiale de GhostLock nous permet de déclencher, à volonté, un accès au noyau qui référence un rt_mutex_waiter. Nous pouvons pulvériser des octets contrôlés sur cette pile et forger le rt_mutex_waiter directement. Selon la forme que nous forgeons, cet accès nous donne plusieurs primitives, notamment écrire un pointeur vers une adresse arbitraire (mais contrainte) et écrire 8 octets de zéro vers une adresse arbitraire (mais contrainte).

Conclusion

GhostLock est une vulnérabilité grave qui a existé dans le noyau Linux pendant plus de 15 ans. Elle peut être exploitée pour obtenir un accès racine et échapper aux conteneurs. Il est essentiel de mettre à jour vers la dernière version LTS pour corriger cette vulnérabilité.