#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/prctl.h>
#include <linux/seccomp.h>
#include <linux/filter.h>
#include <stddef.h>
#include <signal.h>
#include <string.h>
int main() {
// Проверяем поддержку seccomp
int seccomp_supported = syscall(SYS_seccomp, SECCOMP_GET_ACTION_AVAIL, 0, NULL);
if (seccomp_supported == -1) {
printf("Seccomp не поддерживается этим ядром (нужно ядро 3.17+)\n");
printf("Работаем без фильтрации...\n");
// Демонстрация без фильтра
printf("Hello World\n");
fork(); // Сработает нормально
return 0;
}
// BPF программа
struct sock_filter filter[] = {
BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
offsetof(struct seccomp_data, nr)),
// write (1)
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 1, 0),
// exit_group (231)
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 231, 1, 0),
// kill
BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_KILL),
// allow
BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW),
};
struct sock_fprog prog = {
.len = sizeof(filter) / sizeof(filter[0]),
.filter = filter,
};
// Отключаем новые привилегии
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) {
perror("prctl");
printf("Запустите с sudo или установите capabilities:\n");
printf("sudo setcap cap_sys_admin+ep ./seccomp_demo\n");
return 1;
}
// Устанавливаем фильтр
if (syscall(SYS_seccomp, SECCOMP_SET_MODE_FILTER, 0, &prog) == -1) {
perror("seccomp");
printf("Ошибка установки фильтра. Попробуйте с sudo:\n");
printf("sudo ./seccomp_demo\n");
return 1;
}
printf("Seccomp работает!\n");
printf("Сейчас будет fork() который убьет процесс...\n");
sleep(1);
fork(); // Это убьет процесс
return 0;
}