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-rt-debug-kvmUpgrade kernel-rt-coreUpgrade kernel-modules-extraUpgrade kernel-docUpgrade kernel-rt-debugUpgrade kernel-debug-modulesUpgrade kernel-debug-modules-extraUpgrade kernel-rt-modulesUpgrade kernel-zfcpdump-modules-extraUpgrade kernel-zfcpdump-develUpgrade kernel-headersUpgrade kernel-debug-develUpgrade kernel-rt-debug-modulesUpgrade kernel-tools-libsUpgrade kernel-rt-debug-develUpgrade kernel-zfcpdumpUpgrade kernel-rt-develUpgrade kernel-debugUpgrade kernel-debug-coreUpgrade kernel-rt-debug-modules-extraUpgrade kernel-develUpgrade kernel-modulesUpgrade kernel-coreUpgrade bpftoolUpgrade kernel-zfcpdump-coreUpgrade kernel-rt-modules-extraUpgrade kernel-rtUpgrade perfUpgrade python3-perfUpgrade kernel-tools-libs-develUpgrade kernel-toolsUpgrade kernelUpgrade kernel-zfcpdump-modulesUpgrade kernel-cross-headersUpgrade kernel-abi-stablelistsUpgrade kernel-rt-debug-coreUpgrade kernel-rt-kvm | Sep 26, 2024 | Feb 29, 2024 |
| Amazon Linux Ami 2 | — | Upgrade kernel-tools-debuginfoUpgrade python-perf-debuginfoUpgrade kernel-tools-develUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-livepatch-5.10.199-190.747Upgrade kernel-headersUpgrade kernelUpgrade kernel-debuginfoUpgrade kernel-develUpgrade kernel-toolsUpgrade perf-debuginfoUpgrade perfUpgrade python-perfUpgrade bpftoolUpgrade bpftool-debuginfoUpgrade kernel-livepatch-4.14.328-248.540Upgrade kernel-debuginfo-common-aarch64 | Aug 2, 2024 | Feb 29, 2024 |
| Debian | — | Upgrade linux | Jul 30, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp10 | — | Upgrade kernel-toolsUpgrade kernel-abi-stablelistsUpgrade python3-perfUpgrade kernel-tools-libsUpgrade kernel | May 13, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp11 | — | Upgrade python3-perfUpgrade kernel-abi-stablelistsUpgrade kernelUpgrade kernel-toolsUpgrade bpftoolUpgrade kernel-tools-libs | Jun 26, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp12 | — | Upgrade kernelUpgrade kernel-abi-stablelistsUpgrade kernel-tools-libsUpgrade bpftoolUpgrade python3-perfUpgrade kernel-tools | Oct 8, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp8 | — | Upgrade kernel-toolsUpgrade python3-perfUpgrade perfUpgrade python-perfUpgrade kernelUpgrade kernel-headersUpgrade kernel-develUpgrade bpftoolUpgrade kernel-tools-libs | Jul 23, 2024 | Feb 29, 2024 |
| Huawei Euleros 2_0_sp9 | — | Upgrade kernel-toolsUpgrade kernel-tools-libsUpgrade python3-perfUpgrade kernel | 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-cross-headersUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-rt-modules-extraUpgrade kernel-modulesUpgrade kernel-rt-debug-coreUpgrade kernel-rt-debug-kvmUpgrade kernel-rtUpgrade kernel-debug-modulesUpgrade kernel-tools-libs-develUpgrade bpftool-debuginfoUpgrade kernel-headersUpgrade kernel-rt-debug-develUpgrade kernel-tools-libsUpgrade kernel-rt-debug-debuginfoUpgrade kernel-debug-modules-extraUpgrade kernel-debug-debuginfoUpgrade kernel-rt-debuginfoUpgrade kernel-rt-debuginfo-common-x86_64Upgrade kernelUpgrade kernel-rt-debug-modulesUpgrade kernel-toolsUpgrade kernel-rt-debug-modules-extraUpgrade kernel-rt-debugUpgrade kernel-rt-modulesUpgrade kernel-develUpgrade kernel-rt-develUpgrade kernel-rt-kvmUpgrade kernel-debug-coreUpgrade kernel-tools-debuginfoUpgrade perfUpgrade kernel-rt-coreUpgrade kernel-coreUpgrade kernel-modules-extraUpgrade python3-perfUpgrade kernel-debugUpgrade bpftoolUpgrade kernel-debug-develUpgrade perf-debuginfoUpgrade kernel-debuginfoUpgrade python3-perf-debuginfo | Oct 2, 2024 | Feb 29, 2024 |
| Suse | — | Upgrade kernel-rt-develUpgrade kernel-devel-rtUpgrade kselftests-kmp-rtUpgrade kernel-default-livepatch-develUpgrade kernel-64kb-develUpgrade ocfs2-kmp-defaultUpgrade kernel-develUpgrade dtb-caviumUpgrade dtb-appleUpgrade dtb-amazonUpgrade dlm-kmp-defaultUpgrade dtb-amdUpgrade cluster-md-kmp-64kbUpgrade dtb-alteraUpgrade kernel-kvmsmall-livepatch-develUpgrade dtb-mediatekUpgrade kernel-rt_debug-develUpgrade kernel-azure-optionalUpgrade kernel-debug-develUpgrade kernel-default-optionalUpgrade gfs2-kmp-64kbUpgrade kernel-64kb-livepatch-develUpgrade ocfs2-kmp-azureUpgrade dtb-freescaleUpgrade dtb-marvellUpgrade kernel-defaultUpgrade dtb-renesasUpgrade kernel-azure-extraUpgrade kernel-rt_debug-livepatch-develUpgrade kernel-default-baseUpgrade kernel-64kbUpgrade dlm-kmp-rtUpgrade kernel-source-vanillaUpgrade dtb-allwinnerUpgrade kernel-symsUpgrade kernel-preempt-develUpgrade reiserfs-kmp-defaultUpgrade gfs2-kmp-azureUpgrade kernel-default-livepatchUpgrade kernel-docsUpgrade dtb-socionextUpgrade kernel-default-develUpgrade cluster-md-kmp-rtUpgrade kernel-64kb-extraUpgrade kernel-rt_debugUpgrade dtb-xilinxUpgrade kernel-debugUpgrade dtb-sprdUpgrade kernel-rt-livepatchUpgrade gfs2-kmp-defaultUpgrade dtb-armUpgrade reiserfs-kmp-rtUpgrade dtb-hisiliconUpgrade kernel-64kb-optionalUpgrade kernel-obs-buildUpgrade dtb-nvidiaUpgrade dtb-apmUpgrade kernel-zfcpdumpUpgrade kernel-docs-htmlUpgrade kernel-default-base-rebuildUpgrade kernel-azure-vdsoUpgrade kernel-azure-livepatch-develUpgrade kernel-kvmsmallUpgrade gfs2-kmp-rtUpgrade reiserfs-kmp-64kbUpgrade kernel-rt-extraUpgrade kernel-macrosUpgrade kselftests-kmp-azureUpgrade kernel-sourceUpgrade kernel-obs-qaUpgrade kernel-kvmsmall-develUpgrade kernel-debug-vdsoUpgrade dtb-qcomUpgrade kernel-syms-azureUpgrade kernel-source-rtUpgrade kernel-rt-vdsoUpgrade dtb-rockchipUpgrade kernel-syms-rtUpgrade kernel-source-azureUpgrade kernel-debug-livepatch-develUpgrade kernel-azure-baseUpgrade kernel-azureUpgrade dtb-broadcomUpgrade dlm-kmp-64kbUpgrade ocfs2-kmp-rtUpgrade kernel-preemptUpgrade cluster-md-kmp-defaultUpgrade kernel-default-manUpgrade kernel-rt-livepatch-develUpgrade kernel-rt-optionalUpgrade kselftests-kmp-defaultUpgrade kselftests-kmp-64kbUpgrade kernel-kvmsmall-vdsoUpgrade dtb-exynosUpgrade cluster-md-kmp-azureUpgrade ocfs2-kmp-64kbUpgrade kernel-rtUpgrade dtb-amlogicUpgrade kernel-rt_debug-vdsoUpgrade kernel-default-vdsoUpgrade dlm-kmp-azureUpgrade kernel-default-extraUpgrade kernel-devel-azureUpgrade dtb-lgUpgrade kernel-azure-develUpgrade reiserfs-kmp-azure | Mar 13, 2024 | Feb 29, 2024 |
| Ubuntu | — | Upgrade linux-azure-fdeUpgrade linux-aws-5.15Upgrade linux-raspiUpgrade linux-gcpUpgrade linux-nvidia-tegraUpgrade linux-awsUpgrade linux-oracle-5.4Upgrade linux-lowlatency-hwe-5.15Upgrade linuxUpgrade linux-ibm-5.4Upgrade linux-iotUpgrade linux-bluefieldUpgrade linux-ibm-5.15Upgrade linux-nvidia-tegra-5.15Upgrade linux-aws-5.4Upgrade linux-raspi-5.4Upgrade linux-gkeUpgrade linux-hwe-5.4Upgrade linux-azure-5.15Upgrade linux-azure-5.4Upgrade linux-intel-iotg-5.15Upgrade linux-xilinx-zynqmpUpgrade linux-gcp-fipsUpgrade linux-intel-iotgUpgrade linux-nvidia-tegra-igxUpgrade linux-gcp-5.15Upgrade linux-gkeopUpgrade linux-nvidia-6.5Upgrade linux-hwe-5.15Upgrade linux-nvidiaUpgrade linux-aws-fipsUpgrade linux-azureUpgrade linux-realtimeUpgrade linux-azure-fde-5.15Upgrade linux-intel-iot-realtimeUpgrade linux-azure-fipsUpgrade linux-fipsUpgrade linux-oracleUpgrade linux-gcp-5.4Upgrade linux-gkeop-5.15Upgrade linux-oracle-5.15Upgrade linux-riscv-5.15Upgrade linux-ibmUpgrade linux-kvmUpgrade linux-lowlatency | 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