forked from SUNET/pkcs11-proxy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
258 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
#!/bin/bash | ||
(echo "static const char *syscall_names[] = {" | ||
echo "#include <sys/syscall.h>" | cpp -dM | grep '^#define __NR_' | LC_ALL=C sed -r -n -e 's/^\#define[ \t]+__NR_([a-z0-9_]+)[ \t]+([0-9]+)(.*)/ [\2] = "\1",/p' | ||
echo "};")> syscall-names.h |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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> | ||
* | ||
* The code may be used by anyone for any purpose, and can serve as a | ||
* starting point for developing applications using mode 2 seccomp. | ||
*/ | ||
#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 \ | ||
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_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
/* | ||
* syscall reporting example for seccomp | ||
* | ||
* Copyright (c) 2012 The Chromium OS Authors <chromium-os-dev@chromium.org> | ||
* Authors: | ||
* Will Drewry <wad@chromium.org> | ||
* Kees Cook <keescook@chromium.org> | ||
* | ||
* The code may be used by anyone for any purpose, and can serve as a | ||
* starting point for developing applications using mode 2 seccomp. | ||
*/ | ||
#include "syscall-reporter.h" | ||
#include "syscall-names.h" | ||
|
||
const char * const msg_needed = "Looks like you also need syscall: "; | ||
|
||
/* Since "sprintf" is technically not signal-safe, reimplement %d here. */ | ||
static void write_uint(char *buf, unsigned int val) | ||
{ | ||
int width = 0; | ||
unsigned int tens; | ||
|
||
if (val == 0) { | ||
strcpy(buf, "0"); | ||
return; | ||
} | ||
for (tens = val; tens; tens /= 10) | ||
++ width; | ||
buf[width] = '\0'; | ||
for (tens = val; tens; tens /= 10) | ||
buf[--width] = '0' + (tens % 10); | ||
} | ||
|
||
static void reporter(int nr, siginfo_t *info, void *void_context) | ||
{ | ||
char buf[128]; | ||
ucontext_t *ctx = (ucontext_t *)(void_context); | ||
unsigned int syscall; | ||
if (info->si_code != SYS_SECCOMP) | ||
return; | ||
if (!ctx) | ||
return; | ||
syscall = ctx->uc_mcontext.gregs[REG_SYSCALL]; | ||
strcpy(buf, msg_needed); | ||
if (syscall < sizeof(syscall_names)) { | ||
strcat(buf, syscall_names[syscall]); | ||
strcat(buf, "("); | ||
} | ||
write_uint(buf + strlen(buf), syscall); | ||
if (syscall < sizeof(syscall_names)) | ||
strcat(buf, ")"); | ||
strcat(buf, "\n"); | ||
write(STDERR_FILENO, buf, strlen(buf)); | ||
_exit(1); | ||
} | ||
|
||
int install_syscall_reporter(void) | ||
{ | ||
struct sigaction act; | ||
sigset_t mask; | ||
memset(&act, 0, sizeof(act)); | ||
sigemptyset(&mask); | ||
sigaddset(&mask, SIGSYS); | ||
|
||
act.sa_sigaction = &reporter; | ||
act.sa_flags = SA_SIGINFO; | ||
if (sigaction(SIGSYS, &act, NULL) < 0) { | ||
perror("sigaction"); | ||
return -1; | ||
} | ||
if (sigprocmask(SIG_UNBLOCK, &mask, NULL)) { | ||
perror("sigprocmask"); | ||
return -1; | ||
} | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
/* | ||
* syscall reporting example for seccomp | ||
* | ||
* Copyright (c) 2012 The Chromium OS Authors <chromium-os-dev@chromium.org> | ||
* Authors: | ||
* Kees Cook <keescook@chromium.org> | ||
* 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 mode 2 seccomp. | ||
*/ | ||
#ifndef _BPF_REPORTER_H_ | ||
#define _BPF_REPORTER_H_ | ||
|
||
#include "seccomp-bpf.h" | ||
|
||
/* Since this redfines "KILL_PROCESS" into a TRAP for the reporter hook, | ||
* we want to make sure it stands out in the build as it should not be | ||
* used in the final program. | ||
*/ | ||
#warning "You've included the syscall reporter. Do not use in production!" | ||
#undef KILL_PROCESS | ||
#define KILL_PROCESS \ | ||
BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_TRAP) | ||
|
||
extern int install_syscall_reporter(void); | ||
|
||
#endif |