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-debug-develUpgrade kernel-modulesUpgrade kernel-rt-coreUpgrade python3-perfUpgrade kernel-coreUpgrade kernel-rt-debug-modules-extraUpgrade kernel-abi-stablelistsUpgrade kernel-rt-debug-develUpgrade kernel-rt-debug-modulesUpgrade kernel-debugUpgrade perfUpgrade kernel-headersUpgrade kernel-zfcpdump-develUpgrade kernel-zfcpdumpUpgrade kernel-rt-debug-kvmUpgrade kernel-docUpgrade kernel-zfcpdump-modules-extraUpgrade kernel-modules-extraUpgrade kernel-debug-coreUpgrade kernel-rtUpgrade kernel-cross-headersUpgrade kernel-develUpgrade kernel-rt-debug-coreUpgrade kernel-rt-debugUpgrade kernel-tools-libs-develUpgrade kernel-rt-develUpgrade kernel-rt-modules-extraUpgrade kernel-zfcpdump-modulesUpgrade kernel-rt-modulesUpgrade kernel-debug-modulesUpgrade kernelUpgrade kernel-zfcpdump-coreUpgrade kernel-debug-modules-extraUpgrade bpftoolUpgrade kernel-rt-kvmUpgrade kernel-tools-libsUpgrade kernel-tools | Sep 26, 2024 | Jun 20, 2024 |
| Amazon Linux Ami 2 | — | Upgrade kernelUpgrade kernel-debuginfo-common-x86_64Upgrade bpftool-debuginfoUpgrade python-perf-debuginfoUpgrade kernel-debuginfoUpgrade python-perfUpgrade kernel-headersUpgrade kernel-toolsUpgrade kernel-tools-develUpgrade perf-debuginfoUpgrade kernel-develUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-livepatch-4.14.268-205.500Upgrade perfUpgrade kernel-tools-debuginfoUpgrade bpftoolUpgrade kernel-livepatch-5.10.96-90.460 | 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 kernel-toolsUpgrade python3-perf | Oct 8, 2024 | Jun 20, 2024 |
| Huawei Euleros 2_0_sp9 | — | Upgrade kernel-toolsUpgrade kernel-tools-libsUpgrade python3-perfUpgrade kernel | Oct 8, 2024 | Jun 20, 2024 |
| Oracle_linux | — | Upgrade kernel-uekUpgrade kernel | Oct 16, 2024 | Jun 20, 2024 |
| Redhat_linux | — | Upgrade kernel-rtUpgrade kernelNo solution exists | Sep 25, 2024 | Jun 20, 2024 |
| Rocky_linux | — | Upgrade kernel-rt-debug-coreUpgrade kernel-headersUpgrade kernel-modules-extraUpgrade kernel-rt-debuginfo-common-x86_64Upgrade kernel-debugUpgrade kernel-rt-kvmUpgrade kernel-rt-coreUpgrade python3-perfUpgrade kernel-rt-debug-modules-extraUpgrade python3-perf-debuginfoUpgrade bpftool-debuginfoUpgrade kernel-rt-debug-debuginfoUpgrade kernel-debug-debuginfoUpgrade kernel-debug-modulesUpgrade kernel-modulesUpgrade kernel-debug-develUpgrade kernel-debug-coreUpgrade kernel-rt-debug-kvmUpgrade kernel-rt-develUpgrade kernel-rt-debug-develUpgrade kernel-tools-debuginfoUpgrade kernel-develUpgrade bpftoolUpgrade kernel-tools-libsUpgrade kernel-coreUpgrade kernel-debuginfoUpgrade kernel-rt-debug-modulesUpgrade kernel-rt-debugUpgrade perf-debuginfoUpgrade kernel-rtUpgrade kernel-tools-libs-develUpgrade perfUpgrade kernel-rt-modules-extraUpgrade kernel-rt-modulesUpgrade kernelUpgrade kernel-cross-headersUpgrade kernel-rt-debuginfoUpgrade kernel-debug-modules-extraUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-tools | Oct 2, 2024 | Jun 20, 2024 |
| Suse | — | Upgrade kernel-macrosUpgrade kernel-source-rtUpgrade kernel-rt-vdsoUpgrade kernel-syms-rtUpgrade kernel-rt-livepatch-develUpgrade kernel-azure-baseUpgrade gfs2-kmp-rtUpgrade kernel-default-develUpgrade kernel-default-manUpgrade kernel-azure-vdsoUpgrade ocfs2-kmp-rtUpgrade kernel-rt_debug-develUpgrade kselftests-kmp-rtUpgrade kernel-rtUpgrade kernel-docsUpgrade kernel-default-extraUpgrade cluster-md-kmp-azureUpgrade kernel-azureUpgrade kernel-obs-buildUpgrade kernel-rt_debug-vdsoUpgrade dlm-kmp-azureUpgrade kernel-azure-livepatch-develUpgrade kernel-syms-azureUpgrade kernel-azure-develUpgrade kernel-rt-optionalUpgrade kselftests-kmp-azureUpgrade kernel-devel-azureUpgrade reiserfs-kmp-rtUpgrade kernel-rt-extraUpgrade kernel-rt_debugUpgrade kernel-azure-extraUpgrade gfs2-kmp-azureUpgrade kernel-defaultUpgrade kernel-rt-develUpgrade cluster-md-kmp-rtUpgrade kernel-64kbUpgrade dlm-kmp-rtUpgrade kernel-64kb-develUpgrade kernel-default-baseUpgrade kernel-devel-rtUpgrade kernel-preempt-develUpgrade ocfs2-kmp-azureUpgrade kernel-symsUpgrade reiserfs-kmp-defaultUpgrade kernel-zfcpdumpUpgrade kernel-source-azureUpgrade kernel-rt_debug-livepatch-develUpgrade kernel-preemptUpgrade kernel-rt-livepatchUpgrade kernel-sourceUpgrade reiserfs-kmp-azureUpgrade kernel-azure-optionalUpgrade kernel-devel | Aug 9, 2024 | Jun 20, 2024 |
| Ubuntu | — | Upgrade linux-raspiUpgrade linux-bluefieldUpgrade linux-aws-5.4Upgrade linux-raspi-5.4Upgrade linuxUpgrade linux-ibm-5.4Upgrade linux-awsUpgrade linux-oracle-5.4Upgrade linux-gkeopUpgrade linux-iotUpgrade linux-azure-fde-5.15Upgrade linux-hwe-5.4Upgrade linux-azure-4.15Upgrade linux-aws-hweUpgrade linux-gcpUpgrade linux-fipsUpgrade linux-azureUpgrade linux-ibmUpgrade linux-gcp-5.4Upgrade linux-hweUpgrade linux-gcp-fipsUpgrade linux-oracleUpgrade linux-azure-fipsUpgrade linux-kvmUpgrade linux-gcp-4.15Upgrade linux-azure-5.4Upgrade linux-aws-fips | 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