]> git.hungrycats.org Git - linux/commitdiff
powerpc/perf: Prevent kernel address leak to userspace via BHRB buffer
authorMadhavan Srinivasan <maddy@linux.vnet.ibm.com>
Wed, 21 Mar 2018 11:40:25 +0000 (17:10 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 May 2018 05:49:10 +0000 (07:49 +0200)
[ Upstream commit bb19af816025d495376bd76bf6fbcf4244f9a06d ]

The current Branch History Rolling Buffer (BHRB) code does not check
for any privilege levels before updating the data from BHRB. This
could leak kernel addresses to userspace even when profiling only with
userspace privileges. Add proper checks to prevent it.

Acked-by: Balbir Singh <bsingharora@gmail.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/powerpc/perf/core-book3s.c

index 4eba7c00ea1fba0ab80a69d380b9354a1e2ebec0..02b9c9914b0972761d874febd26acc190729bcb2 100644 (file)
@@ -448,6 +448,16 @@ static void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw)
                                /* invalid entry */
                                continue;
 
+                       /*
+                        * BHRB rolling buffer could very much contain the kernel
+                        * addresses at this point. Check the privileges before
+                        * exporting it to userspace (avoid exposure of regions
+                        * where we could have speculative execution)
+                        */
+                       if (perf_paranoid_kernel() && !capable(CAP_SYS_ADMIN) &&
+                               is_kernel_addr(addr))
+                               continue;
+
                        /* Branches are read most recent first (ie. mfbhrb 0 is
                         * the most recent branch).
                         * There are two types of valid entries: