Загрузка данных


#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;
}