Я хочу отключить все команды уничтожения (включая пользователя root). Я пытался изменить разрешения, но он все еще может быть выполнен. Есть способ сделать это?
4 ответа
Используйте этот модуль ядра, чтобы отключить системный вызов 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 .
"Отключение" kill для root , даже если бы это было возможно, скорее всего, привело бы к нежелательным побочным эффектам, таким как сбой в работе системных скриптов, и в худшем (но вероятном) сценарии это помешало бы вашему компьютеру правильно загрузиться (или даже выключиться). должным образом).
Для пользователя это тоже может вызвать проблемы. У меня есть, например, сценарии, которые я запускаю как непривилегированный пользователь, который проверяет, запущены ли определенные процессы с использованием kill -0 $pid . Эти сценарии перестанут работать.
Для себя вы можете использовать alias команды kill для чего-то другого, например, echo "kill":
$ alias kill='echo "kill"'
Это помешает kill сделать что-нибудь полезное из командной строки, по крайней мере:
$ kill -s HUP $$
kill -s HUP 11985
Не следует отключать его для всей системы, поскольку он используется в системных скриптах (например, в /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 является сложной задачей и, как правило, неудобна, если пользователю требуется доступ ко всей файловой системе.
Если вы хотите, чтобы пользователи могли использовать 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
}
