CVE-2026-81001 in Linux
Resumen
por VulDB • 2026-09-12
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
slip: corregir un use-after-free en sl_sync()
La tabla slip_devs[] almacena punteros net_device sin referencia y no toma referencias sobre ellos. sl_sync() y sl_alloc() recorren esa tabla desde slip_open() bajo rtnl_lock(), mientras que una entrada es eliminada por sl_free_netdev(), la cual sl_setup() instala como dev->priv_destructor.
El priv_destructor se llama desde netdev_run_todo(), el cual ejecuta deliberadamente con el semáforo RTNL liberado para poder dormir mientras espera a que el recuento de referencias del dispositivo disminuya:
/* Snapshot list, allow later requests */ list_replace_init(&net_todo_list, &list);
__rtnl_unlock(); ... if (dev->priv_destructor) dev->priv_destructor(dev); /* slip_devs[i] = NULL */
if (dev->needs_free_netdev) free_netdev(dev); ... /* Free network device */ kobject_put(&dev->dev.kobj);
Por lo tanto, rtnl_lock() no serializa slip_open() contra el desmontaje en absoluto. sl_sync() puede cargar slip_devs[i] mientras la entrada sigue publicada y referenciarla después de que netdev_run_todo() haya ejecutado el destructor y liberado el dispositivo:
CPU0 (slip_open) CPU1 (slip_close) unregister_netdev() rtnl_unlock() netdev_run_todo() __rtnl_unlock() rtnl_lock() sl_sync() dev = slip_devs[i]
priv_destructor(dev) slip_devs[i] = NULL
kobject_put(&dev->dev.kobj) /* dev is freed */ sl = netdev_priv(dev) if (sl->tty || sl->leased) /* use-after-free */
BUG: KASAN: use-after-free in sl_sync drivers/net/slip/slip.c:730 [inline]
BUG: KASAN: use-after-free in slip_open+0xef4/0x1210 drivers/net/slip/slip.c:806 Read of size 1 at addr ffff8880712dac71 by task syz-executor.2/6506
CPU: 2 PID: 6506 Comm: syz-executor.2 Not tainted 6.1.134-syzkaller-00260-g0c8fc3469765 #0 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014 Call Trace: sl_sync drivers/net/slip/slip.c:730 [inline]
slip_open+0xef4/0x1210 drivers/net/slip/slip.c:806 tty_ldisc_open+0xa2/0x120 drivers/tty/tty_ldisc.c:433 tty_set_ldisc+0x324/0x720 drivers/tty/tty_ldisc.c:564 tiocsetd drivers/tty/tty_io.c:2428 [inline]
tty_ioctl+0x5f0/0x1530 drivers/tty/tty_io.c:2712
Allocated by task 6502: alloc_netdev_mqs+0x98/0xfe0 net/core/dev.c:10719 sl_alloc drivers/net/slip/slip.c:756 [inline]
slip_open+0x36d/0x1210 drivers/net/slip/slip.c:817 tty_ldisc_open+0xa2/0x120 drivers/tty/tty_ldisc.c:433 tty_set_ldisc+0x324/0x720 drivers/tty/tty_ldisc.c:564
Freed by task 6497: device_release+0xa2/0x240 drivers/base/core.c:2507 kobject_put+0x179/0x280 lib/kobject.c:729 netdev_run_todo+0x6c8/0xef0 net/core/dev.c:10509 slip_close+0x166/0x1c0 drivers/net/slip/slip.c:906 tty_ldisc_close+0x113/0x1a0 drivers/tty/tty_ldisc.c:456 tty_ldisc_kill+0x94/0x160 drivers/tty/tty_ldisc.c:614 tty_ldisc_release+0xe3/0x2b0 drivers/tty/tty_ldisc.c:782 tty_release+0xbcc/0xe70 drivers/tty/tty_io.c:1860
El commit e58c19124189 ("slip: Fix use-after-free Read in slip_open") corrigió una fuente diferente de entradas obsoletas - un dispositivo dejado en slip_devs[] después de que slip_open() lo liberara en la ruta de error del registro - y no aborda esta condición de carrera, por lo que el informe persiste.
Eliminar la entrada desde ndo_uninit en su lugar. unregister_netdevice() llama a ndo_uninit bajo RTNL, antes de que el dispositivo se coloque en netdev_run_todo(), por lo que una entrada que sl_sync() aún puede ver mientras mantiene RTNL pertenece a un dispositivo que no puede ser liberado hasta que RTNL sea liberada. sl_free_netdev() permanece solo para la ruta de error de slip_open(), donde register_netdevice() podría haber fallado antes de ndo_init y ndo_uninit entonces tampoco se llama. Ambos ejecutándose para el mismo dispositivo es inofensivo: ---truncated---
If you want to get best quality of vulnerability data, you may have to visit VulDB.