CVE-2026-89762 in Linuxinformation

Résumé

par VulDB • 12/09/2026

Dans le noyau Linux, la vulnérabilité suivante a été corrigée :

apparmor : correction d'un UAF (Use-After-Free) sur `cred` causé par begin_current_label_crit_section()

La fonction begin_current_label_crit_section() d'AppArmor est une fonction redoutable appelée depuis de nombreux hooks LSM (notamment ceux liés au VFS/sockets), qui vérifie si l'étiquette référencée par les identifiants (`creds`) actuels porte le FLAG_STALE, et dans ce cas, tente d'utiliser aa_replace_current_label() pour remplacer les `creds` par une version mise à jour utilisant une nouvelle étiquette.

Le premier problème avec cette approche est qu'elle conduirait directement à un UAF (Use-After-Free) de la structure `cred` si quoi que ce soit dans le noyau prenait un pointeur vers les identifiants actuels et y accédait après l'appel d'un hook de sécurité qui remplace les `creds`, comme suit : ```c const struct cred *cred = current_cred(); alloc_file_pseudo(...); uid_t uid = cred->euid; ```

Je ne sais pas si quelque chose dans le noyau fait réellement cela, mais je pense qu'il est très surprenant que ce pattern puisse entraîner un UAF.

Le deuxième problème survient lorsque aa_replace_current_label() s'exécute avec des identifiants remplacés (overridden credentials). aa_replace_current_label() abandonne si `current_cred() != current_real_cred()` (mirroring la vérification dans proc_pid_attr_write()), mais cette vérification ne peut pas réellement détecter de manière fiable les identifiants remplacés, car les identifiants remplacés peuvent être identiques aux identifiants objectifs.

Ainsi, dans le scénario approximatif suivant, les choses tournent mal :

1. La tâche commence avec <creds A> (à la fois comme identifiants objectifs et subjectifs), avec un refcount=2 2. La tâche acquiert une référence supplémentaire sur <creds A> pour le remplacement 3. La tâche appelle override_creds(<creds A>), qui renvoie un pointeur vers les anciens identifiants subjectifs (<creds A>) 4. La tâche entre dans le hook LSM AppArmor 5. AppArmor vérifie que les identifiants objectifs/subjectifs sont égaux 6. AppArmor remplace les deux pointeurs `cred` par <creds B> et libère 2 références sur <creds A> 7. La tâche quitte le hook LSM AppArmor 8. La tâche appelle revert_creds(<creds A>) 9. Maintenant, task->cred est <creds A> tandis que task->real_cred est <creds B>, mais la structure task_struct détient logiquement deux références vers <creds B> 10. Une autre tâche libère la référence supplémentaire sur <creds A> qui était utilisée pour le remplacement, le refcount chute à 0 11. Maintenant, task->real_cred pointe vers des identifiants déjà libérés

À ce stade, tout accès à current_cred() entraînera un UAF (Use-After-Free).

J'ai un cas de test où j'exécute aa-disable sur un profil pendant qu'un processus utilisant ce profil est bloqué sur splice() depuis un fichier FUSE en mode pass-through vers un pipe plein ; après la mise à jour du profil, le pipe devient vide, splice() reprend, les identifiants se désynchronisent et un appel système getuid() ultérieur entraîne une erreur UAF signalée par KASAN.

Pour corriger cela, au lieu de remplacer directement les `creds`, il faut le faire via task_work qui s'exécutera à la fin de l'appel système en cours. (Le moment auquel le remplacement des identifiants se produit n'a pas d'impact sur la correction ; c'est juste une optimisation de performance pour éviter de toucher inutilement le refcount de la nouvelle étiquette.)

Notez qu'AppArmor effectue toujours des remplacements directs de `creds` dans le hook LSM sb_pivotroot après ce changement, et que les remplacements directs de `creds` peuvent encore se produire dans les callbacks VFS ->write() via proc_pid_attr_write().

Il y a deux options pour gérer aa_dup_task_ctx() : soit réinitialiser explicitement new->label_replacement_pending après la copie complète de aa_task_ctx, soit passer à une copie manuelle des membres. Je passe à une copie manuelle des membres car cela devrait rendre les bogues plus évidents.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Responsable

Linux

Réserver

11/09/2026

Divulgation

11/09/2026

Modérer

accepté

Entrée

VDB-402606

CPE

prêt

EPSS

0.00000

KEV

non

Activités

très faible

Sources

Want to stay up to date on a daily basis?

Enable the mail alert feature now!