In the Linux kernel, the following vulnerability has been resolved:
HID: logitech-hidpp: Fix kernel crash on receiver USB disconnect
hidpp_connect_event() has *four* time-of-check vs time-of-use (TOCTOU) races when it races with itself.
hidpp_connect_event() primarily runs from a workqueue but it also runs on probe() and if a "device-connected" packet is received by the hw when the thread running hidpp_connect_event() from probe() is waiting on the hw, then a second thread running hidpp_connect_event() will be started from the workqueue.
This opens the following races (note the below code is simplified):
1. Retrieving + printing the protocol (harmless race):
if (!hidpp->protocol_major) { hidpp_root_get_protocol_version() hidpp->protocol_major = response.rap.params[0]; }
We can actually see this race hit in the dmesg in the abrt output attached to rhbz#2227968:
[ 3064.624215] logitech-hidpp-device 0003:046D:4071.0049: HID++ 4.5 device connected. [ 3064.658184] logitech-hidpp-device 0003:046D:4071.0049: HID++ 4.5 device connected.
Testing with extra logging added has shown that after this the 2 threads take turn grabbing the hw access mutex (send_mutex) so they ping-pong through all the other TOCTOU cases managing to hit all of them:
2. Updating the name to the HIDPP name (harmless race):
if (hidpp->name == hdev->name) { ... hidpp->name = new_name; }
3. Initializing the power_supply class for the battery (problematic!):
hidpp_initialize_battery() { if (hidpp->battery.ps) return 0;
probe_battery(); /* Blocks, threads take turns executing this */
hidpp->battery.desc.properties = devm_kmemdup(dev, hidpp_battery_props, cnt, GFP_KERNEL);
hidpp->battery.ps = devm_power_supply_register(&hidpp->hid_dev->dev, &hidpp->battery.desc, cfg); }
4. Creating delayed input_device (potentially problematic):
if (hidpp->delayed_input) return;
hidpp->delayed_input = hidpp_allocate_input(hdev);
The really big problem here is 3. Hitting the race leads to the following sequence:
hidpp->battery.desc.properties = devm_kmemdup(dev, hidpp_battery_props, cnt, GFP_KERNEL);
hidpp->battery.ps = devm_power_supply_register(&hidpp->hid_dev->dev, &hidpp->battery.desc, cfg);
...
hidpp->battery.desc.properties = devm_kmemdup(dev, hidpp_battery_props, cnt, GFP_KERNEL);
hidpp->battery.ps = devm_power_supply_register(&hidpp->hid_dev->dev, &hidpp->battery.desc, cfg);
So now we have registered 2 power supplies for the same battery, which looks a bit weird from userspace's pov but this is not even the really big problem.
Notice how:
1. This is all devm-maganaged 2. The hidpp->battery.desc struct is shared between the 2 power supplies 3. hidpp->battery.desc.properties points to the result from the second devm_kmemdup()
This causes a use after free scenario on USB disconnect of the receiver: 1. The last registered power supply class device gets unregistered 2. The memory from the last devm_kmemdup() call gets freed, hidpp->battery.desc.properties now points to freed memory 3. The first registered power supply class device gets unregistered, this involves sending a remove uevent to userspace which invokes power_supply_uevent() to fill the uevent data 4. power_supply_uevent() uses hidpp->battery.desc.properties which now points to freed memory leading to backtraces like this one:
Sep 22 20:01:35 eric kernel: BUG: unable to handle page fault for address: ffffb2140e017f08 ... Sep 22 20:01:35 eric kernel: Workqueue: usb_hub_wq hub_event Sep 22 20:01:35 eric kernel: RIP: 0010:power_supply_uevent+0xee/0x1d0 ... Sep 22 20:01:35 eric kernel: ? asm_exc_page_fault+0x26/0x30 Sep 22 20:01:35 eric kernel: ? power_supply_uevent+0xee/0x1d0 Sep 22 20:01:35 eric kernel: ? power_supply_uevent+0x10d/0x1d0 Sep 22 20:01:35 eric kernel: dev_uevent+0x10f/0x2d0 Sep 22 20:01:35 eric kernel: kobject_uevent_env+0x291/0x680 Sep 22 20:01:35 eric kernel: ---truncated---
CVSS Details
- CVSS 3.1 Base Score: 8.8
- CVSS 3.1 Vector: (CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Alma_linux | — | Upgrade kernel-cross-headersUpgrade python3-perfUpgrade kernelUpgrade kernel-rt-debug-coreUpgrade kernel-zfcpdump-coreUpgrade kernel-tools-libs-develUpgrade kernel-rtUpgrade kernel-abi-stablelistsUpgrade bpftoolUpgrade kernel-toolsUpgrade kernel-rt-kvmUpgrade perfUpgrade kernel-rt-modules-extraUpgrade kernel-zfcpdump-modulesUpgrade kernel-docUpgrade kernel-coreUpgrade kernel-zfcpdump-develUpgrade kernel-modulesUpgrade kernel-rt-debug-develUpgrade kernel-headersUpgrade kernel-zfcpdump-modules-extraUpgrade kernel-debug-modules-extraUpgrade kernel-rt-debugUpgrade kernel-debugUpgrade kernel-debug-coreUpgrade kernel-rt-modulesUpgrade kernel-rt-develUpgrade kernel-zfcpdumpUpgrade kernel-modules-extraUpgrade kernel-tools-libsUpgrade kernel-rt-debug-kvmUpgrade kernel-debug-develUpgrade kernel-rt-debug-modules-extraUpgrade kernel-rt-debug-modulesUpgrade kernel-develUpgrade kernel-debug-modulesUpgrade kernel-rt-core | Sep 26, 2024 | Feb 29, 2024 |
| Amazon Linux Ami 2 | — | Upgrade perfUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-toolsUpgrade perf-debuginfoUpgrade kernel-develUpgrade bpftoolUpgrade python-perfUpgrade kernel-livepatch-4.14.328-248.540Upgrade bpftool-debuginfoUpgrade kernel-debuginfo-common-x86_64Upgrade python-perf-debuginfoUpgrade kernel-tools-debuginfoUpgrade kernel-headersUpgrade kernel-debuginfoUpgrade kernelUpgrade kernel-tools-develUpgrade kernel-livepatch-5.10.199-190.747 | Aug 2, 2024 | Feb 29, 2024 |
| Debian | — | Upgrade linux | Jul 30, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp10 | — | Upgrade kernelUpgrade kernel-tools-libsUpgrade kernel-toolsUpgrade python3-perfUpgrade kernel-abi-stablelists | May 13, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp11 | — | Upgrade kernel-toolsUpgrade bpftoolUpgrade kernel-tools-libsUpgrade kernel-abi-stablelistsUpgrade python3-perfUpgrade kernel | Jun 26, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp12 | — | Upgrade kernel-toolsUpgrade python3-perfUpgrade kernel-tools-libsUpgrade kernelUpgrade kernel-abi-stablelistsUpgrade bpftool | Oct 8, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp8 | — | Upgrade kernel-develUpgrade kernel-tools-libsUpgrade bpftoolUpgrade python-perfUpgrade kernelUpgrade kernel-headersUpgrade perfUpgrade python3-perfUpgrade kernel-tools | Jul 23, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp9 | — | Upgrade python3-perfUpgrade kernelUpgrade kernel-tools-libsUpgrade kernel-tools | Jul 17, 2024 | Feb 29, 2024 |
| Oracle_linux | — | Upgrade kernel | Oct 16, 2024 | Feb 29, 2024 |
| Redhat_linux | — | Upgrade kernelUpgrade kernel-rtNo solution exists | Sep 25, 2024 | Feb 29, 2024 |
| Rocky_linux | — | Upgrade kernel-rt-coreUpgrade kernel-rt-debugUpgrade perfUpgrade kernel-rt-kvmUpgrade kernel-coreUpgrade kernel-debugUpgrade kernel-debug-develUpgrade perf-debuginfoUpgrade kernel-modules-extraUpgrade bpftoolUpgrade kernel-debuginfoUpgrade kernel-debug-coreUpgrade kernel-rt-develUpgrade kernel-rt-debug-modules-extraUpgrade python3-perf-debuginfoUpgrade python3-perfUpgrade kernel-develUpgrade kernel-rt-modulesUpgrade kernel-tools-debuginfoUpgrade kernel-rt-debug-develUpgrade kernel-headersUpgrade kernel-debug-modulesUpgrade kernel-rt-debug-kvmUpgrade bpftool-debuginfoUpgrade kernel-rt-debug-modulesUpgrade kernelUpgrade kernel-rt-debuginfo-common-x86_64Upgrade kernel-tools-libs-develUpgrade kernel-toolsUpgrade kernel-rtUpgrade kernel-rt-debug-debuginfoUpgrade kernel-cross-headersUpgrade kernel-rt-modules-extraUpgrade kernel-rt-debug-coreUpgrade kernel-debug-debuginfoUpgrade kernel-tools-libsUpgrade kernel-rt-debuginfoUpgrade kernel-debug-modules-extraUpgrade kernel-modulesUpgrade kernel-debuginfo-common-x86_64 | Oct 2, 2024 | Feb 29, 2024 |
| Suse | — | Upgrade kernel-rt-livepatch-develUpgrade dlm-kmp-azureUpgrade kernel-default-vdsoUpgrade cluster-md-kmp-azureUpgrade kernel-devel-azureUpgrade dtb-amlogicUpgrade kernel-kvmsmall-develUpgrade kernel-rt_debug-vdsoUpgrade kernel-macrosUpgrade dtb-qcomUpgrade kselftests-kmp-64kbUpgrade kernel-rtUpgrade kernel-rt-optionalUpgrade kernel-rt-vdsoUpgrade dtb-nvidiaUpgrade kernel-source-rtUpgrade dtb-apmUpgrade kernel-obs-qaUpgrade kernel-syms-azureUpgrade ocfs2-kmp-64kbUpgrade kernel-default-manUpgrade kernel-debug-livepatch-develUpgrade kernel-azureUpgrade kernel-debug-vdsoUpgrade kernel-kvmsmallUpgrade kernel-obs-buildUpgrade gfs2-kmp-rtUpgrade kernel-sourceUpgrade kernel-rt-extraUpgrade reiserfs-kmp-64kbUpgrade kselftests-kmp-azureUpgrade kernel-azure-baseUpgrade kernel-default-extraUpgrade dtb-lgUpgrade kernel-zfcpdumpUpgrade kernel-default-base-rebuildUpgrade kernel-docs-htmlUpgrade dtb-broadcomUpgrade reiserfs-kmp-azureUpgrade kernel-azure-livepatch-develUpgrade kernel-azure-vdsoUpgrade dtb-exynosUpgrade kernel-kvmsmall-vdsoUpgrade cluster-md-kmp-defaultUpgrade kernel-preemptUpgrade dtb-rockchipUpgrade kselftests-kmp-defaultUpgrade ocfs2-kmp-rtUpgrade kernel-source-azureUpgrade dlm-kmp-64kbUpgrade kernel-azure-develUpgrade kernel-syms-rtUpgrade kernel-64kbUpgrade kernel-default-optionalUpgrade kernel-preempt-develUpgrade dtb-freescaleUpgrade dtb-hisiliconUpgrade cluster-md-kmp-64kbUpgrade dtb-allwinnerUpgrade kernel-azure-extraUpgrade reiserfs-kmp-rtUpgrade kernel-default-develUpgrade gfs2-kmp-64kbUpgrade dtb-caviumUpgrade dtb-alteraUpgrade kernel-develUpgrade dtb-amdUpgrade kernel-rt-develUpgrade kernel-default-livepatch-develUpgrade kernel-64kb-develUpgrade ocfs2-kmp-defaultUpgrade kernel-defaultUpgrade dtb-renesasUpgrade kernel-default-baseUpgrade dtb-armUpgrade kernel-debugUpgrade kernel-rt-livepatchUpgrade dtb-xilinxUpgrade dtb-sprdUpgrade kernel-rt_debugUpgrade kselftests-kmp-rtUpgrade dlm-kmp-defaultUpgrade dtb-amazonUpgrade dtb-appleUpgrade kernel-devel-rtUpgrade gfs2-kmp-defaultUpgrade dtb-marvellUpgrade kernel-64kb-optionalUpgrade dlm-kmp-rtUpgrade dtb-mediatekUpgrade kernel-docsUpgrade gfs2-kmp-azureUpgrade kernel-default-livepatchUpgrade dtb-socionextUpgrade kernel-source-vanillaUpgrade cluster-md-kmp-rtUpgrade kernel-64kb-livepatch-develUpgrade kernel-debug-develUpgrade kernel-symsUpgrade kernel-azure-optionalUpgrade ocfs2-kmp-azureUpgrade kernel-kvmsmall-livepatch-develUpgrade kernel-rt_debug-livepatch-develUpgrade kernel-rt_debug-develUpgrade reiserfs-kmp-defaultUpgrade kernel-64kb-extra | Mar 13, 2024 | Feb 29, 2024 |
| Ubuntu | — | Upgrade linux-intel-iot-realtimeUpgrade linux-realtimeUpgrade linux-hwe-5.15Upgrade linux-oracleUpgrade linux-aws-fipsUpgrade linux-kvmUpgrade linux-azureUpgrade linux-azure-5.4Upgrade linux-gcp-fipsUpgrade linux-oracle-5.15Upgrade linux-hwe-5.4Upgrade linux-ibmUpgrade linux-nvidiaUpgrade linux-gcp-5.4Upgrade linux-azure-5.15Upgrade linux-azure-fipsUpgrade linux-azure-fde-5.15Upgrade linux-nvidia-6.5Upgrade linux-gkeopUpgrade linux-intel-iotgUpgrade linux-riscv-5.15Upgrade linux-gkeop-5.15Upgrade linux-fipsUpgrade linux-gcp-5.15Upgrade linux-lowlatencyUpgrade linux-xilinx-zynqmpUpgrade linux-nvidia-tegra-igxUpgrade linux-intel-iotg-5.15Upgrade linux-raspiUpgrade linux-nvidia-tegraUpgrade linux-bluefieldUpgrade linux-azure-fdeUpgrade linux-gkeUpgrade linux-lowlatency-hwe-5.15Upgrade linux-iotUpgrade linuxUpgrade linux-oracle-5.4Upgrade linux-ibm-5.15Upgrade linux-aws-5.4Upgrade linux-raspi-5.4Upgrade linux-gcpUpgrade linux-aws-5.15Upgrade linux-ibm-5.4Upgrade linux-awsUpgrade linux-nvidia-tegra-5.15 | Nov 19, 2024 | Feb 29, 2024 |
| Vmware Photon_os | — | Use 'tdnf update' to upgrade all packages to the latest version. | Jan 20, 2025 | Feb 29, 2024 |
Prioritise with Active Threat Intelligence
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