2017-11-01 21:08:43 +07:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
2012-10-13 16:46:48 +07:00
|
|
|
#ifndef _UAPI_LINUX_SECCOMP_H
|
|
|
|
#define _UAPI_LINUX_SECCOMP_H
|
|
|
|
|
|
|
|
#include <linux/compiler.h>
|
|
|
|
#include <linux/types.h>
|
|
|
|
|
|
|
|
|
|
|
|
/* Valid values for seccomp.mode and prctl(PR_SET_SECCOMP, <mode>) */
|
|
|
|
#define SECCOMP_MODE_DISABLED 0 /* seccomp is not in use. */
|
|
|
|
#define SECCOMP_MODE_STRICT 1 /* uses hard-coded filter. */
|
|
|
|
#define SECCOMP_MODE_FILTER 2 /* uses user-supplied filter. */
|
|
|
|
|
2014-06-26 06:08:24 +07:00
|
|
|
/* Valid operations for seccomp syscall. */
|
2017-08-11 11:33:53 +07:00
|
|
|
#define SECCOMP_SET_MODE_STRICT 0
|
|
|
|
#define SECCOMP_SET_MODE_FILTER 1
|
|
|
|
#define SECCOMP_GET_ACTION_AVAIL 2
|
2014-06-26 06:08:24 +07:00
|
|
|
|
2014-06-05 14:23:17 +07:00
|
|
|
/* Valid flags for SECCOMP_SET_MODE_FILTER */
|
2018-05-04 04:56:12 +07:00
|
|
|
#define SECCOMP_FILTER_FLAG_TSYNC (1UL << 0)
|
|
|
|
#define SECCOMP_FILTER_FLAG_LOG (1UL << 1)
|
|
|
|
#define SECCOMP_FILTER_FLAG_SPEC_ALLOW (1UL << 2)
|
2014-06-05 14:23:17 +07:00
|
|
|
|
2012-10-13 16:46:48 +07:00
|
|
|
/*
|
|
|
|
* All BPF programs must return a 32-bit value.
|
|
|
|
* The bottom 16-bits are for optional return data.
|
2017-08-12 03:01:39 +07:00
|
|
|
* The upper 16-bits are ordered from least permissive values to most,
|
|
|
|
* as a signed value (so 0x8000000 is negative).
|
2012-10-13 16:46:48 +07:00
|
|
|
*
|
|
|
|
* The ordering ensures that a min_t() over composed return values always
|
|
|
|
* selects the least permissive choice.
|
|
|
|
*/
|
2017-08-12 03:01:39 +07:00
|
|
|
#define SECCOMP_RET_KILL_PROCESS 0x80000000U /* kill the process */
|
|
|
|
#define SECCOMP_RET_KILL_THREAD 0x00000000U /* kill the thread */
|
|
|
|
#define SECCOMP_RET_KILL SECCOMP_RET_KILL_THREAD
|
|
|
|
#define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */
|
|
|
|
#define SECCOMP_RET_ERRNO 0x00050000U /* returns an errno */
|
|
|
|
#define SECCOMP_RET_TRACE 0x7ff00000U /* pass to a tracer or disallow */
|
|
|
|
#define SECCOMP_RET_LOG 0x7ffc0000U /* allow after logging */
|
|
|
|
#define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */
|
2012-10-13 16:46:48 +07:00
|
|
|
|
|
|
|
/* Masks for the return value sections. */
|
seccomp: Implement SECCOMP_RET_KILL_PROCESS action
Right now, SECCOMP_RET_KILL_THREAD (neé SECCOMP_RET_KILL) kills the
current thread. There have been a few requests for this to kill the entire
process (the thread group). This cannot be just changed (discovered when
adding coredump support since coredumping kills the entire process)
because there are userspace programs depending on the thread-kill
behavior.
Instead, implement SECCOMP_RET_KILL_PROCESS, which is 0x80000000, and can
be processed as "-1" by the kernel, below the existing RET_KILL that is
ABI-set to "0". For userspace, SECCOMP_RET_ACTION_FULL is added to expand
the mask to the signed bit. Old userspace using the SECCOMP_RET_ACTION
mask will see SECCOMP_RET_KILL_PROCESS as 0 still, but this would only
be visible when examining the siginfo in a core dump from a RET_KILL_*,
where it will think it was thread-killed instead of process-killed.
Attempts to introduce this behavior via other ways (filter flags,
seccomp struct flags, masked RET_DATA bits) all come with weird
side-effects and baggage. This change preserves the central behavioral
expectations of the seccomp filter engine without putting too great
a burden on changes needed in userspace to use the new action.
The new action is discoverable by userspace through either the new
actions_avail sysctl or through the SECCOMP_GET_ACTION_AVAIL seccomp
operation. If used without checking for availability, old kernels
will treat RET_KILL_PROCESS as RET_KILL_THREAD (since the old mask
will produce RET_KILL_THREAD).
Cc: Paul Moore <paul@paul-moore.com>
Cc: Fabricio Voznika <fvoznika@google.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
2017-08-12 03:12:11 +07:00
|
|
|
#define SECCOMP_RET_ACTION_FULL 0xffff0000U
|
2012-10-13 16:46:48 +07:00
|
|
|
#define SECCOMP_RET_ACTION 0x7fff0000U
|
|
|
|
#define SECCOMP_RET_DATA 0x0000ffffU
|
|
|
|
|
|
|
|
/**
|
|
|
|
* struct seccomp_data - the format the BPF program executes over.
|
|
|
|
* @nr: the system call number
|
|
|
|
* @arch: indicates system call convention as an AUDIT_ARCH_* value
|
|
|
|
* as defined in <linux/audit.h>.
|
|
|
|
* @instruction_pointer: at the time of the system call.
|
|
|
|
* @args: up to 6 system call arguments always stored as 64-bit values
|
|
|
|
* regardless of the architecture.
|
|
|
|
*/
|
|
|
|
struct seccomp_data {
|
|
|
|
int nr;
|
|
|
|
__u32 arch;
|
|
|
|
__u64 instruction_pointer;
|
|
|
|
__u64 args[6];
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* _UAPI_LINUX_SECCOMP_H */
|