Blame view
samples/seccomp/bpf-fancy.c
2.48 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
8ac270d1e Documentation: pr... |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/* * Seccomp BPF example using a macro-based generator. * * Copyright (c) 2012 The Chromium OS Authors <chromium-os-dev@chromium.org> * Author: Will Drewry <wad@chromium.org> * * The code may be used by anyone for any purpose, * and can serve as a starting point for developing * applications using prctl(PR_ATTACH_SECCOMP_FILTER). */ #include <linux/filter.h> #include <linux/seccomp.h> #include <linux/unistd.h> #include <stdio.h> #include <string.h> #include <sys/prctl.h> #include <unistd.h> #include "bpf-helper.h" #ifndef PR_SET_NO_NEW_PRIVS #define PR_SET_NO_NEW_PRIVS 38 #endif int main(int argc, char **argv) { |
3a9af0bd3 samples/seccomp: ... |
29 30 31 |
struct bpf_labels l = { .count = 0, }; |
8ac270d1e Documentation: pr... |
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
static const char msg1[] = "Please type something: "; static const char msg2[] = "You typed: "; char buf[256]; struct sock_filter filter[] = { /* TODO: LOAD_SYSCALL_NR(arch) and enforce an arch */ LOAD_SYSCALL_NR, SYSCALL(__NR_exit, ALLOW), SYSCALL(__NR_exit_group, ALLOW), SYSCALL(__NR_write, JUMP(&l, write_fd)), SYSCALL(__NR_read, JUMP(&l, read)), DENY, /* Don't passthrough into a label */ LABEL(&l, read), ARG(0), JNE(STDIN_FILENO, DENY), ARG(1), JNE((unsigned long)buf, DENY), ARG(2), JGE(sizeof(buf), DENY), ALLOW, LABEL(&l, write_fd), ARG(0), JEQ(STDOUT_FILENO, JUMP(&l, write_buf)), JEQ(STDERR_FILENO, JUMP(&l, write_buf)), DENY, LABEL(&l, write_buf), ARG(1), JEQ((unsigned long)msg1, JUMP(&l, msg1_len)), JEQ((unsigned long)msg2, JUMP(&l, msg2_len)), JEQ((unsigned long)buf, JUMP(&l, buf_len)), DENY, LABEL(&l, msg1_len), ARG(2), JLT(sizeof(msg1), ALLOW), DENY, LABEL(&l, msg2_len), ARG(2), JLT(sizeof(msg2), ALLOW), DENY, LABEL(&l, buf_len), ARG(2), JLT(sizeof(buf), ALLOW), DENY, }; struct sock_fprog prog = { .filter = filter, .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), }; ssize_t bytes; bpf_resolve_jumps(&l, filter, sizeof(filter)/sizeof(*filter)); if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { perror("prctl(NO_NEW_PRIVS)"); return 1; } if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) { perror("prctl(SECCOMP)"); return 1; } syscall(__NR_write, STDOUT_FILENO, msg1, strlen(msg1)); bytes = syscall(__NR_read, STDIN_FILENO, buf, sizeof(buf)-1); bytes = (bytes > 0 ? bytes : 0); syscall(__NR_write, STDERR_FILENO, msg2, strlen(msg2)); syscall(__NR_write, STDERR_FILENO, buf, bytes); /* Now get killed */ syscall(__NR_write, STDERR_FILENO, msg2, strlen(msg2)+2); return 0; } |