5

Я хочу отключить все команды уничтожения (включая пользователя root). Я пытался изменить разрешения, но он все еще может быть выполнен. Есть способ сделать это?

4 ответа4

63

Используйте этот модуль ядра, чтобы отключить системный вызов kill на amd64 .
Используйте на свой риск. Ожидаются разрушительные побочные эффекты.

#include <linux/module.h>

MODULE_LICENSE("GPL");

int __init init(void) __attribute__((noreturn))
{
     unsigned long long cr0 = read_cr0();
     write_cr0(cr0 & ~(1 << 16));  /* Clear Write Protection (WP) bit */
     *(unsigned char *)sys_kill = 0xc3;  /* opcode for "ret" */
     write_cr0(cr0);

     /* This makes sure that delete_module below won't complain */
     __this_module.refcnt = 1;
     __this_module.state = MODULE_STATE_LIVE;

     asm volatile
     (
          "mov %0, %%rsp\n\t" /* It seems GCC refuses to mess with the stack pointer */
          "jmp sys_delete_module\n\t"  /* call delete_module(name, flags) */
          :: "r"(current->stack + THREAD_SIZE - sizeof(struct pt_regs) - 8), "D"(__this_module.name), "S"(0) :
     );
}

void __exit exit(void)
{
    return;
}

Скомпилируйте его, как любой другой модуль. Тогда используйте insmod .

53

"Отключение" kill для root , даже если бы это было возможно, скорее всего, привело бы к нежелательным побочным эффектам, таким как сбой в работе системных скриптов, и в худшем (но вероятном) сценарии это помешало бы вашему компьютеру правильно загрузиться (или даже выключиться). должным образом).

Для пользователя это тоже может вызвать проблемы. У меня есть, например, сценарии, которые я запускаю как непривилегированный пользователь, который проверяет, запущены ли определенные процессы с использованием kill -0 $pid . Эти сценарии перестанут работать.

Для себя вы можете использовать alias команды kill для чего-то другого, например, echo "kill":

$ alias kill='echo "kill"'

Это помешает kill сделать что-нибудь полезное из командной строки, по крайней мере:

$ kill -s HUP $$
kill -s HUP 11985
7

Не следует отключать его для всей системы, поскольку он используется в системных скриптах (например, в /etc/init.d/functions в пакете initscripts ).

Вы можете отключить его для оболочки входа в систему (и ее подоболочек), присвоив ей alias , скажем, true/false (или что-то вроде kill_disabled если вы хотите получить ошибку, а не no-op).

Обратите внимание, что этот способ не защищен от ошибок: он влияет только на команды, выполняемые напрямую (а не на те, которые находятся внутри скриптов). И пользователь сможет удалить псевдоним с unalias .


Для этого выполните следующую команду

alias kill=kill_disabled

или добавьте его в соответствующий файл запуска bash чтобы запускать его при каждом входе в систему.

Теперь интерактивный запуск kill приведет к:

$ kill 9999
-bash: kill_disabled: command not found

Как я уже сказал, вышеуказанный способ легко подрывается. Если вам нужен надежный способ, единственное решение - запустить весь сеанс оболочки входа в среде chroot . Он по-прежнему будет отключать только команду stock, а не прямой системный вызов, как бы то ни было. Последнее не может быть отключено, потому что это важно для нормальной работы (например, каждый Ctrl + C отправляет SIGINT , каналы требуют SIGPIPE , а фоновые процессы контролируются более чем пятью различными сигналами). Настройка среды chroot является сложной задачей и, как правило, неудобна, если пользователю требуется доступ ко всей файловой системе.

4

Если вы хотите, чтобы пользователи могли использовать kill обычным образом, за исключением случаев, когда они пытаются уничтожить вашу конкретную программу, вы можете определить функцию kill в .bashrc профиля пользователя и в этой функции проверить, пытается ли пользователь уничтожить ваша программа Если нет, вы можете вызвать утилиту kill из самой функции.

В качестве примера я написал небольшую функцию kill, которая не будет уничтожать утилиту sleep но будет функционировать как обычная утилита уничтожения для любого другого параметра, предоставленного ей.

function kill() {
    process=$(ps -p "${@: -1}" | awk 'END{print $(NF)}');
    if [[ $process == "sleep"]]
    then
        echo "Killing $process is not allowed"
    else
        /bin/kill $@
    fi
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .