CVE-2024-35809CWE-362

CVE-2024-35809

Medium · published May 17, 2024

CVSS v3.1
4.7
EPSS
0%
Percentile
8.7
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

PCI/PM: Drain runtime-idle callbacks before driver removal

A race condition between the .runtime_idle() callback and the .remove()

callback in the rtsx_pcr PCI driver leads to a kernel crash due to an

unhandled page fault [1].

The problem is that rtsx_pci_runtime_idle() is not expected to be running

after pm_runtime_get_sync() has been called, but the latter doesn't really

guarantee that. It only guarantees that the suspend and resume callbacks

will not be running when it returns.

However, if a .runtime_idle() callback is already running when

pm_runtime_get_sync() is called, the latter will notice that the runtime PM

status of the device is RPM_ACTIVE and it will return right away without

waiting for the former to complete. In fact, it cannot wait for

.runtime_idle() to complete because it may be called from that callback (it

arguably does not make much sense to do that, but it is not strictly

prohibited).

Thus in general, whoever is providing a .runtime_idle() callback needs

to protect it from running in parallel with whatever code runs after

pm_runtime_get_sync(). [Note that .runtime_idle() will not start after

pm_runtime_get_sync() has returned, but it may continue running then if it

has started earlier.]

One way to address that race condition is to call pm_runtime_barrier()

after pm_runtime_get_sync() (not before it, because a nonzero value of the

runtime PM usage counter is necessary to prevent runtime PM callbacks from

being invoked) to wait for the .runtime_idle() callback to complete should

it be running at that point. A suitable place for doing that is in

pci_device_remove() which calls pm_runtime_get_sync() before removing the

driver, so it may as well call pm_runtime_barrier() subsequently, which

will prevent the race in question from occurring, not just in the rtsx_pcr

driver, but in any PCI drivers providing .runtime_idle() callbacks.

The record
Technical detail
CVSS v3.1
4.7 · MEDIUM
Vector
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H
CVSS v4.0
Not supplied
EPSS
0.00195 · 8.7th percentile
Weakness
CWE-362 · Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')
Published
2024-05-17T18:15Z
Affected products (9)
ProductVersionsFixed in
debian/debian_linuxall versions—
linux/linux_kernel< 4.19.3124.19.312
linux/linux_kernel≥ 4.20, < 5.4.2745.4.274
linux/linux_kernel≥ 5.5, < 5.10.2155.10.215
linux/linux_kernel≥ 5.11, < 5.15.1545.15.154
linux/linux_kernel≥ 5.16, < 6.1.846.1.84
linux/linux_kernel≥ 6.2, < 6.6.246.6.24
linux/linux_kernel≥ 6.7, < 6.7.126.7.12
linux/linux_kernel≥ 6.8, < 6.8.36.8.3
References (21)
https://git.kernel.org/stable/c/47d8aafcfe313511a98f165a54d0adceb34e54b1 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/6347348c6aba52dda0b33296684cbb627bdc6970 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/7cc94dd36e48879e76ae7a8daea4ff322b7d9674 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/900b81caf00c89417172afe0e7e49ac4eb110f4b · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/9a87375bb586515c0af63d5dcdcd58ec4acf20a6 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/9d5286d4e7f68beab450deddbb6a32edd5ecf4bf · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/bbe068b24409ef740657215605284fc7cdddd491 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/d534198311c345e4b062c4b88bb609efb8bd91d5 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/d86ad8c3e152349454b82f37007ff6ba45f26989 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/47d8aafcfe313511a98f165a54d0adceb34e54b1 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/6347348c6aba52dda0b33296684cbb627bdc6970 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/7cc94dd36e48879e76ae7a8daea4ff322b7d9674 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/900b81caf00c89417172afe0e7e49ac4eb110f4b · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/9a87375bb586515c0af63d5dcdcd58ec4acf20a6 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/9d5286d4e7f68beab450deddbb6a32edd5ecf4bf · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/bbe068b24409ef740657215605284fc7cdddd491 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/d534198311c345e4b062c4b88bb609efb8bd91d5 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/d86ad8c3e152349454b82f37007ff6ba45f26989 · af854a3a-2127-422b-91ae-364da2661108https://lists.debian.org/debian-lts-announce/2024/06/msg00017.html · af854a3a-2127-422b-91ae-364da2661108https://lists.debian.org/debian-lts-announce/2024/06/msg00020.html · af854a3a-2127-422b-91ae-364da2661108https://cert-portal.siemens.com/productcert/html/ssa-398330.html · 0b142b55-0307-4c5a-b3c9-f314f3fb7c5e
EPSS history
Timeline
  • 17 MAY 13:23Z
    PCI/PM: Drain runtime-idle callbacks before driver removal
    cvelistv5