| From 1517c6a21a60586ada1d606040f54e13a13fc37a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 27 Nov 2022 22:49:28 +1000 |
| Subject: powerpc/perf: callchain validate kernel stack pointer bounds |
| |
| From: Nicholas Piggin <npiggin@gmail.com> |
| |
| [ Upstream commit 32c5209214bd8d4f8c4e9d9b630ef4c671f58e79 ] |
| |
| The interrupt frame detection and loads from the hypothetical pt_regs |
| are not bounds-checked. The next-frame validation only bounds-checks |
| STACK_FRAME_OVERHEAD, which does not include the pt_regs. Add another |
| test for this. |
| |
| The user could set r1 to be equal to the address matching the first |
| interrupt frame - STACK_INT_FRAME_SIZE, which is in the previous page |
| due to the kernel redzone, and induce the kernel to load the marker from |
| there. Possibly this could cause a crash at least. If the user could |
| induce the previous page to contain a valid marker, then it might be |
| able to direct perf to read specific memory addresses in a way that |
| could be transmitted back to the user in the perf data. |
| |
| Fixes: 20002ded4d93 ("perf_counter: powerpc: Add callchain support") |
| Signed-off-by: Nicholas Piggin <npiggin@gmail.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20221127124942.1665522-4-npiggin@gmail.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/perf/callchain.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/arch/powerpc/perf/callchain.c b/arch/powerpc/perf/callchain.c |
| index 082f6d0308a4..8718289c051d 100644 |
| --- a/arch/powerpc/perf/callchain.c |
| +++ b/arch/powerpc/perf/callchain.c |
| @@ -61,6 +61,7 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *re |
| next_sp = fp[0]; |
| |
| if (next_sp == sp + STACK_INT_FRAME_SIZE && |
| + validate_sp(sp, current, STACK_INT_FRAME_SIZE) && |
| fp[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) { |
| /* |
| * This looks like an interrupt frame for an |
| -- |
| 2.35.1 |
| |