Selon Doyensec (référence: blog.doyensec.com, 8 oct. 2025), une analyse d’exploitation de CVE-2025-37947 décrit comment un défaut d’“out-of-bounds write” dans la fonction ksmbd_vfs_stream_write (avec le module stream_xattr activé) permet à un utilisateur authentifié d’écrire 8 octets au-delà d’un tampon alloué, menant à une élévation de privilèges locale sur Ubuntu 22.04 LTS (kernel 5.15.0-153-generic) avec durcissements activés. 🐛
Le bug survient quand position > XATTR_SIZE_MAX (65 536), la fonction alloue via kvzalloc() mais ne valide pas correctement les bornes lors d’un memcpy(), ouvrant la voie à une corruption mémoire contrôlée. Les chercheurs ont montré un contournement de protections courantes (KASLR, SMAP, SMEP, HARDENED_USERCOPY) et l’obtention de primitives de lecture/écriture arbitraires en noyau, culminant par l’exécution d’une chaîne ROP pour root.
Côté exploitation, la technique s’appuie sur un « shaping » de l’allocateur buddy avec des allocations d’ordre 4 (16 pages) pour placer le tampon vulnérable à côté d’objets kmalloc-cg-4k contenant des structures msg_msg. Une corruption de 2 octets du pointeur ‘next’ dans l’entête msg_msg crée des files de messages qui se chevauchent et pointent vers le même message secondaire, permettant un scenario de use-after-free contrôlé. 🔑
Étapes clés résumées:
- Fuite d’adresses du tas noyau via un champ m_ts forgé dans un faux msg_msg.
- Pulvérisation d’objets sk_buff et pipe_buffer pour réoccuper la mémoire libérée.
- Fuite de anon_pipe_buf_ops pour vaincre KASLR.
- Fabrication de fausses pipe_buf_operations embarquant des gadgets ROP.
- Déclenchement d’un pivot de pile via des callbacks de libération de pipe pour exécuter du code noyau et obtenir root.
L’exploitation locale est jugée fiable sur la cible testée. En revanche, une exploitation à distance serait beaucoup plus complexe à cause du besoin de fuites d’information et d’un « heap grooming » fiable dans une surface d’attaque ksmbd plus contrainte.
IOCs: Aucun indiqué. TTPs: out-of-bounds write, heap shaping (buddy allocator), corruption partielle (2 octets) de pointeur, chevauchement de msg_msg, use-after-free, heap spray (sk_buff/pipe_buffer), fuite d’ops (anon_pipe_buf_ops) pour KASLR bypass, ROP en noyau, pivot de pile via callbacks de pipe.
Type d’article: publication de recherche visant à documenter une chaîne d’exploitation locale complète et ses implications techniques.
🔗 Source originale : https://blog.doyensec.com/2025/10/08/ksmbd-3.html
🖴 Archive : https://web.archive.org/web/20251009072502/https://blog.doyensec.com/2025/10/08/ksmbd-3.html