Разрешить / sbin / init быть SIGSTOPed? - PullRequest
0 голосов
/ 10 ноября 2010

Я знаю, что / sbin / init имеет специальную защиту от SIGKILL и SIGSTOP из ядра по очевидным причинам.

Я пытался сообщить ядру, что хочу получить SIGSTOP с помощью ioctl () (аналогично запросам SIGABRT и SIGSEGV в main ()):

if (ioctl (0, KDSIGACCEPT, SIGSTOP) == 0) {
    nih_signal_set_handler (SIGSTOP, stop_handler);

но STOP не приходит в stop_handler () (насколько я знаю, поскольку nih_error () не печатается в журналах).

В stop_handler () я переустанавливаю Sighandler STOP на SIG_DFL (в противном случае он все равно возвращается к нашему обработчику), но это, вероятно, приводит к тому, что ядро ​​снова его игнорирует.

Как мне сообщить ядру, что я хочу остановить init?

1 Ответ

2 голосов
/ 10 ноября 2010

Вы должны будете убрать флаг SIGNAL_UNKILLABLE из флагов своей структуры struct signal_struct.

По умолчанию (т. Е. Всегда в неизмененных системах Linux) флаг SIGNAL_UNKILLABLE устанавливается для флагов init_sign_struct.

Вы могли бы написать модуль ядра, который выкинул бы структуру задачи init, чтобы изменить его, затем вы могли бы послать сигнал остановки в init.

Отправка сигнала остановки в init - очень плохая идея, поскольку зомби быстро размножались бы, если бы init больше не пожинал их.


Пояснение: это структура в ядре, не являющаяся частью исходного кода init, а также недоступная или не видимая из пространства пользователя. Чтобы изменить его, вам нужно написать код ядра или исправить ядро. Я полагаю, было бы довольно тривиально написать модуль ядра, который просто взламывает его.

...