| #include <errno.h> |
| #include <seccomp.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
|
|
| int main(int argc, char* argv[]) { |
| if (argc < 2) { |
| fprintf(stderr, "Usage: %s <command> [args...]\n", argv[0]); |
| return EXIT_FAILURE; |
| } |
|
|
| scmp_filter_ctx ctx; |
|
|
| |
| ctx = seccomp_init(SCMP_ACT_ALLOW); |
| if (ctx == NULL) { |
| perror("seccomp_init"); |
| return EXIT_FAILURE; |
| } |
|
|
| |
|
|
| |
| |
| |
|
|
| |
| |
| |
|
|
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(connect), 0); |
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(accept), 0); |
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(send), 0); |
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(sendto), 0); |
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(sendmsg), 0); |
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(recv), 0); |
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(recvfrom), 0); |
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(recvmsg), 0); |
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(setsockopt), 0); |
| seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(getsockopt), 0); |
|
|
| |
| if (seccomp_load(ctx) < 0) { |
| perror("seccomp_load"); |
| seccomp_release(ctx); |
| return EXIT_FAILURE; |
| } |
|
|
| #ifdef DEBUG |
| printf("seccomp filter installed. Network access is blocked.\n"); |
| #endif |
|
|
| |
| execvp(argv[1], argv + 1); |
|
|
| seccomp_release(ctx); |
| return EXIT_SUCCESS; |
| } |
|
|