Можно ли применить профиль SECCOMP ядра Linux из процесса Go?

Я пытаюсь реализовать трассировщик системных вызовов с поддержкой ядро SECCOMP фильтрует, чтобы уменьшить накладные расходы, отфильтровывая несколько типов системных вызовов.

Все реализации, которые я нашел, написаны на C, я не могу понять, как сопоставить их с Go из-за особых соображений с Go threading/go-routines и fork().

Пример кода (С):

if ((pid = fork()) == 0) {

    ptrace(PTRACE_TRACEME, 0, 0, 0);
    /* To avoid the need for CAP_SYS_ADMIN */
    if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) {
        perror("prctl(PR_SET_NO_NEW_PRIVS)");
        return 1;
    }
    if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) == -1) {
        perror("when setting seccomp filter");
        return 1;
    }
    kill(getpid(), SIGSTOP);
    return execvp(argv[1], argv + 1);

После некоторых исследований я обнаружил, что для выполнения fork() функции в Go Lang мы можем использовать syscall. ForkExec или exec.Command, но оба они ограничены набор операций перед выполнением, которые можно настроить с помощью параметра syscall.SysProcAttr, а он поддерживает вызов PTRACE_TRACEME, но не поддерживает prctl(), необходимый для SECCOMP.

Есть ли способ запустить отслеживаемый дочерний процесс seccomped из процесса, сгенерированного GoLang?


person João Pinto    schedule 22.07.2020    source источник
comment
Причина, по которой у вас нет указанных параметров, заключается в том, что вы просматриваете кроссплатформенную библиотеку и ищете персонал для Linux (Seccomp). Я не сделал того, о чем вы просите, но нашел это: golang.org/pkg/syscall/ #Syscall и пример здесь: stackoverflow.com/a/43183700/544721 , может быть, это то, как вы хотели бы подойти к нему?   -  person Grzegorz Wierzowiecki    schedule 23.07.2020
comment
У меня не было требований к кросс-платформенной библиотеке, я просто не нашел никаких предложений напрямую использовать системный вызов fork(). Я дам ему попробовать. Не могли бы вы предоставить свой комментарий в качестве ответа? Если это работает, это правильно отвечает на мой вопрос :)   -  person João Pinto    schedule 24.07.2020


Ответы (1)


Для этого можно использовать две библиотеки:

  1. https://godoc.org/github.com/tfogal/ptrace — Пакет ptrace предоставляет интерфейс для системного вызова ptrace.
  2. https://godoc.org/github.com/seccomp/libseccomp-golang - Пакет seccomp предоставляет привязки для libseccomp, библиотеки, обертывающей системный вызов Linux seccomp. Seccomp позволяет приложению ограничивать использование системных вызовов для себя и своих потомков.

Отказ от ответственности: я программист на С и внес свой вклад в libseccomp; но golang не моя специальность, поэтому я не уверен, что эквивалент вашего примера кода будет на этом языке.

person oxr463    schedule 28.08.2020