| From bippy-5f407fcff5a0 Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| To: <linux-cve-announce@vger.kernel.org> |
| Reply-to: <cve@kernel.org>, <linux-kernel@vger.kernel.org> |
| Subject: CVE-2024-26623: pds_core: Prevent race issues involving the adminq |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| pds_core: Prevent race issues involving the adminq |
| |
| There are multiple paths that can result in using the pdsc's |
| adminq. |
| |
| [1] pdsc_adminq_isr and the resulting work from queue_work(), |
| i.e. pdsc_work_thread()->pdsc_process_adminq() |
| |
| [2] pdsc_adminq_post() |
| |
| When the device goes through reset via PCIe reset and/or |
| a fw_down/fw_up cycle due to bad PCIe state or bad device |
| state the adminq is destroyed and recreated. |
| |
| A NULL pointer dereference can happen if [1] or [2] happens |
| after the adminq is already destroyed. |
| |
| In order to fix this, add some further state checks and |
| implement reference counting for adminq uses. Reference |
| counting was used because multiple threads can attempt to |
| access the adminq at the same time via [1] or [2]. Additionally, |
| multiple clients (i.e. pds-vfio-pci) can be using [2] |
| at the same time. |
| |
| The adminq_refcnt is initialized to 1 when the adminq has been |
| allocated and is ready to use. Users/clients of the adminq |
| (i.e. [1] and [2]) will increment the refcnt when they are using |
| the adminq. When the driver goes into a fw_down cycle it will |
| set the PDSC_S_FW_DEAD bit and then wait for the adminq_refcnt |
| to hit 1. Setting the PDSC_S_FW_DEAD before waiting will prevent |
| any further adminq_refcnt increments. Waiting for the |
| adminq_refcnt to hit 1 allows for any current users of the adminq |
| to finish before the driver frees the adminq. Once the |
| adminq_refcnt hits 1 the driver clears the refcnt to signify that |
| the adminq is deleted and cannot be used. On the fw_up cycle the |
| driver will once again initialize the adminq_refcnt to 1 allowing |
| the adminq to be used again. |
| |
| The Linux kernel CVE team has assigned CVE-2024-26623 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 6.4 with commit 01ba61b55b2041a39c54aefb3153c770dd59a0ef and fixed in 6.6.16 with commit 22cd6046eb2148b18990257505834dd45c672a1b |
| Issue introduced in 6.4 with commit 01ba61b55b2041a39c54aefb3153c770dd59a0ef and fixed in 6.7.4 with commit 5939feb63ea1f011027576c64b68b681cbad31ca |
| Issue introduced in 6.4 with commit 01ba61b55b2041a39c54aefb3153c770dd59a0ef and fixed in 6.8 with commit 7e82a8745b951b1e794cc780d46f3fbee5e93447 |
| |
| Please see https://www.kernel.org for a full list of currently supported |
| kernel versions by the kernel community. |
| |
| Unaffected versions might change over time as fixes are backported to |
| older supported kernel versions. The official CVE entry at |
| https://cve.org/CVERecord/?id=CVE-2024-26623 |
| will be updated if fixes are backported, please check that for the most |
| up to date information about this issue. |
| |
| |
| Affected files |
| ============== |
| |
| The file(s) affected by this issue are: |
| drivers/net/ethernet/amd/pds_core/adminq.c |
| drivers/net/ethernet/amd/pds_core/core.c |
| drivers/net/ethernet/amd/pds_core/core.h |
| |
| |
| Mitigation |
| ========== |
| |
| The Linux kernel CVE team recommends that you update to the latest |
| stable kernel version for this, and many other bugfixes. Individual |
| changes are never tested alone, but rather are part of a larger kernel |
| release. Cherry-picking individual commits is not recommended or |
| supported by the Linux kernel community at all. If however, updating to |
| the latest release is impossible, the individual changes to resolve this |
| issue can be found at these commits: |
| https://git.kernel.org/stable/c/22cd6046eb2148b18990257505834dd45c672a1b |
| https://git.kernel.org/stable/c/5939feb63ea1f011027576c64b68b681cbad31ca |
| https://git.kernel.org/stable/c/7e82a8745b951b1e794cc780d46f3fbee5e93447 |