ZeroHour

CVE-2026-81001

niche

Use-After-Free in Linux Kernel SLIP Driver (sl_sync race in slip_open)

CVSS 3.1
7.8 high
EPSS
Published
()
Modified
AI analysis

The Linux kernel's SLIP (Serial Line Internet Protocol) driver, drivers/net/slip/slip.c, contains a use-after-free in sl_sync(): the global slip_devs[] table stores bare net_device pointers with no reference held, and rtnl_lock() does not serialize slip_open() against device teardown because priv_destructor (sl_free_netdev) runs from netdev_run_todo() with the RTNL semaphore deliberately released. A local unprivileged user who can attach the SLIP line discipline to a TTY (via the TIOCSETD ioctl path) can race slip_close() on another SLIP device, causing sl_sync() to dereference a freed net_device and read freed kernel memory (confirmed by KASAN). Successful exploitation of this memory-safety flaw can lead to kernel memory corruption with high confidentiality, integrity, and availability impact (CVSS 7.8), typically a local privilege escalation or system crash, on any system where the SLIP module is loaded or loadable. The bug was found by syzkaller, and no public proof-of-concept or exploitation in the wild is known; it is not in the CISA KEV catalog.

What to do: Upgrade to a kernel containing the fix for this sl_sync() use-after-free as soon as your distribution ships it. If the SLIP driver is not needed, blacklist the module (e.g., an entry in /etc/modprobe.d with 'blacklist slip' or modprobe.blacklist=slip on the kernel command line) and verify with 'lsmod | grep slip' that it is not loaded. Also check udev/TTY device permissions to ensure unprivileged users cannot attach line disciplines to serial devices.

Affected
Linux kernel (SLIP driver, drivers/net/slip/slip.c)Kernels containing the vulnerable sl_sync()/slip_devs[] code prior to the fixing commit; the data does not specify an exact version range, and the report also n
Estimated exposure
nichelikely thousands of legacy/embedded serial-connected systems at most; no reliable public count — SLIP is a legacy protocol whose module (slip.ko) is not loaded by default on mainstream distributions, and exploitation additionally requires local access to a TTY device, so the realistically exposed population is small even though Linux…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

In the Linux kernel, the following vulnerability has been resolved: slip: fix use-after-free in sl_sync() slip_devs[] stores bare net_device pointers and takes no reference on them. sl_sync() and sl_alloc() walk that table from slip_open() under rtnl_lock(), while an entry is dropped by sl_free_netdev(), which sl_setup() installs as dev->priv_destructor. priv_destructor is called from netdev_run_todo(), which deliberately runs with the RTNL semaphore released so that it can sleep while waiting for the device refcount to drop: /* 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); So rtnl_lock() does not serialise slip_open() against the teardown at all. sl_sync() can load slip_devs[i] while the entry is still published and dereference it after netdev_run_todo() has run the destructor and released the device: 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 Commit e58c19124189 ("slip: Fix use-after-free Read in slip_open") fixed a different source of stale entries - a device left in slip_devs[] after slip_open() freed it on the registration error path - and does not address this race, which is why the report survives it. Drop the entry from ndo_uninit instead. unregister_netdevice() calls ndo_uninit under RTNL, before the device is queued to netdev_run_todo(), so an entry that sl_sync() can still see while holding RTNL belongs to a device that cannot be freed until RTNL is dropped. sl_free_netdev() stays only for the slip_open() error path, where register_netdevice() may have failed before ndo_init and ndo_uninit is then not called either. Both running for the same device is harmless: the ---truncated---

Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

In the news

No ingested article mentions this CVE yet.