Index: experimental/webtry/seccomp_bpf.h |
diff --git a/experimental/webtry/seccomp_bpf.h b/experimental/webtry/seccomp_bpf.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c13782c995c02a0b47b626c14c25ef62071511ec |
--- /dev/null |
+++ b/experimental/webtry/seccomp_bpf.h |
@@ -0,0 +1,81 @@ |
+/* |
+ * seccomp example for x86 (32-bit and 64-bit) with BPF macros |
+ * |
+ * Copyright (c) 2012 The Chromium OS Authors <chromium-os-dev@chromium.org> |
+ * Authors: |
+ * Will Drewry <wad@chromium.org> |
+ * Kees Cook <keescook@chromium.org> |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
mtklein
2014/04/08 19:00:23
I gather this is pulled from chromium/src somewher
jcgregorio
2014/04/09 14:10:31
Stripped the file down to its absolute minimum and
|
+#ifndef _SECCOMP_BPF_H_ |
+#define _SECCOMP_BPF_H_ |
+ |
+#define _GNU_SOURCE 1 |
+#include <stdio.h> |
+#include <stddef.h> |
+#include <stdlib.h> |
+#include <errno.h> |
+#include <signal.h> |
+#include <string.h> |
+#include <unistd.h> |
+ |
+#include <sys/prctl.h> |
+#ifndef PR_SET_NO_NEW_PRIVS |
+# define PR_SET_NO_NEW_PRIVS 38 |
+#endif |
+ |
+#include <linux/unistd.h> |
+#include <linux/audit.h> |
+#include <linux/filter.h> |
+#ifdef HAVE_LINUX_SECCOMP_H |
+# include <linux/seccomp.h> |
+#endif |
+#ifndef SECCOMP_MODE_FILTER |
+# define SECCOMP_MODE_FILTER 2 /* uses user-supplied filter. */ |
+# define SECCOMP_RET_KILL 0x00000000U /* kill the task immediately */ |
+# define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */ |
+# define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */ |
+struct seccomp_data { |
+ int nr; |
+ __u32 arch; |
+ __u64 instruction_pointer; |
+ __u64 args[6]; |
+}; |
+#endif |
+#ifndef SYS_SECCOMP |
+# define SYS_SECCOMP 1 |
+#endif |
+ |
+#define syscall_nr (offsetof(struct seccomp_data, nr)) |
+#define arch_nr (offsetof(struct seccomp_data, arch)) |
+ |
+#if defined(__i386__) |
+# define REG_SYSCALL REG_EAX |
+# define ARCH_NR AUDIT_ARCH_I386 |
+#elif defined(__x86_64__) |
+# define REG_SYSCALL REG_RAX |
+# define ARCH_NR AUDIT_ARCH_X86_64 |
+#else |
+# warning "Platform does not support seccomp filter yet" |
+# define REG_SYSCALL 0 |
+# define ARCH_NR 0 |
+#endif |
+ |
+#define VALIDATE_ARCHITECTURE \ |
mtklein
2014/04/08 19:00:23
Is it important that I (or we, you?) understand wh
jcgregorio
2014/04/09 14:10:31
See above.
On 2014/04/08 19:00:23, mtklein wrote:
|
+ BPF_STMT(BPF_LD+BPF_W+BPF_ABS, arch_nr), \ |
+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ARCH_NR, 1, 0), \ |
+ BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL) |
+ |
+#define EXAMINE_SYSCALL \ |
+ BPF_STMT(BPF_LD+BPF_W+BPF_ABS, syscall_nr) |
+ |
+#define ALLOW_SYSCALL(name) \ |
+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_##name, 0, 1), \ |
+ BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW) |
+ |
+#define KILL_PROCESS \ |
+ BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL) |
+ |
+#endif /* _SECCOMP_BPF_H_ */ |