In the Linux kernel, the following vulnerability has been resolved: net: Remove RTNL dance for SIOCBRADDIF and SIOCBRDELIF. SIOCBRDELIF is passed to devioctl() first and later forwarded to brioctlcall(), which causes unnecessary RTNL dance and the splat below [0] under RTNL pressure. Let's say Thread A is trying to detach a device from a bridge and Thread B is trying to remove the bridge. In devioctl(), Thread A bumps the bridge device's refcnt by netdevhold() and releases RTNL because the following brioctlcall() also re-acquires RTNL. In the race window, Thread B could acquire RTNL and try to remove the bridge device. Then, rtnlunlock() by Thread B will release RTNL and wait for netdevput() by Thread A. Thread A, however, must hold RTNL after the unlock in devifsioc(), which may take long under RTNL pressure, resulting in the splat by Thread B. Thread A (SIOCBRDELIF) Thread B (SIOCBRDELBR) ---------------------- ---------------------- sockioctl sockioctl - sock_do_ioctl
- brioctlcall - dev_ioctl
- brioctlstub |- rtnllock | |- devifsioc ' ' |- dev = _devgetbyname(...) |- netdevhold(dev, ...) . / |- rtnlunlock ------. | | |- brioctlcall ---> |- rtnl_lock Race | |
- brioctlstub |- brdelbridge Window | | | |- dev = _devgetbyname(...) | | | May take long | - br_dev_delete(dev, ...) | | | under RTNL pressure |
- unregisternetdevicequeue(dev, ...) | | | | - rtnl_unlock \ | |- rtnl_lock <-'
- netdevruntodo | |- ... - netdev_run_todo |
- rtnlunlock |- _rtnlunlock | |- netdevwaitallrefsany |- netdevput(dev, ...) <----------------' Wait refcnt decrement and log splat below To avoid blocking SIOCBRDELBR unnecessarily, let's not call devioctl() for SIOCBRADDIF and SIOCBRDELIF. In the devioctl() path, we do the following: 1. Copy struct ifreq by getuserifreq in sockdoioctl() 2. Check CAPNETADMIN in devioctl() 3. Call devload() in devioctl() 4. Fetch the master dev from ifr.ifrname in devifsioc() 3. can be done by requestmodule() in brioctlcall(), so we move 1., 2., and 4. to brioctlstub(). Note that 2. is also checked later in adddelif(), but it's better performed before RTNL. SIOCBRADDIF and SIOCBRDELIF have been processed in devioctl() since the pre-git era, and there seems to be no specific reason to process them there. [0]: unregisternetdevice: waiting for wpan3 to become free. Usage count = 2 reftracker: wpan3@ffff8880662d8608 has 1/1 users at _netdevtrackeralloc include/linux/netdevice.h:4282 [inline] netdevhold include/linux/netdevice.h:4311 [inline] devifsioc+0xc6a/0x1160 net/core/devioctl.c:624 devioctl+0x255/0x10c0 net/core/devioctl.c:826 sockdoioctl+0x1ca/0x260 net/socket.c:1213 sockioctl+0x23a/0x6c0 net/socket.c:1318 vfsioctl fs/ioctl.c:51 [inline] _dosysioctl fs/ioctl.c:906 [inline] _sesysioctl fs/ioctl.c:892 [inline] _x64sysioctl+0x1a4/0x210 fs/ioctl.c:892 dosyscallx64 arch/x86/entry/common.c:52 [inline] dosyscall64+0xcb/0x250 arch/x86/entry/common.c:83 entrySYSCALL64after_hwframe+0x77/0x7f
{ "availability": "No subscription required", "binaries": [ { "binary_name": "bpftool", "binary_version": "7.6.0+6.14.0-22.22" }, { "binary_name": "linux-bpf-dev", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-buildinfo-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-buildinfo-6.14.0-22-generic-64k", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-cloud-tools-6.14.0-22", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-cloud-tools-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-cloud-tools-common", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-doc", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-headers-6.14.0-22", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-headers-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-headers-6.14.0-22-generic-64k", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-image-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-image-6.14.0-22-generic-dbgsym", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-image-unsigned-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-image-unsigned-6.14.0-22-generic-64k", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-image-unsigned-6.14.0-22-generic-64k-dbgsym", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-image-unsigned-6.14.0-22-generic-dbgsym", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-lib-rust-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-libc-dev", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-modules-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-modules-6.14.0-22-generic-64k", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-modules-extra-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-modules-ipu6-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-modules-ipu7-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-modules-iwlwifi-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-modules-usbio-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-modules-vision-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-perf", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-source-6.14.0", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-tools-6.14.0-22", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-tools-6.14.0-22-generic", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-tools-6.14.0-22-generic-64k", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-tools-common", "binary_version": "6.14.0-22.22" }, { "binary_name": "linux-tools-host", "binary_version": "6.14.0-22.22" } ] }
{ "availability": "No subscription required", "binaries": [ { "binary_name": "linux-aws-cloud-tools-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-aws-headers-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-aws-tools-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-buildinfo-6.14.0-1007-aws", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-buildinfo-6.14.0-1007-aws-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-cloud-tools-6.14.0-1007-aws", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-cloud-tools-6.14.0-1007-aws-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-headers-6.14.0-1007-aws", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-headers-6.14.0-1007-aws-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-aws", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-aws-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-aws-64k-dbgsym", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-aws-dbgsym", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-6.14.0-1007-aws", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-6.14.0-1007-aws-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-extra-6.14.0-1007-aws", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-extra-6.14.0-1007-aws-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-tools-6.14.0-1007-aws", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-tools-6.14.0-1007-aws-64k", "binary_version": "6.14.0-1007.7" } ] }
{ "availability": "No subscription required", "binaries": [ { "binary_name": "linux-azure-cloud-tools-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-azure-headers-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-azure-tools-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-buildinfo-6.14.0-1007-azure", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-cloud-tools-6.14.0-1007-azure", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-headers-6.14.0-1007-azure", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-azure", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-azure-dbgsym", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-6.14.0-1007-azure", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-extra-6.14.0-1007-azure", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-tools-6.14.0-1007-azure", "binary_version": "6.14.0-1007.7" } ] }
{ "availability": "No subscription required", "binaries": [ { "binary_name": "linux-buildinfo-6.14.0-1008-gcp", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-buildinfo-6.14.0-1008-gcp-64k", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-gcp-headers-6.14.0-1008", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-gcp-tools-6.14.0-1008", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-headers-6.14.0-1008-gcp", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-headers-6.14.0-1008-gcp-64k", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-image-unsigned-6.14.0-1008-gcp", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-image-unsigned-6.14.0-1008-gcp-64k", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-image-unsigned-6.14.0-1008-gcp-64k-dbgsym", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-image-unsigned-6.14.0-1008-gcp-dbgsym", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-modules-6.14.0-1008-gcp", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-modules-6.14.0-1008-gcp-64k", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-modules-extra-6.14.0-1008-gcp", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-modules-extra-6.14.0-1008-gcp-64k", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-tools-6.14.0-1008-gcp", "binary_version": "6.14.0-1008.8" }, { "binary_name": "linux-tools-6.14.0-1008-gcp-64k", "binary_version": "6.14.0-1008.8" } ] }
{ "availability": "No subscription required", "binaries": [ { "binary_name": "linux-buildinfo-6.14.0-1007-oracle", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-buildinfo-6.14.0-1007-oracle-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-headers-6.14.0-1007-oracle", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-headers-6.14.0-1007-oracle-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-oracle", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-oracle-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-oracle-64k-dbgsym", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-unsigned-6.14.0-1007-oracle-dbgsym", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-6.14.0-1007-oracle", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-6.14.0-1007-oracle-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-extra-6.14.0-1007-oracle", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-extra-6.14.0-1007-oracle-64k", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-oracle-headers-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-oracle-tools-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-tools-6.14.0-1007-oracle", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-tools-6.14.0-1007-oracle-64k", "binary_version": "6.14.0-1007.7" } ] }
{ "availability": "No subscription required", "binaries": [ { "binary_name": "linux-buildinfo-6.14.0-1007-raspi", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-headers-6.14.0-1007-raspi", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-6.14.0-1007-raspi", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-image-6.14.0-1007-raspi-dbgsym", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-modules-6.14.0-1007-raspi", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-raspi-headers-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-raspi-tools-6.14.0-1007", "binary_version": "6.14.0-1007.7" }, { "binary_name": "linux-tools-6.14.0-1007-raspi", "binary_version": "6.14.0-1007.7" } ] }
{ "availability": "No subscription required", "binaries": [ { "binary_name": "linux-buildinfo-6.14.0-1004-realtime", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-cloud-tools-6.14.0-1004-realtime", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-headers-6.14.0-1004-realtime", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-image-unsigned-6.14.0-1004-realtime", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-image-unsigned-6.14.0-1004-realtime-dbgsym", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-modules-6.14.0-1004-realtime", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-modules-extra-6.14.0-1004-realtime", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-modules-iwlwifi-6.14.0-1004-realtime", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-realtime-cloud-tools-6.14.0-1004", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-realtime-headers-6.14.0-1004", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-realtime-tools-6.14.0-1004", "binary_version": "6.14.0-1004.4" }, { "binary_name": "linux-tools-6.14.0-1004-realtime", "binary_version": "6.14.0-1004.4" } ] }
{ "availability": "No subscription required", "binaries": [ { "binary_name": "linux-buildinfo-6.14.0-22-generic", "binary_version": "6.14.0-22.22.1" }, { "binary_name": "linux-headers-6.14.0-22-generic", "binary_version": "6.14.0-22.22.1" }, { "binary_name": "linux-image-6.14.0-22-generic", "binary_version": "6.14.0-22.22.1" }, { "binary_name": "linux-image-6.14.0-22-generic-dbgsym", "binary_version": "6.14.0-22.22.1" }, { "binary_name": "linux-modules-6.14.0-22-generic", "binary_version": "6.14.0-22.22.1" }, { "binary_name": "linux-riscv-headers-6.14.0-22", "binary_version": "6.14.0-22.22.1" }, { "binary_name": "linux-riscv-tools-6.14.0-22", "binary_version": "6.14.0-22.22.1" }, { "binary_name": "linux-tools-6.14.0-22-generic", "binary_version": "6.14.0-22.22.1" } ] }