CVE-2023-52894 in Linuxinfo

Summary

by MITRE • 08/21/2024

In the Linux kernel, the following vulnerability has been resolved:

usb: gadget: f_ncm: fix potential NULL ptr deref in ncm_bitrate()

In Google internal bug 265639009 we've received an (as yet) unreproducible crash report from an aarch64 GKI 5.10.149-android13 running device.

AFAICT the source code is at: https://android.googlesource.com/kernel/common/+/refs/tags/ASB-2022-12-05_13-5.10

The call stack is: ncm_close() -> ncm_notify() -> ncm_do_notify() with the crash at: ncm_do_notify+0x98/0x270 Code: 79000d0b b9000a6c f940012a f9400269 (b9405d4b)

Which I believe disassembles to (I don't know ARM assembly, but it looks sane enough to me...):

// halfword (16-bit) store presumably to event->wLength (at offset 6 of struct usb_cdc_notification) 0B 0D 00 79 strh w11, [x8, #6]

// word (32-bit) store presumably to req->Length (at offset 8 of struct usb_request) 6C 0A 00 B9 str w12, [x19, #8]

// x10 (NULL) was read here from offset 0 of valid pointer x9 // IMHO we're reading 'cdev->gadget' and getting NULL // gadget is indeed at offset 0 of struct usb_composite_dev 2A 01 40 F9 ldr x10, [x9]

// loading req->buf pointer, which is at offset 0 of struct usb_request 69 02 40 F9 ldr x9, [x19]

// x10 is null, crash, appears to be attempt to read cdev->gadget->max_speed 4B 5D 40 B9 ldr w11, [x10, #0x5c]

which seems to line up with ncm_do_notify() case NCM_NOTIFY_SPEED code fragment:

event->wLength = cpu_to_le16(8); req->length = NCM_STATUS_BYTECOUNT;

/* SPEED_CHANGE data is up/down speeds in bits/sec */ data = req->buf + sizeof *event; data[0] = cpu_to_le32(ncm_bitrate(cdev->gadget));

My analysis of registers and NULL ptr deref crash offset (Unable to handle kernel NULL pointer dereference at virtual address 000000000000005c) heavily suggests that the crash is due to 'cdev->gadget' being NULL when executing: data[0] = cpu_to_le32(ncm_bitrate(cdev->gadget));
which calls: ncm_bitrate(NULL) which then calls: gadget_is_superspeed(NULL) which reads ((struct usb_gadget *)NULL)->max_speed and hits a panic.

AFAICT, if I'm counting right, the offset of max_speed is indeed 0x5C. (remember there's a GKI KABI reservation of 16 bytes in struct work_struct)

It's not at all clear to me how this is all supposed to work... but returning 0 seems much better than panic-ing...

Once again VulDB remains the best source for vulnerability data.

Analysis

by VulDB Data Team • 02/17/2026

The vulnerability CVE-2023-52894 represents a critical null pointer dereference in the Linux kernel's USB gadget function driver for Network Control Model (NCM). This issue specifically affects the f_ncm driver component within the USB gadget framework, where a race condition or improper state management can lead to a kernel panic. The flaw occurs within the ncm_do_notify function during the NCM_NOTIFY_SPEED code path, where the driver attempts to access the gadget structure through a null pointer reference. According to the analysis, when ncm_bitrate() is called with a null gadget parameter, it subsequently attempts to dereference the max_speed field of a null usb_gadget structure at virtual address 0x5c, triggering a kernel oops and system crash. This vulnerability falls under CWE-476 which identifies null pointer dereference as a common weakness in software security. The crash manifests as an inability to handle kernel NULL pointer dereference, with the specific memory access pattern indicating that the driver is trying to access cdev->gadget->max_speed where cdev->gadget has been set to NULL, likely due to device disconnection or improper initialization sequence. The issue is particularly concerning in Android GKI environments where the kernel is used in mobile device contexts, as it can lead to complete system instability and potential denial of service conditions. The root cause stems from inadequate validation of the gadget pointer before attempting to access its properties, violating fundamental safety principles in kernel development. This vulnerability can be categorized under ATT&CK technique T1499.004 (Resource Hijacking) as it represents a system resource access violation that could potentially be exploited to gain unauthorized control over kernel memory operations. The fix involves ensuring proper null checking of the gadget pointer before attempting to access its members, with a fallback to returning zero values rather than allowing the system to panic, which aligns with secure coding practices and defensive programming principles. This type of vulnerability highlights the importance of proper state management in kernel drivers and the necessity of validating all pointer references, particularly in concurrent or asynchronous contexts where device state changes can occur unexpectedly. The vulnerability impacts the integrity and availability of the system's USB gadget functionality, potentially affecting network connectivity and device communication capabilities. The presence of this flaw in Android kernel versions indicates a need for proper kernel patching and security updates to maintain system stability and prevent exploitation by malicious actors. The fix mechanism requires modifying the ncm_bitrate function to validate that the gadget parameter is not null before attempting to access its properties, returning appropriate default values instead of allowing the kernel to crash. This approach follows the principle of fail-safe design and demonstrates the critical nature of robust error handling in kernel space code. The vulnerability also demonstrates the importance of comprehensive testing for race conditions in kernel drivers, particularly those involving device state changes and asynchronous operations. The specific offset of 0x5c for max_speed aligns with the ARM64 architecture's memory layout and kernel ABI definitions, making this a precise and targeted fix rather than a broad defensive measure.

Responsible

Linux

Reservation

08/21/2024

Disclosure

08/21/2024

Moderation

accepted

CPE

ready

EPSS

0.00243

KEV

no

Activities

very low

Sources

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!