commit b226b6ca89fa96b31a39bddd6196b55149cba8c6
parent aa01e5e50458099b5adeea31fb2c3c06d9d799ce
Author: Joris Vink <joris@coders.se>
Date: Tue, 5 Nov 2019 13:12:43 +0100
Allow seccomp to work on arm64 and i386.
Diffstat:
2 files changed, 43 insertions(+), 5 deletions(-)
diff --git a/src/keymgr.c b/src/keymgr.c
@@ -56,7 +56,9 @@
/* The syscalls our keymgr is allowed to perform, only. */
static struct sock_filter filter_keymgr[] = {
/* Required to deal with private keys and certs. */
+#if defined(SYS_open)
KORE_SYSCALL_ALLOW(open),
+#endif
KORE_SYSCALL_ALLOW(read),
KORE_SYSCALL_ALLOW(write),
KORE_SYSCALL_ALLOW(close),
@@ -66,10 +68,14 @@ static struct sock_filter filter_keymgr[] = {
KORE_SYSCALL_ALLOW(openat),
/* Net related. */
+#if defined(SYS_poll)
KORE_SYSCALL_ALLOW(poll),
+#endif
KORE_SYSCALL_ALLOW(sendto),
KORE_SYSCALL_ALLOW(recvfrom),
+#if defined(SYS_epoll_wait)
KORE_SYSCALL_ALLOW(epoll_wait),
+#endif
KORE_SYSCALL_ALLOW(epoll_pwait),
/* Process things. */
@@ -77,7 +83,9 @@ static struct sock_filter filter_keymgr[] = {
KORE_SYSCALL_ALLOW(kill),
KORE_SYSCALL_ALLOW(getuid),
KORE_SYSCALL_ALLOW(getpid),
+#if defined(SYS_arch_prctl)
KORE_SYSCALL_ALLOW(arch_prctl),
+#endif
KORE_SYSCALL_ALLOW(exit_group),
KORE_SYSCALL_ALLOW(sigaltstack),
KORE_SYSCALL_ALLOW(rt_sigreturn),
diff --git a/src/seccomp.c b/src/seccomp.c
@@ -19,7 +19,7 @@
#include <sys/epoll.h>
#include <sys/ptrace.h>
#include <sys/prctl.h>
-#include <sys/reg.h>
+#include <sys/user.h>
#include <sys/syscall.h>
#include <linux/seccomp.h>
@@ -50,21 +50,33 @@ static struct sock_filter filter_kore[] = {
KORE_SYSCALL_DENY(ioctl, EACCES),
/* File related. */
+#if defined(SYS_open)
KORE_SYSCALL_ALLOW(open),
+#endif
KORE_SYSCALL_ALLOW(read),
+#if defined(SYS_stat)
KORE_SYSCALL_ALLOW(stat),
+#endif
+#if defined(SYS_lstat)
KORE_SYSCALL_ALLOW(lstat),
+#endif
KORE_SYSCALL_ALLOW(fstat),
KORE_SYSCALL_ALLOW(write),
KORE_SYSCALL_ALLOW(fcntl),
KORE_SYSCALL_ALLOW(lseek),
KORE_SYSCALL_ALLOW(close),
KORE_SYSCALL_ALLOW(openat),
+#if defined(SYS_access)
KORE_SYSCALL_ALLOW(access),
+#endif
KORE_SYSCALL_ALLOW(writev),
KORE_SYSCALL_ALLOW(getcwd),
+#if defined(SYS_unlink)
KORE_SYSCALL_ALLOW(unlink),
+#endif
+#if defined(SYS_readlink)
KORE_SYSCALL_ALLOW(readlink),
+#endif
/* Process related. */
KORE_SYSCALL_ALLOW(exit),
@@ -88,14 +100,18 @@ static struct sock_filter filter_kore[] = {
KORE_SYSCALL_ALLOW(mprotect),
/* Net related. */
+#if defined(SYS_poll)
KORE_SYSCALL_ALLOW(poll),
+#endif
KORE_SYSCALL_ALLOW(sendto),
KORE_SYSCALL_ALLOW(accept),
KORE_SYSCALL_ALLOW(sendfile),
KORE_SYSCALL_ALLOW(recvfrom),
KORE_SYSCALL_ALLOW(epoll_ctl),
KORE_SYSCALL_ALLOW(setsockopt),
+#if defined(SYS_epoll_wait)
KORE_SYSCALL_ALLOW(epoll_wait),
+#endif
KORE_SYSCALL_ALLOW(epoll_pwait),
/* Signal related. */
@@ -291,7 +307,7 @@ kore_seccomp_traceme(void)
return;
if (ptrace(PTRACE_TRACEME, 0, NULL, NULL) == -1)
- fatalx("ptrace. %s", errno_s);
+ fatalx("ptrace: %s", errno_s);
if (kill(worker->pid, SIGSTOP) == -1)
fatalx("kill: %s", errno_s);
}
@@ -406,12 +422,26 @@ kore_seccomp_syscall_flag(const char *name, int action, int arg, int value)
static void
seccomp_register_violation(struct kore_worker *kw)
{
- long sysnr;
+ struct iovec iov;
+ struct user_regs_struct regs;
+ long sysnr;
+
+ iov.iov_base = ®s;
+ iov.iov_len = sizeof(regs);
- if ((sysnr = ptrace(PTRACE_PEEKUSER, kw->pid,
- sizeof(long) * ORIG_RAX, NULL)) == -1)
+ if (ptrace(PTRACE_GETREGSET, kw->pid, 1, &iov) == -1)
fatal("ptrace: %s", errno_s);
+#if SECCOMP_AUDIT_ARCH == AUDIT_ARCH_X86_64
+ sysnr = regs.orig_rax;
+#elif SECCOMP_AUDIT_ARCH == AUDIT_ARCH_I386
+ sysnr = regs.orig_ax;
+#elif SECCOMP_AUDIT_ARCH == AUDIT_ARCH_AARCH64
+ sysnr = regs.regs[8];
+#else
+#error "platform not yet supported"
+#endif
+
kore_log(LOG_INFO, "seccomp violation, worker=%d, syscall=%s",
kw->id, kore_seccomp_syscall_name(sysnr));
}