powerpc/perf: Prevent kernel address leak via perf_get_data_addr()
authorMadhavan Srinivasan <maddy@linux.vnet.ibm.com>
Wed, 21 Mar 2018 11:40:26 +0000 (17:10 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 27 Mar 2018 08:25:09 +0000 (19:25 +1100)
Sampled Data Address Register (SDAR) is a 64-bit register that
contains the effective address of the storage operand of an
instruction that was being executed, possibly out-of-order, at or
around the time that the Performance Monitor alert occurred.

In certain scenario SDAR happen to contain the kernel address even for
userspace only sampling. Add checks to prevent it.

Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/perf/core-book3s.c

index 1e55ae2f2afdb104c808054d0edea89d5e860528..a00b364fb9d7c0abddd5d0cce1924fb9803e8530 100644 (file)
@@ -198,6 +198,10 @@ static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp)
 
        if (!(mmcra & MMCRA_SAMPLE_ENABLE) || sdar_valid)
                *addrp = mfspr(SPRN_SDAR);
+
+       if (perf_paranoid_kernel() && !capable(CAP_SYS_ADMIN) &&
+               is_kernel_addr(mfspr(SPRN_SDAR)))
+               *addrp = 0;
 }
 
 static bool regs_sihv(struct pt_regs *regs)