16d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org/* 26d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * seccomp example for x86 (32-bit and 64-bit) with BPF macros 36d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * 46d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * Copyright (c) 2012 The Chromium OS Authors <chromium-os-dev@chromium.org> 56d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * Authors: 66d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * Will Drewry <wad@chromium.org> 76d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * Kees Cook <keescook@chromium.org> 86d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * 96d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 106d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * found in the LICENSE file. 116d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * 126d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org * A stripped down version of the file found in this tutorial: http://outflux.net/teach-seccomp/. 136d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org */ 146d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#ifndef _SECCOMP_BPF_H_ 156d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#define _SECCOMP_BPF_H_ 166d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org 176d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#define _GNU_SOURCE 1 186d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <stdio.h> 196d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <stddef.h> 206d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <stdlib.h> 216d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <errno.h> 226d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <signal.h> 236d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <string.h> 246d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <unistd.h> 256d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org 266d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <sys/prctl.h> 27d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org#ifndef PR_SET_NO_NEW_PRIVS 28d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org# define PR_SET_NO_NEW_PRIVS 38 29d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org#endif 306d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org 316d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <linux/unistd.h> 326d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <linux/audit.h> 336d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#include <linux/filter.h> 34d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org#ifdef HAVE_LINUX_SECCOMP_H 35d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org# include <linux/seccomp.h> 36d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org#endif 37d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org#ifndef SECCOMP_MODE_FILTER 38d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org# define SECCOMP_MODE_FILTER 2 /* uses user-supplied filter. */ 39d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org# define SECCOMP_RET_KILL 0x00000000U /* kill the task immediately */ 40d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org# define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */ 41d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org# define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */ 42d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.orgstruct seccomp_data { 43d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org int nr; 44d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org __u32 arch; 45d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org __u64 instruction_pointer; 46d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org __u64 args[6]; 47d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org}; 48d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org#endif 49d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org#ifndef SYS_SECCOMP 50d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org# define SYS_SECCOMP 1 51d6cab4a6af217e4128e69a4e1b9da7abf26d6cc2commit-bot@chromium.org#endif 526d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org 536d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#define syscall_nr (offsetof(struct seccomp_data, nr)) 546d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org 556d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#define EXAMINE_SYSCALL \ 566b43f50761a3deb85b27c785e52ffaab25bbcb80skia.committer@gmail.com BPF_STMT(BPF_LD+BPF_W+BPF_ABS, syscall_nr) 576d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org 586d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#define ALLOW_SYSCALL(name) \ 596b43f50761a3deb85b27c785e52ffaab25bbcb80skia.committer@gmail.com BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_##name, 0, 1), \ 606b43f50761a3deb85b27c785e52ffaab25bbcb80skia.committer@gmail.com BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW) 616d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org 626d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#define KILL_PROCESS \ 636b43f50761a3deb85b27c785e52ffaab25bbcb80skia.committer@gmail.com BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL) 646d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org 656d036c2e47819ce91ba4f09edeeccead60af4320commit-bot@chromium.org#endif /* _SECCOMP_BPF_H_ */ 66