Skip to main content

CVE-2021-46933: Vulnerability in Linux Linux

Medium
VulnerabilityCVE-2021-46933cvecve-2021-46933
Published: Tue Feb 27 2024 (02/27/2024, 09:44:00 UTC)
Source: CVE
Vendor/Project: Linux
Product: Linux

Description

In the Linux kernel, the following vulnerability has been resolved: usb: gadget: f_fs: Clear ffs_eventfd in ffs_data_clear. ffs_data_clear is indirectly called from both ffs_fs_kill_sb and ffs_ep0_release, so it ends up being called twice when userland closes ep0 and then unmounts f_fs. If userland provided an eventfd along with function's USB descriptors, it ends up calling eventfd_ctx_put as many times, causing a refcount underflow. NULL-ify ffs_eventfd to prevent these extraneous eventfd_ctx_put calls. Also, set epfiles to NULL right after de-allocating it, for readability. For completeness, ffs_data_clear actually ends up being called thrice, the last call being before the whole ffs structure gets freed, so when this specific sequence happens there is a second underflow happening (but not being reported): /sys/kernel/debug/tracing# modprobe usb_f_fs /sys/kernel/debug/tracing# echo ffs_data_clear > set_ftrace_filter /sys/kernel/debug/tracing# echo function > current_tracer /sys/kernel/debug/tracing# echo 1 > tracing_on (setup gadget, run and kill function userland process, teardown gadget) /sys/kernel/debug/tracing# echo 0 > tracing_on /sys/kernel/debug/tracing# cat trace smartcard-openp-436 [000] ..... 1946.208786: ffs_data_clear <-ffs_data_closed smartcard-openp-431 [000] ..... 1946.279147: ffs_data_clear <-ffs_data_closed smartcard-openp-431 [000] .n... 1946.905512: ffs_data_clear <-ffs_data_put Warning output corresponding to above trace: [ 1946.284139] WARNING: CPU: 0 PID: 431 at lib/refcount.c:28 refcount_warn_saturate+0x110/0x15c [ 1946.293094] refcount_t: underflow; use-after-free. [ 1946.298164] Modules linked in: usb_f_ncm(E) u_ether(E) usb_f_fs(E) hci_uart(E) btqca(E) btrtl(E) btbcm(E) btintel(E) bluetooth(E) nls_ascii(E) nls_cp437(E) vfat(E) fat(E) bcm2835_v4l2(CE) bcm2835_mmal_vchiq(CE) videobuf2_vmalloc(E) videobuf2_memops(E) sha512_generic(E) videobuf2_v4l2(E) sha512_arm(E) videobuf2_common(E) videodev(E) cpufreq_dt(E) snd_bcm2835(CE) brcmfmac(E) mc(E) vc4(E) ctr(E) brcmutil(E) snd_soc_core(E) snd_pcm_dmaengine(E) drbg(E) snd_pcm(E) snd_timer(E) snd(E) soundcore(E) drm_kms_helper(E) cec(E) ansi_cprng(E) rc_core(E) syscopyarea(E) raspberrypi_cpufreq(E) sysfillrect(E) sysimgblt(E) cfg80211(E) max17040_battery(OE) raspberrypi_hwmon(E) fb_sys_fops(E) regmap_i2c(E) ecdh_generic(E) rfkill(E) ecc(E) bcm2835_rng(E) rng_core(E) vchiq(CE) leds_gpio(E) libcomposite(E) fuse(E) configfs(E) ip_tables(E) x_tables(E) autofs4(E) ext4(E) crc16(E) mbcache(E) jbd2(E) crc32c_generic(E) sdhci_iproc(E) sdhci_pltfm(E) sdhci(E) [ 1946.399633] CPU: 0 PID: 431 Comm: smartcard-openp Tainted: G C OE 5.15.0-1-rpi #1 Debian 5.15.3-1 [ 1946.417950] Hardware name: BCM2835 [ 1946.425442] Backtrace: [ 1946.432048] [<c08d60a0>] (dump_backtrace) from [<c08d62ec>] (show_stack+0x20/0x24) [ 1946.448226] r7:00000009 r6:0000001c r5:c04a948c r4:c0a64e2c [ 1946.458412] [<c08d62cc>] (show_stack) from [<c08d9ae0>] (dump_stack+0x28/0x30) [ 1946.470380] [<c08d9ab8>] (dump_stack) from [<c0123500>] (__warn+0xe8/0x154) [ 1946.482067] r5:c04a948c r4:c0a71dc8 [ 1946.490184] [<c0123418>] (__warn) from [<c08d6948>] (warn_slowpath_fmt+0xa0/0xe4) [ 1946.506758] r7:00000009 r6:0000001c r5:c0a71dc8 r4:c0a71e04 [ 1946.517070] [<c08d68ac>] (warn_slowpath_fmt) from [<c04a948c>] (refcount_warn_saturate+0x110/0x15c) [ 1946.535309] r8:c0100224 r7:c0dfcb84 r6:ffffffff r5:c3b84c00 r4:c24a17c0 [ 1946.546708] [<c04a937c>] (refcount_warn_saturate) from [<c0380134>] (eventfd_ctx_put+0x48/0x74) [ 1946.564476] [<c03800ec>] (eventfd_ctx_put) from [<bf5464e8>] (ffs_data_clear+0xd0/0x118 [usb_f_fs]) [ 1946.582664] r5:c3b84c00 r4:c2695b00 [ 1946.590668] [<bf546418>] (ffs_data_clear [usb_f_fs]) from [<bf547cc0>] (ffs_data_closed+0x9c/0x150 [usb_f_fs]) [ 1946.609608] r5:bf54d014 r4:c2695b00 [ 1946.617522] [<bf547c24>] (ffs_data_closed [usb_f_fs]) from [<bf547da0>] (ffs_fs_kill_sb+0x2c/0x30 [usb_f_fs]) [ 1946.636217] r7:c0dfcb ---truncated---

