CVE-2022-48760
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
20/06/2024
Last modified:
17/09/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
USB: core: Fix hang in usb_kill_urb by adding memory barriers<br />
<br />
The syzbot fuzzer has identified a bug in which processes hang waiting<br />
for usb_kill_urb() to return. It turns out the issue is not unlinking<br />
the URB; that works just fine. Rather, the problem arises when the<br />
wakeup notification that the URB has completed is not received.<br />
<br />
The reason is memory-access ordering on SMP systems. In outline form,<br />
usb_kill_urb() and __usb_hcd_giveback_urb() operating concurrently on<br />
different CPUs perform the following actions:<br />
<br />
CPU 0 CPU 1<br />
---------------------------- ---------------------------------<br />
usb_kill_urb(): __usb_hcd_giveback_urb():<br />
... ...<br />
atomic_inc(&urb->reject); atomic_dec(&urb->use_count);<br />
... ...<br />
wait_event(usb_kill_urb_queue,<br />
atomic_read(&urb->use_count) == 0);<br />
if (atomic_read(&urb->reject))<br />
wake_up(&usb_kill_urb_queue);<br />
<br />
Confining your attention to urb->reject and urb->use_count, you can<br />
see that the overall pattern of accesses on CPU 0 is:<br />
<br />
write urb->reject, then read urb->use_count;<br />
<br />
whereas the overall pattern of accesses on CPU 1 is:<br />
<br />
write urb->use_count, then read urb->reject.<br />
<br />
This pattern is referred to in memory-model circles as SB (for "Store<br />
Buffering"), and it is well known that without suitable enforcement of<br />
the desired order of accesses -- in the form of memory barriers -- it<br />
is entirely possible for one or both CPUs to execute their reads ahead<br />
of their writes. The end result will be that sometimes CPU 0 sees the<br />
old un-decremented value of urb->use_count while CPU 1 sees the old<br />
un-incremented value of urb->reject. Consequently CPU 0 ends up on<br />
the wait queue and never gets woken up, leading to the observed hang<br />
in usb_kill_urb().<br />
<br />
The same pattern of accesses occurs in usb_poison_urb() and the<br />
failure pathway of usb_hcd_submit_urb().<br />
<br />
The problem is fixed by adding suitable memory barriers. To provide<br />
proper memory-access ordering in the SB pattern, a full barrier is<br />
required on both CPUs. The atomic_inc() and atomic_dec() accesses<br />
themselves don&#39;t provide any memory ordering, but since they are<br />
present, we can use the optimized smp_mb__after_atomic() memory<br />
barrier in the various routines to obtain the desired effect.<br />
<br />
This patch adds the necessary memory barriers.
Impact
Base Score 3.x
7.10
Severity 3.x
HIGH
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.4.302 (excluding) | |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.5 (including) | 4.9.300 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.10 (including) | 4.14.265 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.15 (including) | 4.19.228 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.20 (including) | 5.4.176 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (including) | 5.10.96 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (including) | 5.15.19 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (including) | 5.16.5 (excluding) |
| cpe:2.3:o:linux:linux_kernel:5.17:rc1:*:*:*:*:*:* |
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/26fbe9772b8c459687930511444ce443011f86bf
- https://git.kernel.org/stable/c/546ba238535d925254e0b3f12012a5c55801e2f3
- https://git.kernel.org/stable/c/5904dfd3ddaff3bf4a41c3baf0a8e8f31ed4599b
- https://git.kernel.org/stable/c/5f138ef224dffd15d5e5c5b095859719e0038427
- https://git.kernel.org/stable/c/9340226388c66a7e090ebb00e91ed64a753b6c26
- https://git.kernel.org/stable/c/9c61fce322ac2ef7fecf025285353570d60e41d6
- https://git.kernel.org/stable/c/b50f5ca60475710bbc9a3af32fbfc17b1e69c2f0
- https://git.kernel.org/stable/c/c9a18f7c5b071dce5e6939568829d40994866ab0
- https://git.kernel.org/stable/c/e3b131e30e612ff0e32de6c1cb4f69f89db29193
- https://git.kernel.org/stable/c/26fbe9772b8c459687930511444ce443011f86bf
- https://git.kernel.org/stable/c/546ba238535d925254e0b3f12012a5c55801e2f3
- https://git.kernel.org/stable/c/5904dfd3ddaff3bf4a41c3baf0a8e8f31ed4599b
- https://git.kernel.org/stable/c/5f138ef224dffd15d5e5c5b095859719e0038427
- https://git.kernel.org/stable/c/9340226388c66a7e090ebb00e91ed64a753b6c26
- https://git.kernel.org/stable/c/9c61fce322ac2ef7fecf025285353570d60e41d6
- https://git.kernel.org/stable/c/b50f5ca60475710bbc9a3af32fbfc17b1e69c2f0
- https://git.kernel.org/stable/c/c9a18f7c5b071dce5e6939568829d40994866ab0
- https://git.kernel.org/stable/c/e3b131e30e612ff0e32de6c1cb4f69f89db29193



