CVE-2021-47634

ubi: Fix race condition between ctrl_cdev_ioctl and ubi_cdev_ioctl

HIGH
7.8
CVSS Score
Published: February 26, 2025 at 01:54 AM UTC
Updated: June 17, 2026 at 04:18 AM UTC
1 product affected across 1 vendorLinux Kernel

Using Linux by Linux?

Get instant alerts when new vulnerabilities affect Linux - before attackers find them.

Real-time alertsTrack your software stackFree plan available
Severity
HIGH7.8
Exploit prediction
EPSS 0.3%
SSVC
No known exploit

Description

In the Linux kernel, the following vulnerability has been resolved: ubi: Fix race condition between ctrl_cdev_ioctl and ubi_cdev_ioctl Hulk Robot reported a KASAN report about use-after-free: ================================================================== BUG: KASAN: use-after-free in __list_del_entry_valid+0x13d/0x160 Read of size 8 at addr ffff888035e37d98 by task ubiattach/1385 [...] Call Trace: klist_dec_and_del+0xa7/0x4a0 klist_put+0xc7/0x1a0 device_del+0x4d4/0xed0 cdev_device_del+0x1a/0x80 ubi_attach_mtd_dev+0x2951/0x34b0 [ubi] ctrl_cdev_ioctl+0x286/0x2f0 [ubi] Allocated by task 1414: device_add+0x60a/0x18b0 cdev_device_add+0x103/0x170 ubi_create_volume+0x1118/0x1a10 [ubi] ubi_cdev_ioctl+0xb7f/0x1ba0 [ubi] Freed by task 1385: cdev_device_del+0x1a/0x80 ubi_remove_volume+0x438/0x6c0 [ubi] ubi_cdev_ioctl+0xbf4/0x1ba0 [ubi] [...] ================================================================== The lock held by ctrl_cdev_ioctl is ubi_devices_mutex, but the lock held by ubi_cdev_ioctl is ubi->device_mutex. Therefore, the two locks can be concurrent. ctrl_cdev_ioctl contains two operations: ubi_attach and ubi_detach. ubi_detach is bug-free because it uses reference counting to prevent concurrency. However, uif_init and uif_close in ubi_attach may race with ubi_cdev_ioctl. uif_init will race with ubi_cdev_ioctl as in the following stack. cpu1 cpu2 cpu3 _______________________|________________________|______________________ ctrl_cdev_ioctl ubi_attach_mtd_dev uif_init ubi_cdev_ioctl ubi_create_volume cdev_device_add ubi_add_volume // sysfs exist kill_volumes ubi_cdev_ioctl ubi_remove_volume cdev_device_del // first free ubi_free_volume cdev_del // double free cdev_device_del And uif_close will race with ubi_cdev_ioctl as in the following stack. cpu1 cpu2 cpu3 _______________________|________________________|______________________ ctrl_cdev_ioctl ubi_attach_mtd_dev uif_init ubi_cdev_ioctl ubi_create_volume cdev_device_add ubi_debugfs_init_dev //error goto out_uif; uif_close kill_volumes ubi_cdev_ioctl ubi_remove_volume cdev_device_del // first free ubi_free_volume // double free The cause of this problem is that commit 714fb87e8bc0 make device "available" before it becomes accessible via sysfs. Therefore, we roll back the modification. We will fix the race condition between ubi device creation and udev by removing ubi_get_device in vol_attribute_show and dev_attribute_show.This avoids accessing uninitialized ubi_devices[ubi_num]. ubi_get_device is used to prevent devices from being deleted during sysfs execution. However, now kernfs ensures that devices will not be deleted before all reference counting are released. The key process is shown in the following stack. device_del device_remove_attrs device_remove_groups sysfs_remove_groups sysfs_remove_group remove_files kernfs_remove_by_name kernfs_remove_by_name_ns __kernfs_remove kernfs_drain

Affected

Our own answer: ranges merged, affected separated from platform-only, with confidence and review flags.

