В разделе SECCOMP_SET_MODE_STRICT
документа man 2 seccomp а> сказано, что:
Обратите внимание, что хотя вызывающий поток больше не может вызывать sigprocmask(2), он может использовать sigreturn(2) для блокировки всех сигналов, кроме SIGKILL и SIGSTOP.
Я не могу понять, как это сделать. sigreturn
это syscall
что
Этот вызов sigreturn() отменяет все, что было сделано — изменение маски сигнала процесса, переключение стеков сигналов (см. sigaltstack(2)) — для того, чтобы вызвать обработчик сигнала.
Более конкретно:
Используя информацию, которая ранее была сохранена в стеке пользовательского пространства,
sigreturn() восстанавливает маску сигнала процесса, переключает стеки и восстанавливает контекст процесса (флаги и регистры процессора, включая указатель стека и указатель инструкций),
Информация хранится:
Сохраненная информация о контексте процесса помещается в структуру ucontext_t (см. Ресурсы). Эта структура видна в обработчике сигнала как третий аргумент обработчика, установленного с помощью sigaction(2) с флагом SA_SIGINFO.
Я считал это невозможным по следующим 2 причинам:
Поскольку действие
TERM
для сигнала не требует возврата в пользовательское пространство, нет способа предотвратитьdying
с помощьюatexit
или чего-то подобного.2. Хотя можно заполнить
ucontext_t
с помощью man 2 getcontext или man 3 makecontext, это не помогите процессу заблокировать сигнал, поскольку все системные вызовы для установки обработчика и маскирования сигнала отключены (если толькоsigreturn
не выполняет саму маскировку сигнала).