Como desabilitar o comando ‘kill’ no Linux

Como desabilitar o comando ‘kill’ no Linux

Quero desabilitar todos os comandos kill (incluindo o usuário root). Tentei alterar as permissões, mas ainda pode ser executado. Existe uma maneira de fazer isso?

Responder1

"Desativar" killo root, mesmo que fosse possível, provavelmente teria efeitos colaterais indesejados, como mau funcionamento de scripts do sistema e, no pior (mas provável), cenário, impediria o computador de inicializar corretamente (ou até mesmodesligandoapropriadamente).

Também para um usuário isso causaria problemas. Tenho, por exemplo, scripts que executo como usuário sem privilégios, que verificam se determinados processos estão sendo executados usando kill -0 $pid. Esses scripts parariam de funcionar.

Para você, você poderia aliascomandar killoutra coisa, como echo "kill":

$ alias kill='echo "kill"'

Isso impediria killpelo menos fazer algo útil na linha de comando:

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

Responder2

Use este módulo do kernel para desabilitar a killchamada do sistema no amd64.
Use por sua conta e risco. São esperados efeitos colaterais devastadores.

#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;
}

Compile-o como faria com qualquer outro módulo. Então use insmodnele.

Responder3

Vocênão deveriadesative-o em todo o sistema, porque ele é usado em scripts do sistema (por exemplo, no /etc/init.d/functionspacote initscripts).

Você pode desativá-lopara o shell de login(e suas subcamadas) poralias'fazendo isso, digamos, true/ false(ou algo como kill_disabledse você deseja obter um erro em vez de um modo autônomo).

Observe que esta forma não é infalível: afetará apenas comandos executados diretamente (não aqueles dentro de scripts). E o usuário poderá remover o alias com unalias.


Para fazer isso, execute o seguinte comando

alias kill=kill_disabled

ou adicione-o a um apropriadobasharquivo de inicializaçãopara executá-lo a cada login.

Agora, a execução killinterativa produzirá:

$ kill 9999
-bash: kill_disabled: command not found

Como eu disse, o caminho acima é facilmente subvertido. Se você precisar de uma maneira infalível, a única solução é executar toda a sessão do shell de login em umchrootambiente. Ele ainda desativará apenas ocomando de estoque,não é um syscall direto, porém feito. Este último não pode ser desabilitado porque é essencial para a operação normal (por exemplo, every Ctrl+ Csends SIGINT, pipes require SIGPIPEe processos em segundo plano são controlados com mais de cinco sinais diferentes). Configurar um ambiente chroot é uma tarefa avançada e geralmente inconveniente se o usuário precisar acessar todo o sistema de arquivos.

Responder4

Se você deseja que os usuários possam usar killnormalmente, exceto quando tentarem matar seu programa específico, você pode definir uma killfunção no .bashrcperfil do usuário e dentro desta função, verificar se o usuário está tentando matar seu programa. Caso contrário, você pode chamar o killutilitário de dentro da sua própria função.

Como exemplo, escrevi uma pequena função kill que não matará o sleeputilitário, mas funcionará como um utilitário kill normal para qualquer outro parâmetro fornecido a ele.

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

informação relacionada