v ≥ 3.10.103v ≥ 3.12.63v ≥ 3.14.77v ≥ 3.16.39v ≥ 3.18.40v ≥ 3.2.84v ≥ 4.1.31v ≥ 4.4.19v ≥ 4.7.23.10.103 ≤ v < 3.113.12.63 ≤ v < 3.133.14.77 ≤ v < 3.153.16.39 ≤ v < 3.173.18.40 ≤ v < 3.193.2.84 ≤ v < 3.34.1.31 ≤ v < 4.24.15 ≤ v < 4.19.2384.20 ≤ v < 5.4.1894.4.19 ≤ v < 4.54.7.2 ≤ v < 4.14.2764.7.2 ≤ v < 4.84.8 ≤ v < 4.14.2764.8 ≤ v < 4.19.2384.8 ≤ v < 5.10.1104.8 ≤ v < 5.15.334.8 ≤ v < 5.16.194.8 ≤ v < 5.17.24.8 ≤ v < 5.184.8 ≤ v < 5.4.1895.11 ≤ v < 5.15.335.16 ≤ v < 5.16.195.17 ≤ v < 5.17.25.5 ≤ v < 5.10.11012f567db822241090b90c5645ea9146f6cf8fa4216820bde3f895d9fcad370415085ba0d1bd4a3.10.1033.12.633.14.773.16.393.18.403.2.8431b0fca8ab9b9786fe6e5027c4a8587b47db5abf4.1.314.4.194.7.24.84056337b1e81a1b137aa562133dc5430cd2fd19e6117840dec60344167038f9511c3770d4c096eaa714fb87e8bc05ff78255afc0dca981e8c5242785ae32d1b98ba29408df87c0ed47877ca0f248eae7bd7d3de27e7e1acce2e276074a498a82e0834663cdf25333b42fb889f086ef65d0734d0dbdc49f4ef3db4c640b32485105554e0bfd16bbde585f6fb0
Vendor states this is fixed in 1a3f1cf87054833242fcd0218de0481cf855f888 (fixed)
Vendor states this is fixed in 3cbf0e392f173ba0ce425968c8374a6aa3e90f2e (fixed)
Vendor states this is fixed in 432b057f8e847ae5a2306515606f8d2defaca178 (fixed)
Vendor states this is fixed in 5f9e9c223e48c264241d2f34d0bfc29e5fcb5c1b (fixed)
Vendor states this is fixed in a8ecee49259f8f78d91ddb329ab2be7e6fd01974 (fixed)
Vendor states this is fixed in c32fe764191b8ae8b128588beb96e3718d9179d8 (fixed)
Vendor states this is fixed in d727fd32cbd1abf3465f607021bc9c746f17b5a8 (fixed)
Vendor states this is fixed in f149b1bd213820363731aa119e5011ca892a2aac (fixed)
Affected range stops below 3.11, so it looks safe — our inference, not a vendor statement
Affected range stops below 3.13, so it looks safe — our inference, not a vendor statement
Affected range stops below 3.15, so it looks safe — our inference, not a vendor statement
Affected range stops below 3.17, so it looks safe — our inference, not a vendor statement
Affected range stops below 3.19, so it looks safe — our inference, not a vendor statement
Affected range stops below 3.3, so it looks safe — our inference, not a vendor statement
Vendor states this is fixed in 4.14.276 (unaffected)
Vendor states this is fixed in 4.19.238 (unaffected)
Affected range stops below 4.2, so it looks safe — our inference, not a vendor statement
Affected range stops below 4.5, so it looks safe — our inference, not a vendor statement
Vendor states this is fixed in 4.8 (unaffected)
Vendor states this is fixed in 5.10.110 (unaffected)
Vendor states this is fixed in 5.15.33 (unaffected)
Vendor states this is fixed in 5.16.19 (unaffected)
Vendor states this is fixed in 5.17.2 (unaffected)
Vendor states this is fixed in 5.18 (unaffected)
Vendor states this is fixed in 5.4.189 (unaffected)

References (8)

Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/1a3f1cf87054833242fcd0218de0481cf855f888
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/3cbf0e392f173ba0ce425968c8374a6aa3e90f2e
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/432b057f8e847ae5a2306515606f8d2defaca178
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/5f9e9c223e48c264241d2f34d0bfc29e5fcb5c1b
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/a8ecee49259f8f78d91ddb329ab2be7e6fd01974
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/c32fe764191b8ae8b128588beb96e3718d9179d8
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/d727fd32cbd1abf3465f607021bc9c746f17b5a8
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/f149b1bd213820363731aa119e5011ca892a2aac

SSVC — Action Prioritization

SSVCNo known exploitNot automatableTotal impact

SSVC signals action urgency (what to patch first), separate from CVSS which measures severity.

CVSS

7.8HIGHCISA-ADP
Attack Vector
LOCAL
Complexity
LOW
Privileges
LOW
User Interaction
NONE
Scope
UNCHANGED
Confidentiality
HIGH
Integrity
HIGH
Availability
HIGH
Vector?

Quick Info

StatusANALYZED
CWE
CWE-416

Get alerted

Stop reading CVE feeds looking for your own stack

Track the products you run and VulnTracker tells you when a new CVE affects them — with what is known about fixing it, and nothing about the rest.

Free plan, no card