From 63e9d849f662d1a494c6396d4a439cd4c91dfa7e Mon Sep 17 00:00:00 2001 From: Topi Miettinen Date: Sun, 13 Aug 2017 14:07:31 +0300 Subject: Allow any syscall to be blacklisted (#1447) Allow any syscall to be blacklisted with aid of LD_PRELOAD library, libpostexecseccomp.so. Closes: #1447 --- src/libpostexecseccomp/libpostexecseccomp.c | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/libpostexecseccomp/libpostexecseccomp.c (limited to 'src/libpostexecseccomp/libpostexecseccomp.c') diff --git a/src/libpostexecseccomp/libpostexecseccomp.c b/src/libpostexecseccomp/libpostexecseccomp.c new file mode 100644 index 000000000..801f968a6 --- /dev/null +++ b/src/libpostexecseccomp/libpostexecseccomp.c @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2017 Firejail Authors + * + * This file is part of firejail project + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ +#include "libpostexecseccomp.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +__attribute__((constructor)) +static void load_seccomp(void) { + int fd = open(RUN_SECCOMP_POSTEXEC, O_RDONLY); + if (fd == -1) + return; + + int size = lseek(fd, 0, SEEK_END); + unsigned short entries = (unsigned short) size / (unsigned short) sizeof(struct sock_filter); + struct sock_filter *filter = MAP_FAILED; + if (size != 0) + filter = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); + + close(fd); + + if (size == 0 || filter == MAP_FAILED) + return; + + // install filter + struct sock_fprog prog = { + .len = entries, + .filter = filter, + }; + + prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); + prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); + munmap(filter, size); +} -- cgit v1.2.3-54-g00ecf