| 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-35871: riscv: process: Fix kernel gp leakage |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| riscv: process: Fix kernel gp leakage |
| |
| childregs represents the registers which are active for the new thread |
| in user context. For a kernel thread, childregs->gp is never used since |
| the kernel gp is not touched by switch_to. For a user mode helper, the |
| gp value can be observed in user space after execve or possibly by other |
| means. |
| |
| [From the email thread] |
| |
| The /* Kernel thread */ comment is somewhat inaccurate in that it is also used |
| for user_mode_helper threads, which exec a user process, e.g. /sbin/init or |
| when /proc/sys/kernel/core_pattern is a pipe. Such threads do not have |
| PF_KTHREAD set and are valid targets for ptrace etc. even before they exec. |
| |
| childregs is the *user* context during syscall execution and it is observable |
| from userspace in at least five ways: |
| |
| 1. kernel_execve does not currently clear integer registers, so the starting |
| register state for PID 1 and other user processes started by the kernel has |
| sp = user stack, gp = kernel __global_pointer$, all other integer registers |
| zeroed by the memset in the patch comment. |
| |
| This is a bug in its own right, but I'm unwilling to bet that it is the only |
| way to exploit the issue addressed by this patch. |
| |
| 2. ptrace(PTRACE_GETREGSET): you can PTRACE_ATTACH to a user_mode_helper thread |
| before it execs, but ptrace requires SIGSTOP to be delivered which can only |
| happen at user/kernel boundaries. |
| |
| 3. /proc/*/task/*/syscall: this is perfectly happy to read pt_regs for |
| user_mode_helpers before the exec completes, but gp is not one of the |
| registers it returns. |
| |
| 4. PERF_SAMPLE_REGS_USER: LOCKDOWN_PERF normally prevents access to kernel |
| addresses via PERF_SAMPLE_REGS_INTR, but due to this bug kernel addresses |
| are also exposed via PERF_SAMPLE_REGS_USER which is permitted under |
| LOCKDOWN_PERF. I have not attempted to write exploit code. |
| |
| 5. Much of the tracing infrastructure allows access to user registers. I have |
| not attempted to determine which forms of tracing allow access to user |
| registers without already allowing access to kernel registers. |
| |
| The Linux kernel CVE team has assigned CVE-2024-35871 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 4.15 with commit 7db91e57a0acde126a162ababfb1e0ab190130cb and fixed in 5.10.216 with commit 9abc3e6f1116adb7a2d4fbb8ce20c37916976bf5 |
| Issue introduced in 4.15 with commit 7db91e57a0acde126a162ababfb1e0ab190130cb and fixed in 5.15.154 with commit dff6072124f6df77bfd36951fbd88565746980ef |
| Issue introduced in 4.15 with commit 7db91e57a0acde126a162ababfb1e0ab190130cb and fixed in 6.1.85 with commit f6583444d7e78dae750798552b65a2519ff3ca84 |
| Issue introduced in 4.15 with commit 7db91e57a0acde126a162ababfb1e0ab190130cb and fixed in 6.6.26 with commit 00effef72c98294edb1efa87ffa0f6cfb61b36a4 |
| Issue introduced in 4.15 with commit 7db91e57a0acde126a162ababfb1e0ab190130cb and fixed in 6.8.5 with commit d8dcba0691b8e42bddb61aab201e4d918a08e5d9 |
| Issue introduced in 4.15 with commit 7db91e57a0acde126a162ababfb1e0ab190130cb and fixed in 6.9 with commit d14fa1fcf69db9d070e75f1c4425211fa619dfc8 |
| |
| 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-35871 |
| 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: |
| arch/riscv/kernel/process.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/9abc3e6f1116adb7a2d4fbb8ce20c37916976bf5 |
| https://git.kernel.org/stable/c/dff6072124f6df77bfd36951fbd88565746980ef |
| https://git.kernel.org/stable/c/f6583444d7e78dae750798552b65a2519ff3ca84 |
| https://git.kernel.org/stable/c/00effef72c98294edb1efa87ffa0f6cfb61b36a4 |
| https://git.kernel.org/stable/c/d8dcba0691b8e42bddb61aab201e4d918a08e5d9 |
| https://git.kernel.org/stable/c/d14fa1fcf69db9d070e75f1c4425211fa619dfc8 |