Я хочу отключить все команды уничтожения (включая пользователя 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
}