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