Я пытаюсь реализовать трассировщик системных вызовов с поддержкой ядро 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?