Blame view
samples/seccomp/dropper.c
1.91 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 |
/* * Naive system call dropper built on seccomp_filter. * * 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_SET_SECCOMP, 2, ...). * * When run, returns the specified errno for the specified * system call number against the given architecture. * |
8ac270d1e Documentation: pr... |
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
*/ #include <errno.h> #include <linux/audit.h> #include <linux/filter.h> #include <linux/seccomp.h> #include <linux/unistd.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <sys/prctl.h> #include <unistd.h> static int install_filter(int nr, int arch, int error) { struct sock_filter filter[] = { BPF_STMT(BPF_LD+BPF_W+BPF_ABS, (offsetof(struct seccomp_data, arch))), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, arch, 0, 3), BPF_STMT(BPF_LD+BPF_W+BPF_ABS, (offsetof(struct seccomp_data, nr))), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, nr, 0, 1), BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ERRNO|(error & SECCOMP_RET_DATA)), BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW), }; struct sock_fprog prog = { .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), .filter = filter, }; |
1ff120504 samples/seccomp: ... |
45 46 47 48 |
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { perror("prctl(NO_NEW_PRIVS)"); return 1; } |
8ac270d1e Documentation: pr... |
49 |
if (prctl(PR_SET_SECCOMP, 2, &prog)) { |
1ff120504 samples/seccomp: ... |
50 |
perror("prctl(PR_SET_SECCOMP)"); |
8ac270d1e Documentation: pr... |
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 |
return 1; } return 0; } int main(int argc, char **argv) { if (argc < 5) { fprintf(stderr, "Usage: " "dropper <syscall_nr> <arch> <errno> <prog> [<args>] " "Hint: AUDIT_ARCH_I386: 0x%X " " AUDIT_ARCH_X86_64: 0x%X " " ", AUDIT_ARCH_I386, AUDIT_ARCH_X86_64); return 1; } if (install_filter(strtol(argv[1], NULL, 0), strtol(argv[2], NULL, 0), strtol(argv[3], NULL, 0))) return 1; execv(argv[4], &argv[4]); printf("Failed to execv "); return 255; } |