CVE-2024-35809
Severity CVSS v4.0:
Pending analysis
Type:
CWE-362
Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')
Publication date:
17/05/2024
Last modified:
23/12/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
PCI/PM: Drain runtime-idle callbacks before driver removal<br />
<br />
A race condition between the .runtime_idle() callback and the .remove()<br />
callback in the rtsx_pcr PCI driver leads to a kernel crash due to an<br />
unhandled page fault [1].<br />
<br />
The problem is that rtsx_pci_runtime_idle() is not expected to be running<br />
after pm_runtime_get_sync() has been called, but the latter doesn&#39;t really<br />
guarantee that. It only guarantees that the suspend and resume callbacks<br />
will not be running when it returns.<br />
<br />
However, if a .runtime_idle() callback is already running when<br />
pm_runtime_get_sync() is called, the latter will notice that the runtime PM<br />
status of the device is RPM_ACTIVE and it will return right away without<br />
waiting for the former to complete. In fact, it cannot wait for<br />
.runtime_idle() to complete because it may be called from that callback (it<br />
arguably does not make much sense to do that, but it is not strictly<br />
prohibited).<br />
<br />
Thus in general, whoever is providing a .runtime_idle() callback needs<br />
to protect it from running in parallel with whatever code runs after<br />
pm_runtime_get_sync(). [Note that .runtime_idle() will not start after<br />
pm_runtime_get_sync() has returned, but it may continue running then if it<br />
has started earlier.]<br />
<br />
One way to address that race condition is to call pm_runtime_barrier()<br />
after pm_runtime_get_sync() (not before it, because a nonzero value of the<br />
runtime PM usage counter is necessary to prevent runtime PM callbacks from<br />
being invoked) to wait for the .runtime_idle() callback to complete should<br />
it be running at that point. A suitable place for doing that is in<br />
pci_device_remove() which calls pm_runtime_get_sync() before removing the<br />
driver, so it may as well call pm_runtime_barrier() subsequently, which<br />
will prevent the race in question from occurring, not just in the rtsx_pcr<br />
driver, but in any PCI drivers providing .runtime_idle() callbacks.
Impact
Base Score 3.x
4.70
Severity 3.x
MEDIUM
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.19.312 (excluding) | |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.20 (including) | 5.4.274 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (including) | 5.10.215 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (including) | 5.15.154 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (including) | 6.1.84 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (including) | 6.6.24 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (including) | 6.7.12 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.8 (including) | 6.8.3 (excluding) |
| cpe:2.3:o:debian:debian_linux:10.0:*:*:*:*:*:*:* |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/47d8aafcfe313511a98f165a54d0adceb34e54b1
- https://git.kernel.org/stable/c/6347348c6aba52dda0b33296684cbb627bdc6970
- https://git.kernel.org/stable/c/7cc94dd36e48879e76ae7a8daea4ff322b7d9674
- https://git.kernel.org/stable/c/900b81caf00c89417172afe0e7e49ac4eb110f4b
- https://git.kernel.org/stable/c/9a87375bb586515c0af63d5dcdcd58ec4acf20a6
- https://git.kernel.org/stable/c/9d5286d4e7f68beab450deddbb6a32edd5ecf4bf
- https://git.kernel.org/stable/c/bbe068b24409ef740657215605284fc7cdddd491
- https://git.kernel.org/stable/c/d534198311c345e4b062c4b88bb609efb8bd91d5
- https://git.kernel.org/stable/c/d86ad8c3e152349454b82f37007ff6ba45f26989
- https://git.kernel.org/stable/c/47d8aafcfe313511a98f165a54d0adceb34e54b1
- https://git.kernel.org/stable/c/6347348c6aba52dda0b33296684cbb627bdc6970
- https://git.kernel.org/stable/c/7cc94dd36e48879e76ae7a8daea4ff322b7d9674
- https://git.kernel.org/stable/c/900b81caf00c89417172afe0e7e49ac4eb110f4b
- https://git.kernel.org/stable/c/9a87375bb586515c0af63d5dcdcd58ec4acf20a6
- https://git.kernel.org/stable/c/9d5286d4e7f68beab450deddbb6a32edd5ecf4bf
- https://git.kernel.org/stable/c/bbe068b24409ef740657215605284fc7cdddd491
- https://git.kernel.org/stable/c/d534198311c345e4b062c4b88bb609efb8bd91d5
- https://git.kernel.org/stable/c/d86ad8c3e152349454b82f37007ff6ba45f26989
- https://lists.debian.org/debian-lts-announce/2024/06/msg00017.html
- https://lists.debian.org/debian-lts-announce/2024/06/msg00020.html



