arch/tile: don't allow user code to set the PL via ptrace or signal return
The kernel was allowing any component of the pt_regs to be updated either by signal handlers writing to the stack, or by processes writing via PTRACE_POKEUSR or PTRACE_SETREGS, which meant they could set their PL up from 0 to 1 and get access to kernel code and data (or, in practice, cause a kernel panic). We now always reset the ex1 field, allowing the user to set their ICS bit only. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
This commit is contained in:
@@ -71,6 +71,9 @@ int restore_sigcontext(struct pt_regs *regs,
|
||||
for (i = 0; i < sizeof(struct pt_regs)/sizeof(long); ++i)
|
||||
err |= __get_user(regs->regs[i], &sc->gregs[i]);
|
||||
|
||||
/* Ensure that the PL is always set to USER_PL. */
|
||||
regs->ex1 = PL_ICS_EX1(USER_PL, EX1_ICS(regs->ex1));
|
||||
|
||||
regs->faultnum = INT_SWINT_1_SIGRETURN;
|
||||
|
||||
err |= __get_user(*pr0, &sc->gregs[0]);
|
||||
|
Reference in New Issue
Block a user