AI-Powered Analysis

AILast updated: 06/26/2025, 09:38:11 UTC

Technical Analysis

CVE-2021-46933 is a vulnerability identified in the Linux kernel's USB gadget subsystem, specifically within the FunctionFS (ffs) driver. The issue arises due to improper handling of reference counting for eventfd objects when the ffs_data_clear function is called multiple times during the lifecycle of a USB function. FunctionFS allows user-space processes to implement USB functions by providing USB descriptors and handling USB requests. In this vulnerability, ffs_data_clear is invoked indirectly from both ffs_fs_kill_sb and ffs_ep0_release, resulting in it being called twice when userland closes the endpoint zero (ep0) and subsequently unmounts the FunctionFS filesystem. If userland provides an eventfd along with the USB descriptors, the kernel calls eventfd_ctx_put multiple times, causing a reference count underflow. This underflow leads to a use-after-free condition, which can cause kernel memory corruption and potentially lead to system instability or crashes. The vulnerability is further complicated by the fact that ffs_data_clear is called a third time before the entire ffs structure is freed, causing a second underflow that is not reported. The issue was observed on Linux kernel version 5.15.0-1-rpi and involves kernel modules such as usb_f_fs. The CVSS v3.1 base score is 5.5 (medium severity), with the vector indicating local attack vector (AV:L), low attack complexity (AC:L), requiring low privileges (PR:L), no user interaction (UI:N), unchanged scope (S:U), no confidentiality or integrity impact (C:N/I:N), but high impact on availability (A:H). This means the vulnerability can be exploited by a local attacker with limited privileges to cause denial of service by crashing the kernel or causing instability. No known exploits are reported in the wild at this time. The vulnerability is classified under CWE-476 (NULL Pointer Dereference), reflecting the improper handling of reference counts leading to use-after-free conditions. The fix involves clearing the ffs_eventfd pointer after releasing it to prevent extraneous eventfd_ctx_put calls and setting epfiles to NULL after deallocation for clarity and safety.

Potential Impact

For European organizations, this vulnerability primarily poses a risk of denial-of-service (DoS) attacks on Linux systems utilizing the FunctionFS USB gadget driver. Such systems are often embedded devices, IoT gateways, or specialized hardware running Linux kernels that support USB gadget functionality. The impact includes potential system crashes or kernel panics triggered by local attackers or malicious user-space processes, which could disrupt critical services or device operations. While the vulnerability does not directly compromise confidentiality or integrity, availability impacts can be significant, especially in industrial control systems, telecommunications infrastructure, or embedded devices prevalent in sectors like manufacturing, healthcare, and critical infrastructure. Organizations relying on Linux-based embedded systems with USB gadget support may experience operational downtime, increased maintenance costs, and potential cascading effects if these devices serve as gateways or control points. Given the local attack vector, exploitation requires access to the affected system, which may limit remote exploitation but does not eliminate insider threats or attacks via compromised user accounts. The absence of known exploits in the wild reduces immediate risk but does not preclude future exploitation attempts, especially as the vulnerability is publicly disclosed.

Mitigation Recommendations

1. Apply Kernel Updates: European organizations should promptly update Linux kernels to versions where this vulnerability is patched. Monitor vendor advisories and apply security patches specifically addressing CVE-2021-46933. 2. Restrict Access to USB Gadget Interfaces: Limit user-space access to FunctionFS endpoints and USB gadget configurations to trusted users and processes only. Employ strict access controls and SELinux/AppArmor policies to prevent unauthorized manipulation. 3. Disable Unused USB Gadget Drivers: If FunctionFS or usb_f_fs modules are not required, disable or blacklist them to reduce the attack surface. 4. Monitor for Anomalous Behavior: Implement monitoring for kernel warnings or logs indicating refcount underflows or related kernel warnings, which may signal exploitation attempts or system instability. 5. Harden Local User Privileges: Enforce least privilege principles for local users to prevent unprivileged users from triggering the vulnerability. 6. Conduct Security Audits on Embedded Devices: For organizations deploying embedded Linux devices, audit device configurations and update firmware/kernel images to incorporate the fix. 7. Use Kernel Runtime Security Tools: Employ tools like Kernel Address Sanitizer (KASAN) or other runtime detection mechanisms in testing environments to detect similar memory corruption issues proactively. These measures go beyond generic advice by focusing on controlling access to the vulnerable subsystem, proactive monitoring, and targeted patch management in embedded and specialized Linux environments.

Need more detailed analysis?Get Pro

Technical Details

Data Version
5.1
Assigner Short Name
Linux
Date Reserved
2024-02-25T13:45:52.720Z
Cisa Enriched
true
Cvss Version
3.1
State
PUBLISHED

Threat ID: 682d9835c4522896dcbea755

Added to database: 5/21/2025, 9:09:09 AM

Last enriched: 6/26/2025, 9:38:11 AM

Last updated: 8/18/2025, 11:35:29 PM

Views: 10

Actions

PRO

Updates to AI analysis are available only with a Pro account. Contact root@offseq.com for access.

Please log in to the Console to use AI analysis features.

Need enhanced features?

Contact root@offseq.com for Pro access with improved analysis and higher rate limits.

Latest Threats