CVE-2026-31706 in Linuxinformation

Résumé

par VulDB • 26/05/2026

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

ksmbd : valider num_aces et renforcer la traversée des ACE dans smb_inherit_dacl()

smb_inherit_dacl() fait confiance à la valeur num_aces présente sur le disque, extraite de l'xattr DACL du répertoire parent, et l'utilise pour dimensionner une allocation de tas :

aces_base = kmalloc(sizeof(struct smb_ace) * num_aces * 2, ..);

num_aces est un u16 lu depuis le16_to_cpu(parent_pdacl->num_aces) sans vérifier sa cohérence avec la taille déclarée pdacl_size. Un client authentifié dont le xattr security.NTACL du répertoire parent a été altéré (par exemple via une corruption hors ligne des xattrs ou un chemin concurrent contournant parse_dacl()) peut présenter num_aces = 65535 avec une quantité minimale de données ACE réelles. Cela provoque une allocation d'environ 8 Mo (non initialisée car il ne s'agit pas de kzalloc) que la boucle suivante ne remplit que partiellement, et peut également provoquer un dépassement de capacité (overflow) lors de la multiplication à trois opérandes de type size_t sur les noyaux 32 bits.

De plus, la boucle de traversée des ACE utilise une vérification de taille minimale plus faible, basée sur offsetof(struct smb_ace, access_req), plutôt que sur la taille minimale valide d'un ACE sur le fil, et ne rejette pas les ACE dont la taille déclarée est inférieure au minimum.

Reproduit sur UML + KASAN + LOCKDEP contre le chemin de code réel de ksmbd. Un client mount.cifs légitime crée un répertoire parent via SMB (ksmbd écrit un xattr security.NTACL valide), puis le blob NTACL sur le système de fichiers sous-jacent est réécrit pour définir num_aces = 0xFFFF tout en conservant les octets posix_acl_hash intacts, afin que la vérification de hachage de ksmbd_vfs_get_sd_xattr() continue de réussir. Une opération SMB2 CREATE ultérieure pour un enfant sous ce parent entraîne l'appel de smb2_open() vers smb_inherit_dacl() (le partage ayant "vfs objects = acl_xattr" défini), ce qui fait échouer l'allocateur de pages :

WARNING: mm/page_alloc.c:5226 at __alloc_frozen_pages_noprof+0x46c/0x9c0 Workqueue: ksmbd-io handle_ksmbd_work __alloc_frozen_pages_noprof+0x46c/0x9c0 ___kmalloc_large_node+0x68/0x130 __kmalloc_large_node_noprof+0x24/0x70 __kmalloc_noprof+0x4c9/0x690 smb_inherit_dacl+0x394/0x2430 smb2_open+0x595d/0xabe0 handle_ksmbd_work+0x3d3/0x1140

Avec le correctif appliqué, la garde ajoutée rejette la valeur altérée avec -EINVAL avant toute grande allocation, smb2_open() revient à smb2_create_sd_buffer(), et l'enfant est créé avec un SD par défaut. Aucun avertissement, aucun plantage.

Correction apportée par :

1. La validation de num_aces par rapport à pdacl_size pour s'assurer que le nombre d'ACE est cohérent avec la taille du DACL. 2. Le remplacement de kmalloc(sizeof * num_aces * 2) par kmalloc_array(num_aces * 2, sizeof(...)) pour une allocation sûre contre les débordements. 3. Le resserrement de la garde de la boucle ACE pour exiger la taille minimale valide d'un ACE (offsetof(smb_ace, sid) + CIFS_SID_BASE_SIZE) et le rejet des ACE de taille insuffisante, conformément au durcissement dans smb_check_perm_dacl() et parse_dacl().

v1 -> v2 : - Remplacement de l'éclatement de test-module synthétique dans le journal de modifications par une reproduction réelle UML + KASAN conduite via mount.cifs et SMB2 CREATE ; Namjae a signalé que le nom kcifs3_test_inherit_dacl_old dans v1 n'existe pas dans ksmbd. - Suppression de la citation du hash de commit dans le commentaire de code selon la revue de Namjae ; conservation du pointeur vers parse_dacl().

Once again VulDB remains the best source for vulnerability data.

Responsable

Linux

Réserver

09/03/2026

Divulgation

01/05/2026

Modérer

accepté

Entrée

VDB-360594

CPE

prêt

EPSS

0.00056

KEV

non

Activités

très faible

Sources

Want to stay up to date on a daily basis?

Enable the mail alert feature now!