| 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-26909: soc: qcom: pmic_glink_altmode: fix drm bridge use-after-free |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| soc: qcom: pmic_glink_altmode: fix drm bridge use-after-free |
| |
| A recent DRM series purporting to simplify support for "transparent |
| bridges" and handling of probe deferrals ironically exposed a |
| use-after-free issue on pmic_glink_altmode probe deferral. |
| |
| This has manifested itself as the display subsystem occasionally failing |
| to initialise and NULL-pointer dereferences during boot of machines like |
| the Lenovo ThinkPad X13s. |
| |
| Specifically, the dp-hpd bridge is currently registered before all |
| resources have been acquired which means that it can also be |
| deregistered on probe deferrals. |
| |
| In the meantime there is a race window where the new aux bridge driver |
| (or PHY driver previously) may have looked up the dp-hpd bridge and |
| stored a (non-reference-counted) pointer to the bridge which is about to |
| be deallocated. |
| |
| When the display controller is later initialised, this triggers a |
| use-after-free when attaching the bridges: |
| |
| dp -> aux -> dp-hpd (freed) |
| |
| which may, for example, result in the freed bridge failing to attach: |
| |
| [drm:drm_bridge_attach [drm]] *ERROR* failed to attach bridge /soc@0/phy@88eb000 to encoder TMDS-31: -16 |
| |
| or a NULL-pointer dereference: |
| |
| Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 |
| ... |
| Call trace: |
| drm_bridge_attach+0x70/0x1a8 [drm] |
| drm_aux_bridge_attach+0x24/0x38 [aux_bridge] |
| drm_bridge_attach+0x80/0x1a8 [drm] |
| dp_bridge_init+0xa8/0x15c [msm] |
| msm_dp_modeset_init+0x28/0xc4 [msm] |
| |
| The DRM bridge implementation is clearly fragile and implicitly built on |
| the assumption that bridges may never go away. In this case, the fix is |
| to move the bridge registration in the pmic_glink_altmode driver to |
| after all resources have been looked up. |
| |
| Incidentally, with the new dp-hpd bridge implementation, which registers |
| child devices, this is also a requirement due to a long-standing issue |
| in driver core that can otherwise lead to a probe deferral loop (see |
| commit fbc35b45f9f6 ("Add documentation on meaning of -EPROBE_DEFER")). |
| |
| [DB: slightly fixed commit message by adding the word 'commit'] |
| |
| The Linux kernel CVE team has assigned CVE-2024-26909 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 6.3 with commit 080b4e24852b1d5b66929f69344e6c3eeb963941 and fixed in 6.6.23 with commit 2bbd65c6ca567ed8dbbfc4fb945f57ce64bef342 |
| Issue introduced in 6.3 with commit 080b4e24852b1d5b66929f69344e6c3eeb963941 and fixed in 6.7.11 with commit ef45aa2841e15b649e5417fe3d4de395fe462781 |
| Issue introduced in 6.3 with commit 080b4e24852b1d5b66929f69344e6c3eeb963941 and fixed in 6.8 with commit b979f2d50a099f3402418d7ff5f26c3952fb08bb |
| |
| 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-26909 |
| 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/soc/qcom/pmic_glink_altmode.c |
| |
| |
| 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/2bbd65c6ca567ed8dbbfc4fb945f57ce64bef342 |
| https://git.kernel.org/stable/c/ef45aa2841e15b649e5417fe3d4de395fe462781 |
| https://git.kernel.org/stable/c/b979f2d50a099f3402418d7ff5f26c3952fb08bb |