In the Linux kernel, the following vulnerability has been resolved:
USB: core: Fix hang in usb_kill_urb by adding memory barriers
The syzbot fuzzer has identified a bug in which processes hang waiting for usb_kill_urb() to return. It turns out the issue is not unlinking the URB; that works just fine. Rather, the problem arises when the wakeup notification that the URB has completed is not received.
The reason is memory-access ordering on SMP systems. In outline form, usb_kill_urb() and __usb_hcd_giveback_urb() operating concurrently on different CPUs perform the following actions:
CPU 0 CPU 1 ---------------------------- --------------------------------- usb_kill_urb(): __usb_hcd_giveback_urb(): ... ... atomic_inc(&urb->reject); atomic_dec(&urb->use_count); ... ... wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0); if (atomic_read(&urb->reject)) wake_up(&usb_kill_urb_queue);
Confining your attention to urb->reject and urb->use_count, you can see that the overall pattern of accesses on CPU 0 is:
write urb->reject, then read urb->use_count;
whereas the overall pattern of accesses on CPU 1 is:
write urb->use_count, then read urb->reject.
This pattern is referred to in memory-model circles as SB (for "Store Buffering"), and it is well known that without suitable enforcement of the desired order of accesses -- in the form of memory barriers -- it is entirely possible for one or both CPUs to execute their reads ahead of their writes. The end result will be that sometimes CPU 0 sees the old un-decremented value of urb->use_count while CPU 1 sees the old un-incremented value of urb->reject. Consequently CPU 0 ends up on the wait queue and never gets woken up, leading to the observed hang in usb_kill_urb().
The same pattern of accesses occurs in usb_poison_urb() and the failure pathway of usb_hcd_submit_urb().
The problem is fixed by adding suitable memory barriers. To provide proper memory-access ordering in the SB pattern, a full barrier is required on both CPUs. The atomic_inc() and atomic_dec() accesses themselves don't provide any memory ordering, but since they are present, we can use the optimized smp_mb__after_atomic() memory barrier in the various routines to obtain the desired effect.
This patch adds the necessary memory barriers.
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Alma_linux | — | Upgrade kernel-cross-headersUpgrade kernel-tools-libs-develUpgrade bpftoolUpgrade kernel-rt-modulesUpgrade kernel-develUpgrade kernel-rt-modules-extraUpgrade kernel-toolsUpgrade kernelUpgrade kernel-rtUpgrade kernel-tools-libsUpgrade kernel-rt-debug-coreUpgrade kernel-zfcpdump-coreUpgrade kernel-zfcpdump-modulesUpgrade kernel-rt-debugUpgrade kernel-debug-modulesUpgrade kernel-debug-modules-extraUpgrade kernel-rt-develUpgrade kernel-rt-kvmUpgrade kernel-debugUpgrade kernel-rt-debug-modulesUpgrade kernel-zfcpdumpUpgrade kernel-zfcpdump-develUpgrade kernel-rt-coreUpgrade kernel-abi-stablelistsUpgrade kernel-modules-extraUpgrade kernel-rt-debug-modules-extraUpgrade kernel-debug-coreUpgrade kernel-docUpgrade python3-perfUpgrade kernel-zfcpdump-modules-extraUpgrade kernel-rt-debug-develUpgrade kernel-debug-develUpgrade kernel-modulesUpgrade perfUpgrade kernel-rt-debug-kvmUpgrade kernel-headersUpgrade kernel-core | Sep 26, 2024 | Jun 20, 2024 |
| Amazon Linux Ami 2 | — | Upgrade perfUpgrade kernel-develUpgrade kernel-livepatch-5.10.96-90.460Upgrade kernel-toolsUpgrade perf-debuginfoUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-tools-develUpgrade kernel-livepatch-4.14.268-205.500Upgrade kernel-tools-debuginfoUpgrade bpftoolUpgrade kernelUpgrade python-perfUpgrade kernel-debuginfoUpgrade python-perf-debuginfoUpgrade bpftool-debuginfoUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-headers | Aug 2, 2024 | Jun 20, 2024 |
| Debian | — | Upgrade linux | Jul 30, 2024 | Jun 20, 2024 |
| Huawei Euleros 2_0_sp10 | — | Upgrade kernel-tools-libsUpgrade kernel-abi-stablelistsUpgrade kernelUpgrade python3-perfUpgrade kernel-tools | Oct 8, 2024 | Jun 20, 2024 |
| Huawei Euleros 2_0_sp9 | — | Upgrade kernel-tools-libsUpgrade kernel-toolsUpgrade kernelUpgrade python3-perf | Oct 8, 2024 | Jun 20, 2024 |
| Oracle_linux | — | Upgrade kernelUpgrade kernel-uek | Oct 16, 2024 | Jun 20, 2024 |
| Redhat_linux | — | No solution existsUpgrade kernelUpgrade kernel-rt | Sep 25, 2024 | Jun 20, 2024 |
| Rocky_linux | — | Upgrade kernel-rt-develUpgrade kernel-coreUpgrade kernel-headersUpgrade bpftool-debuginfoUpgrade kernel-rt-debug-coreUpgrade kernel-tools-debuginfoUpgrade kernel-rt-debugUpgrade kernel-rt-debug-debuginfoUpgrade kernel-rt-debuginfo-common-x86_64Upgrade python3-perf-debuginfoUpgrade kernel-debug-debuginfoUpgrade kernel-debuginfoUpgrade kernel-rt-debug-develUpgrade kernel-tools-libsUpgrade kernel-rt-debug-kvmUpgrade kernel-debug-modulesUpgrade kernel-modulesUpgrade kernel-rt-debug-modulesUpgrade kernel-debug-develUpgrade bpftoolUpgrade kernel-debugUpgrade kernel-develUpgrade python3-perfUpgrade kernel-modules-extraUpgrade kernel-rt-debug-modules-extraUpgrade kernel-rt-coreUpgrade kernel-rt-kvmUpgrade kernel-debug-coreUpgrade kernel-toolsUpgrade kernel-rt-modules-extraUpgrade kernel-rt-modulesUpgrade kernel-debug-modules-extraUpgrade kernel-rtUpgrade kernel-tools-libs-develUpgrade kernel-cross-headersUpgrade perfUpgrade kernelUpgrade kernel-rt-debuginfoUpgrade perf-debuginfoUpgrade kernel-debuginfo-common-x86_64 | Oct 2, 2024 | Jun 20, 2024 |
| Suse | — | Upgrade dlm-kmp-rtUpgrade kernel-64kbUpgrade kernel-develUpgrade kernel-rt-develUpgrade kernel-zfcpdumpUpgrade kernel-sourceUpgrade kernel-azure-optionalUpgrade kernel-defaultUpgrade kernel-rt-livepatchUpgrade reiserfs-kmp-azureUpgrade kernel-preemptUpgrade kernel-symsUpgrade ocfs2-kmp-azureUpgrade kernel-default-baseUpgrade kernel-devel-rtUpgrade gfs2-kmp-azureUpgrade kernel-source-azureUpgrade kernel-64kb-develUpgrade reiserfs-kmp-defaultUpgrade kernel-preempt-develUpgrade cluster-md-kmp-rtUpgrade kernel-rt_debug-livepatch-develUpgrade kernel-devel-azureUpgrade cluster-md-kmp-azureUpgrade dlm-kmp-azureUpgrade kernel-macrosUpgrade kernel-rt-vdsoUpgrade ocfs2-kmp-rtUpgrade kselftests-kmp-rtUpgrade kernel-rt-optionalUpgrade kernel-syms-azureUpgrade kernel-obs-buildUpgrade kernel-docsUpgrade gfs2-kmp-rtUpgrade kernel-default-extraUpgrade reiserfs-kmp-rtUpgrade kselftests-kmp-azureUpgrade kernel-source-rtUpgrade kernel-azure-baseUpgrade kernel-syms-rtUpgrade kernel-rt-livepatch-develUpgrade kernel-azure-vdsoUpgrade kernel-rt_debug-vdsoUpgrade kernel-rt-extraUpgrade kernel-rt_debugUpgrade kernel-rt_debug-develUpgrade kernel-default-manUpgrade kernel-default-develUpgrade kernel-azure-livepatch-develUpgrade kernel-azure-extraUpgrade kernel-azureUpgrade kernel-azure-develUpgrade kernel-rt | Aug 9, 2024 | Jun 20, 2024 |
| Ubuntu | — | Upgrade linuxUpgrade linux-awsUpgrade linux-oracle-5.4Upgrade linux-raspi-5.4Upgrade linux-bluefieldUpgrade linux-raspiUpgrade linux-aws-5.4Upgrade linux-ibm-5.4Upgrade linux-azure-fipsUpgrade linux-gcp-5.4Upgrade linux-aws-fipsUpgrade linux-hweUpgrade linux-oracleUpgrade linux-azure-fde-5.15Upgrade linux-fipsUpgrade linux-azure-5.4Upgrade linux-azureUpgrade linux-azure-4.15Upgrade linux-gcp-4.15Upgrade linux-gcp-fipsUpgrade linux-kvmUpgrade linux-hwe-5.4Upgrade linux-ibmUpgrade linux-gcpUpgrade linux-iotUpgrade linux-aws-hweUpgrade linux-gkeop | Nov 19, 2024 | Jun 20, 2024 |
| Vmware Photon_os | — | Use 'tdnf update' to upgrade all packages to the latest version. | May 27, 2026 | Jun 20, 2024 |
With curated Threat Intelligence, you can see which vulnerabilities truly put you at risk, prioritize what matters most, and act before attackers do.
Explore Intelligence Hub