Skip to content

Commit 417ecb6

Browse files
committed
tools headers UAPI: Copy seccomp.h to be able to build 'perf bench' in older systems
The new 'perf bench' for sched-seccomp-notify uses defines and types not available in older systems where we want to have perf available, so grab a copy of this UAPI from the kernel sources to allow that. This will be checked in the future for drift from the original when we build the perf tool, that will warn when that happens like: make: Entering directory '/var/home/acme/git/perf-tools/tools/perf' BUILD: Doing 'make -j32' parallel build Warning: Kernel ABI header differences: Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Andrei Vagin <avagin@google.com> Cc: Ian Rogers <irogers@google.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kees Kook <keescook@chromium.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: https://lore.kernel.org/lkml/ZQGhMXtwX7RvV3ya@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent f787596 commit 417ecb6

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed

tools/include/uapi/linux/seccomp.h

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+
#ifndef _UAPI_LINUX_SECCOMP_H
3+
#define _UAPI_LINUX_SECCOMP_H
4+
5+
#include <linux/compiler.h>
6+
#include <linux/types.h>
7+
8+
9+
/* Valid values for seccomp.mode and prctl(PR_SET_SECCOMP, <mode>) */
10+
#define SECCOMP_MODE_DISABLED 0 /* seccomp is not in use. */
11+
#define SECCOMP_MODE_STRICT 1 /* uses hard-coded filter. */
12+
#define SECCOMP_MODE_FILTER 2 /* uses user-supplied filter. */
13+
14+
/* Valid operations for seccomp syscall. */
15+
#define SECCOMP_SET_MODE_STRICT 0
16+
#define SECCOMP_SET_MODE_FILTER 1
17+
#define SECCOMP_GET_ACTION_AVAIL 2
18+
#define SECCOMP_GET_NOTIF_SIZES 3
19+
20+
/* Valid flags for SECCOMP_SET_MODE_FILTER */
21+
#define SECCOMP_FILTER_FLAG_TSYNC (1UL << 0)
22+
#define SECCOMP_FILTER_FLAG_LOG (1UL << 1)
23+
#define SECCOMP_FILTER_FLAG_SPEC_ALLOW (1UL << 2)
24+
#define SECCOMP_FILTER_FLAG_NEW_LISTENER (1UL << 3)
25+
#define SECCOMP_FILTER_FLAG_TSYNC_ESRCH (1UL << 4)
26+
/* Received notifications wait in killable state (only respond to fatal signals) */
27+
#define SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV (1UL << 5)
28+
29+
/*
30+
* All BPF programs must return a 32-bit value.
31+
* The bottom 16-bits are for optional return data.
32+
* The upper 16-bits are ordered from least permissive values to most,
33+
* as a signed value (so 0x8000000 is negative).
34+
*
35+
* The ordering ensures that a min_t() over composed return values always
36+
* selects the least permissive choice.
37+
*/
38+
#define SECCOMP_RET_KILL_PROCESS 0x80000000U /* kill the process */
39+
#define SECCOMP_RET_KILL_THREAD 0x00000000U /* kill the thread */
40+
#define SECCOMP_RET_KILL SECCOMP_RET_KILL_THREAD
41+
#define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */
42+
#define SECCOMP_RET_ERRNO 0x00050000U /* returns an errno */
43+
#define SECCOMP_RET_USER_NOTIF 0x7fc00000U /* notifies userspace */
44+
#define SECCOMP_RET_TRACE 0x7ff00000U /* pass to a tracer or disallow */
45+
#define SECCOMP_RET_LOG 0x7ffc0000U /* allow after logging */
46+
#define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */
47+
48+
/* Masks for the return value sections. */
49+
#define SECCOMP_RET_ACTION_FULL 0xffff0000U
50+
#define SECCOMP_RET_ACTION 0x7fff0000U
51+
#define SECCOMP_RET_DATA 0x0000ffffU
52+
53+
/**
54+
* struct seccomp_data - the format the BPF program executes over.
55+
* @nr: the system call number
56+
* @arch: indicates system call convention as an AUDIT_ARCH_* value
57+
* as defined in <linux/audit.h>.
58+
* @instruction_pointer: at the time of the system call.
59+
* @args: up to 6 system call arguments always stored as 64-bit values
60+
* regardless of the architecture.
61+
*/
62+
struct seccomp_data {
63+
int nr;
64+
__u32 arch;
65+
__u64 instruction_pointer;
66+
__u64 args[6];
67+
};
68+
69+
struct seccomp_notif_sizes {
70+
__u16 seccomp_notif;
71+
__u16 seccomp_notif_resp;
72+
__u16 seccomp_data;
73+
};
74+
75+
struct seccomp_notif {
76+
__u64 id;
77+
__u32 pid;
78+
__u32 flags;
79+
struct seccomp_data data;
80+
};
81+
82+
/*
83+
* Valid flags for struct seccomp_notif_resp
84+
*
85+
* Note, the SECCOMP_USER_NOTIF_FLAG_CONTINUE flag must be used with caution!
86+
* If set by the process supervising the syscalls of another process the
87+
* syscall will continue. This is problematic because of an inherent TOCTOU.
88+
* An attacker can exploit the time while the supervised process is waiting on
89+
* a response from the supervising process to rewrite syscall arguments which
90+
* are passed as pointers of the intercepted syscall.
91+
* It should be absolutely clear that this means that the seccomp notifier
92+
* _cannot_ be used to implement a security policy! It should only ever be used
93+
* in scenarios where a more privileged process supervises the syscalls of a
94+
* lesser privileged process to get around kernel-enforced security
95+
* restrictions when the privileged process deems this safe. In other words,
96+
* in order to continue a syscall the supervising process should be sure that
97+
* another security mechanism or the kernel itself will sufficiently block
98+
* syscalls if arguments are rewritten to something unsafe.
99+
*
100+
* Similar precautions should be applied when stacking SECCOMP_RET_USER_NOTIF
101+
* or SECCOMP_RET_TRACE. For SECCOMP_RET_USER_NOTIF filters acting on the
102+
* same syscall, the most recently added filter takes precedence. This means
103+
* that the new SECCOMP_RET_USER_NOTIF filter can override any
104+
* SECCOMP_IOCTL_NOTIF_SEND from earlier filters, essentially allowing all
105+
* such filtered syscalls to be executed by sending the response
106+
* SECCOMP_USER_NOTIF_FLAG_CONTINUE. Note that SECCOMP_RET_TRACE can equally
107+
* be overriden by SECCOMP_USER_NOTIF_FLAG_CONTINUE.
108+
*/
109+
#define SECCOMP_USER_NOTIF_FLAG_CONTINUE (1UL << 0)
110+
111+
struct seccomp_notif_resp {
112+
__u64 id;
113+
__s64 val;
114+
__s32 error;
115+
__u32 flags;
116+
};
117+
118+
#define SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP (1UL << 0)
119+
120+
/* valid flags for seccomp_notif_addfd */
121+
#define SECCOMP_ADDFD_FLAG_SETFD (1UL << 0) /* Specify remote fd */
122+
#define SECCOMP_ADDFD_FLAG_SEND (1UL << 1) /* Addfd and return it, atomically */
123+
124+
/**
125+
* struct seccomp_notif_addfd
126+
* @id: The ID of the seccomp notification
127+
* @flags: SECCOMP_ADDFD_FLAG_*
128+
* @srcfd: The local fd number
129+
* @newfd: Optional remote FD number if SETFD option is set, otherwise 0.
130+
* @newfd_flags: The O_* flags the remote FD should have applied
131+
*/
132+
struct seccomp_notif_addfd {
133+
__u64 id;
134+
__u32 flags;
135+
__u32 srcfd;
136+
__u32 newfd;
137+
__u32 newfd_flags;
138+
};
139+
140+
#define SECCOMP_IOC_MAGIC '!'
141+
#define SECCOMP_IO(nr) _IO(SECCOMP_IOC_MAGIC, nr)
142+
#define SECCOMP_IOR(nr, type) _IOR(SECCOMP_IOC_MAGIC, nr, type)
143+
#define SECCOMP_IOW(nr, type) _IOW(SECCOMP_IOC_MAGIC, nr, type)
144+
#define SECCOMP_IOWR(nr, type) _IOWR(SECCOMP_IOC_MAGIC, nr, type)
145+
146+
/* Flags for seccomp notification fd ioctl. */
147+
#define SECCOMP_IOCTL_NOTIF_RECV SECCOMP_IOWR(0, struct seccomp_notif)
148+
#define SECCOMP_IOCTL_NOTIF_SEND SECCOMP_IOWR(1, \
149+
struct seccomp_notif_resp)
150+
#define SECCOMP_IOCTL_NOTIF_ID_VALID SECCOMP_IOW(2, __u64)
151+
/* On success, the return value is the remote process's added fd number */
152+
#define SECCOMP_IOCTL_NOTIF_ADDFD SECCOMP_IOW(3, \
153+
struct seccomp_notif_addfd)
154+
155+
#define SECCOMP_IOCTL_NOTIF_SET_FLAGS SECCOMP_IOW(4, __u64)
156+
157+
#endif /* _UAPI_LINUX_SECCOMP_H */

tools/perf/check-headers.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ FILES=(
2121
"include/uapi/linux/perf_event.h"
2222
"include/uapi/linux/prctl.h"
2323
"include/uapi/linux/sched.h"
24+
"include/uapi/linux/seccomp.h"
2425
"include/uapi/linux/stat.h"
2526
"include/uapi/linux/usbdevice_fs.h"
2627
"include/uapi/linux/vhost.h"

0 commit comments

Comments
 (0)