Vulnerabilidad en Linux (CVE-2026-23192)
Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
14/02/2026
Última modificación:
18/02/2026
Descripción
En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:<br />
<br />
linkwatch: usar __dev_put() en las funciones que llaman para prevenir UAF<br />
<br />
Después de que linkwatch_do_dev() llama a __dev_put() para liberar la referencia de linkwatch, el contador de referencias del dispositivo puede bajar a 1. En este punto, netdev_run_todo() puede continuar (ya que linkwatch_sync_dev() ve una lista vacía y regresa sin bloquear), esperar a que el contador de referencias llegue a 1 a través de netdev_wait_allrefs_any(), y luego liberar el dispositivo a través de kobject_put().<br />
<br />
Esto crea un uso después de liberación cuando __linkwatch_run_queue() intenta llamar a netdev_unlock_ops() en el dispositivo ya liberado.<br />
<br />
Tenga en cuenta que añadir el par netdev_lock_ops()/netdev_unlock_ops() en netdev_run_todo() antes de kobject_put() no funcionaría, porque netdev_lock_ops() es condicional - solo bloquea cuando netdev_need_ops_lock() devuelve verdadero. Si el dispositivo no requiere ops_lock, linkwatch no mantendrá ningún bloqueo, y netdev_run_todo() al adquirir el bloqueo no proporcionará sincronización.<br />
<br />
Solucione esto moviendo __dev_put() de linkwatch_do_dev() a sus funciones que llaman. La referencia del dispositivo se empareja lógicamente con la eliminación del dispositivo de la lista, por lo que es razonable que la función que realizó la eliminación de la lista lo libere. Esto permite colocar __dev_put() después de que todos los accesos al dispositivo estén completos, previniendo UAF.<br />
<br />
El error puede reproducirse añadiendo mdelay(2000) después de linkwatch_do_dev() en __linkwatch_run_queue(), luego ejecutando:<br />
<br />
ip tuntap add mode tun name tun_test<br />
ip link set tun_test up<br />
ip link set tun_test carrier off<br />
ip link set tun_test carrier on<br />
sleep 0.5<br />
ip tuntap del mode tun name tun_test<br />
<br />
Informe KASAN:<br />
<br />
==================================================================<br />
BUG: KASAN: uso después de liberación in netdev_need_ops_lock include/net/netdev_lock.h:33 [inline]<br />
BUG: KASAN: uso después de liberación in netdev_unlock_ops include/net/netdev_lock.h:47 [inline]<br />
BUG: KASAN: uso después de liberación in __linkwatch_run_queue+0x865/0x8a0 net/core/link_watch.c:245<br />
Read of size 8 at addr ffff88804de5c008 by task kworker/u32:10/8123<br />
<br />
CPU: 0 UID: 0 PID: 8123 Comm: kworker/u32:10 Not tainted syzkaller #0 PREEMPT(full)<br />
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014<br />
Workqueue: events_unbound linkwatch_event<br />
Call Trace:<br />
<br />
__dump_stack lib/dump_stack.c:94 [inline]<br />
dump_stack_lvl+0x100/0x190 lib/dump_stack.c:120<br />
print_address_description mm/kasan/report.c:378 [inline]<br />
print_report+0x156/0x4c9 mm/kasan/report.c:482<br />
kasan_report+0xdf/0x1a0 mm/kasan/report.c:595<br />
netdev_need_ops_lock include/net/netdev_lock.h:33 [inline]<br />
netdev_unlock_ops include/net/netdev_lock.h:47 [inline]<br />
__linkwatch_run_queue+0x865/0x8a0 net/core/link_watch.c:245<br />
linkwatch_event+0x8f/0xc0 net/core/link_watch.c:304<br />
process_one_work+0x9c2/0x1840 kernel/workqueue.c:3257<br />
process_scheduled_works kernel/workqueue.c:3340 [inline]<br />
worker_thread+0x5da/0xe40 kernel/workqueue.c:3421<br />
kthread+0x3b3/0x730 kernel/kthread.c:463<br />
ret_from_fork+0x754/0xaf0 arch/x86/kernel/process.c:158<br />
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:246<br />
<br />
==================================================================



