CVE-2023-52894
Severity CVSS v4.0:
Pending analysis
Type:
CWE-476
NULL Pointer Dereference
Publication date:
21/08/2024
Last modified:
11/09/2024
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
usb: gadget: f_ncm: fix potential NULL ptr deref in ncm_bitrate()<br />
<br />
In Google internal bug 265639009 we&#39;ve received an (as yet) unreproducible<br />
crash report from an aarch64 GKI 5.10.149-android13 running device.<br />
<br />
AFAICT the source code is at:<br />
https://android.googlesource.com/kernel/common/+/refs/tags/ASB-2022-12-05_13-5.10<br />
<br />
The call stack is:<br />
ncm_close() -> ncm_notify() -> ncm_do_notify()<br />
with the crash at:<br />
ncm_do_notify+0x98/0x270<br />
Code: 79000d0b b9000a6c f940012a f9400269 (b9405d4b)<br />
<br />
Which I believe disassembles to (I don&#39;t know ARM assembly, but it looks sane enough to me...):<br />
<br />
// halfword (16-bit) store presumably to event->wLength (at offset 6 of struct usb_cdc_notification)<br />
0B 0D 00 79 strh w11, [x8, #6]<br />
<br />
// word (32-bit) store presumably to req->Length (at offset 8 of struct usb_request)<br />
6C 0A 00 B9 str w12, [x19, #8]<br />
<br />
// x10 (NULL) was read here from offset 0 of valid pointer x9<br />
// IMHO we&#39;re reading &#39;cdev->gadget&#39; and getting NULL<br />
// gadget is indeed at offset 0 of struct usb_composite_dev<br />
2A 01 40 F9 ldr x10, [x9]<br />
<br />
// loading req->buf pointer, which is at offset 0 of struct usb_request<br />
69 02 40 F9 ldr x9, [x19]<br />
<br />
// x10 is null, crash, appears to be attempt to read cdev->gadget->max_speed<br />
4B 5D 40 B9 ldr w11, [x10, #0x5c]<br />
<br />
which seems to line up with ncm_do_notify() case NCM_NOTIFY_SPEED code fragment:<br />
<br />
event->wLength = cpu_to_le16(8);<br />
req->length = NCM_STATUS_BYTECOUNT;<br />
<br />
/* SPEED_CHANGE data is up/down speeds in bits/sec */<br />
data = req->buf + sizeof *event;<br />
data[0] = cpu_to_le32(ncm_bitrate(cdev->gadget));<br />
<br />
My analysis of registers and NULL ptr deref crash offset<br />
(Unable to handle kernel NULL pointer dereference at virtual address 000000000000005c)<br />
heavily suggests that the crash is due to &#39;cdev->gadget&#39; being NULL when executing:<br />
data[0] = cpu_to_le32(ncm_bitrate(cdev->gadget));<br />
which calls:<br />
ncm_bitrate(NULL)<br />
which then calls:<br />
gadget_is_superspeed(NULL)<br />
which reads<br />
((struct usb_gadget *)NULL)->max_speed<br />
and hits a panic.<br />
<br />
AFAICT, if I&#39;m counting right, the offset of max_speed is indeed 0x5C.<br />
(remember there&#39;s a GKI KABI reservation of 16 bytes in struct work_struct)<br />
<br />
It&#39;s not at all clear to me how this is all supposed to work...<br />
but returning 0 seems much better than panic-ing...
Impact
Base Score 3.x
5.50
Severity 3.x
MEDIUM
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.14.304 (excluding) | |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.15 (including) | 4.19.271 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.20 (including) | 5.4.230 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (including) | 5.10.165 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (including) | 5.15.90 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (including) | 6.1.8 (excluding) |
| cpe:2.3:o:linux:linux_kernel:6.2:rc1:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:6.2:rc2:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:6.2:rc3:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:6.2:rc4:*:*:*:*:*:* |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/09e4507ec8ef2d44da6ba4092b8ee2d81f216497
- https://git.kernel.org/stable/c/63d161f29cd39c050e8873aa36e0c9fc013bb763
- https://git.kernel.org/stable/c/a21da7f7aae618c785f7e4a275d43c06dc8412b6
- https://git.kernel.org/stable/c/a69c8dfb85b44be9cc223be07d35cc3a9baefbea
- https://git.kernel.org/stable/c/c6ec929595c7443250b2a4faea988c62019d5cd2
- https://git.kernel.org/stable/c/e92c70059178da751e5af7de02384b7dfadb5ec7
- https://git.kernel.org/stable/c/fef6b29671b66dfb71f17e337c1ad14b5a2cedae



