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