Запуск процесса из C с профилем seccomp

Я хочу запустить процесс с примененным к нему профилем seccomp (можно из C, терминала и т.д.). В частности, я бы хотел, чтобы целевой команде не разрешалось читать и записывать какие-либо файлы, и она могла просто печатать на консоли. Временный контур C, который у меня есть, таков:

int main() {
    scmp_filter_ctx filter = load_filter();
    seccomp_load(filter);
    // execl([sample command with arguments], 0);
    execl("ls", 0)
}

У меня проблема в том, что execl использует некоторые системные вызовы, которые заблокированы в моем профиле. Как я могу гарантировать, что only применяется только к [sample command with arguments]. Опять же, это не обязательно должно быть на C. По сути, я хочу запустить некоторые исполняемые файлы и применить seccomp к этим процессам. Я использую Убунту 18.04.


person user100123122    schedule 14.05.2021    source источник


Ответы (1)


Вызовы exec* являются внешним интерфейсом к execve, реализация которого в пользовательском пространстве выглядит следующим образом:

int execve(const char *filename, char * const argv[], char * const envp[]) {
    return syscall(SYS_execve, filename, argv, envp);
}

ссылка: https://stackoverflow.com/a/7381910/544721

Поэтому вы можете захотеть оснастить желаемый двоичный файл для выполнения кода фильтров seccomp после загрузки. например с помощью двоичного инструментария (для добавления дополнительного кода) фактического двоичного файла.

person Grzegorz Wierzowiecki    schedule 15.05.2021