
Prueba de concepto para CVE-2025-39866 (UAF y condición de carrera)
Autor: Byte Reaper
Este POC intenta explotar la vulnerabilidad CVE-2025-39866, que es una falla en sistemas Linux < 6.12.16 debida a la falta de un spinlock para los hilos, lo que provoca una condición de carrera. El primer hilo intenta usar la estructura wb mientras el hilo 2 libera esta estructura, haciendo que el primer hilo maneje un puntero liberado, lo que provoca un pánico del kernel en el sistema. Podemos dividir la idea de explotar la vulnerabilidad en las siguientes etapas:
step 1 : Create thread 1 "main pid"
- get root dentry
- create file txt writeback target
- create strcut inode
- Create object wb
- save pointer wb in wb_old
Step 2:
- Create Thread 2 (kthread) that schedules a work item.
- The work item runs “inode_switch_wbs_work_fn” which updates “inode->i_wb” and schedules the critical free via “wb_put_many”.
step 3 :
- thread 2 : free wb_olb
- thread 1 -> pointer - free object wb (free old)
-> access free address -> crash kernel (segfault)
Linux x86_64
kernel linux < 6.12.16
1 - He created a Makefile and included these commands to compile and build the kernel module:
obj-m += exploit.o
KDIR := /usr/src/linux-headers-6.12.38+kali-amd64
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
# make clean
# make
1 - You will find a file named "exploit.ko," which is a kernel module. To load it into the kernel space, use the insmod tool :
# insmod exploit.ko
El problema principal del fallo es la falta de un "spinlock" para la sincronización de hilos. La solución aquí es:
Primero (Asignación Slab/Slub) , asigne un slab/slub específico para cada hilo, y ningún hilo puede controlar o manipular el tamaño de memoria de otro hilo.
En segundo lugar (Sincronización) , configure la Workqueue para evitar interferencias y condiciones de carrera, donde cada hilo termina su tarea y pasa a otro hilo en lugar de cambiar WB al mismo tiempo o usar la función wb_wakeup_delayed.
En tercer lugar (HLE/RTM) : Activar HLE/RTM en el kernel depende de la arquitectura del procesador, pero si soporta estas dos características, ¿por qué no usarlas en el kernel, por ejemplo, para dirigir el flujo de un programa o, cuando ocurre un error, intentar revertir a otra excepción en lugar de bloquearse mediante un "rollback" con instrucciones como XBEGIN, XABORT, XEN.
MIT