From: Michael Ellerman <mpe@ellerman.id.au>
To: <linuxppc-dev@ozlabs.org>
Cc: <linux-kernel@vger.kernel.org>,
keescook@chromium.org, luto@amacapital.net, wad@chromium.org,
strosake@linux.vnet.ibm.com, bogdan.purcareata@freescale.com
Subject: [PATCH 09/11] powerpc/kernel: Enable seccomp filter
Date: Thu, 23 Jul 2015 20:21:09 +1000 [thread overview]
Message-ID: <1437646871-3195-9-git-send-email-mpe@ellerman.id.au> (raw)
In-Reply-To: <1437646871-3195-1-git-send-email-mpe@ellerman.id.au>
This commit enables seccomp filter on powerpc, now that we have all the
necessary pieces in place.
To support seccomp's desire to modify the syscall return value under
some circumstances, we use a different ABI to the ptrace ABI. That is we
use r3 as the syscall return value, and orig_gpr3 is the first syscall
parameter.
This means the seccomp code, or a ptracer via SECCOMP_RET_TRACE, will
see -ENOSYS preloaded in r3. This is identical to the behaviour on x86,
and allows seccomp or the ptracer to either leave the -ENOSYS or change
it to something else, as well as rejecting or not the syscall by
modifying r0.
If seccomp does not reject the syscall, we restore the register state to
match what ptrace and audit expect, ie. r3 is the first syscall
parameter again. We do this restore using orig_gpr3, which may have been
modified by seccomp, which allows seccomp to modify the first syscall
paramater and allow the syscall to proceed.
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/kernel/ptrace.c | 28 +++++++++++++++++++++++++++-
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 5ef27113b898..b6cb6a87b7a2 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -155,6 +155,7 @@ config PPC
select HAVE_PERF_EVENTS_NMI if PPC64
select EDAC_SUPPORT
select EDAC_ATOMIC_SCRUB
+ select HAVE_ARCH_SECCOMP_FILTER
config GENERIC_CSUM
def_bool CPU_LITTLE_ENDIAN
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index 7484221bb3f8..de79eb5218c6 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -1787,7 +1787,33 @@ long do_syscall_trace_enter(struct pt_regs *regs)
user_exit();
- secure_computing_strict(regs->gpr[0]);
+ if (test_thread_flag(TIF_SECCOMP)) {
+ /*
+ * The ABI we present to seccomp tracers is that r3 contains
+ * the syscall return value and orig_gpr3 contains the first
+ * syscall parameter. This is different to the ptrace ABI where
+ * both r3 and orig_gpr3 contain the first syscall parameter.
+ */
+ regs->gpr[3] = -ENOSYS;
+
+ /*
+ * We use the __ version here because we have already checked
+ * TIF_SECCOMP. If this fails, there is nothing left to do, we
+ * have already loaded -ENOSYS into r3, or seccomp has put
+ * something else in r3 (via SECCOMP_RET_ERRNO/TRACE).
+ */
+ if (__secure_computing())
+ return -1;
+
+ /*
+ * The syscall was allowed by seccomp, restore the register
+ * state to what ptrace and audit expect.
+ * Note that we use orig_gpr3, which means a seccomp tracer can
+ * modify the first syscall parameter (in orig_gpr3) and also
+ * allow the syscall to proceed.
+ */
+ regs->gpr[3] = regs->orig_gpr3;
+ }
if (test_thread_flag(TIF_SYSCALL_TRACE)) {
/*
--
2.1.0
next prev parent reply other threads:[~2015-07-23 10:21 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-23 10:21 [PATCH 01/11] powerpc/kernel: Switch to using MAX_ERRNO Michael Ellerman
2015-07-23 10:21 ` [PATCH 02/11] powerpc/kernel: Change the do_syscall_trace_enter() API Michael Ellerman
2015-07-27 18:48 ` Kees Cook
2015-07-23 10:21 ` [PATCH 03/11] powerpc: Drop unused syscall_get_error() Michael Ellerman
2015-07-27 18:48 ` Kees Cook
2015-07-23 10:21 ` [PATCH 04/11] powerpc: Don't negate error in syscall_set_return_value() Michael Ellerman
2015-07-27 18:49 ` Kees Cook
2015-07-23 10:21 ` [PATCH 05/11] powerpc: Rework syscall_get_arguments() so there is only one loop Michael Ellerman
2015-07-27 18:50 ` Kees Cook
2015-07-23 10:21 ` [PATCH 06/11] powerpc: Use orig_gpr3 in syscall_get_arguments() Michael Ellerman
2015-07-27 18:52 ` Kees Cook
2015-07-23 10:21 ` [PATCH 07/11] powerpc: Change syscall_get_nr() to return int Michael Ellerman
2015-07-27 18:53 ` Kees Cook
2015-07-23 10:21 ` [PATCH 08/11] powerpc/kernel: Add SIG_SYS support for compat tasks Michael Ellerman
2015-07-27 18:54 ` Kees Cook
2015-07-23 10:21 ` Michael Ellerman [this message]
2015-07-27 18:56 ` [PATCH 09/11] powerpc/kernel: Enable seccomp filter Kees Cook
2015-07-30 5:56 ` [PATCH v2] " Michael Ellerman
2015-07-30 16:39 ` Kees Cook
2015-07-23 10:21 ` [PATCH 10/11] selftests/seccomp: Make seccomp tests work on big endian Michael Ellerman
2015-07-27 18:57 ` Kees Cook
2015-07-23 10:21 ` [PATCH 11/11] selftests/seccomp: Add powerpc support Michael Ellerman
2015-07-27 18:59 ` Kees Cook
2015-07-28 12:18 ` Michael Ellerman
2015-07-27 18:45 ` [PATCH 01/11] powerpc/kernel: Switch to using MAX_ERRNO Kees Cook
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1437646871-3195-9-git-send-email-mpe@ellerman.id.au \
--to=mpe@ellerman.id.au \
--cc=bogdan.purcareata@freescale.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.org \
--cc=luto@amacapital.net \
--cc=strosake@linux.vnet.ibm.com \
--cc=wad@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).