如何在 Linux 上停用「kill」指令

如何在 Linux 上停用「kill」指令

我想禁用所有kill命令(包括root用戶)。我嘗試過更改權限,但仍然可以執行。有沒有辦法做到這一點?

答案1

kill即使root可能,「停用」也很可能會產生不必要的副作用,例如係統腳本故障,並且在最壞(但可能)的情況下,它會阻止您的電腦正常啟動(甚至關閉適當地)。

對於用戶來說,這也會造成問題。例如,我有作為非特權用戶運行的腳本,用於檢查某些進程是否正在使用kill -0 $pid.這些腳本將停止工作。

對你自己來說,你可以alias命令kill其他東西,例如echo "kill"

$ alias kill='echo "kill"'

kill至少會阻止在命令列上執行任何有用的操作:

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

答案2

使用此核心模組停用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在它上面。

答案3

不應該在系統範圍內停用它,因為它在系統腳本中使用(例如,在/etc/init.d/functions套件中initscripts)。

您可以禁用它用於登入 shell(及其子 shell)alias'ing它,比如說,true/ false(或類似的東西kill_disabled,如果你希望得到一個錯誤而不是一個空操作)。

請注意,這種方式並不是萬無一失的:它只會影響直接執行的命令(而不是腳本內的命令)。使用者將能夠使用 刪除別名unalias


為此,請執行以下命令

alias kill=kill_disabled

或將其添加到適當的bash啟動文件在每次登入時運行它。

現在,kill互動式運作將產生:

$ kill 9999
-bash: kill_disabled: command not found

正如我所說,上面的方式很容易被顛覆。如果您需要一種萬無一失的方法,唯一的解決方案是在chroot環境。它仍然只會禁用庫存命令,不是直接的系統調用,但完成了。後者不能被停用,因為它對於正常操作至關重要(例如, every Ctrl+C發送SIGINT,管道需要SIGPIPE,後台進程由五個以上不同的信號控制)。設定 chroot 環境是一項高階任務,如果使用者需要存取整個檔案系統,通常會很不方便。

答案4

如果您希望使用者能夠kill正常使用,除非他們試圖殺死您的特定程序,您可以在使用者設定kill檔中定義一個函數.bashrc,並在該函數中檢查使用者是否試圖殺死您的程式。如果沒有,您可以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
}

相關內容