Como desabilitar o comando 'kill' no Linux

5

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

    
por xxlali 22.06.2016 / 08:41

4 respostas

53

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

Para um usuário, também, causaria problemas. Eu tenho, por exemplo, scripts que eu executo como um usuário sem privilégios, que verifica se determinados processos estão sendo executados usando kill -0 $pid . Esses scripts parariam de funcionar.

Você mesmo pode usar alias o comando kill como outra coisa, como echo "kill" :

$ alias kill='echo "kill"'

Isso evitaria que kill fizesse algo útil na linha de comando, pelo menos:

$ kill -s HUP $$
kill -s HUP 11985
    
por 22.06.2016 / 09:14
63

Use este módulo do kernel para desabilitar a chamada do sistema kill em amd64 .
Use por sua conta e risco. Efeitos colaterais devastadores são esperados.

#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 como você faria com qualquer outro módulo. Então use insmod nele.

    
por 22.06.2016 / 12:48
7

Você não deve desativá-lo em todo o sistema, porque ele é usado em scripts do sistema (por exemplo, em /etc/init.d/functions no pacote initscripts ).

Você pode desativá-lo para o shell de login (e seus subshells) por alias 'indo para, digamos, true / false (ou algo parecido com kill_disabled se você deseja obter um erro em vez de um não operacional).

Note que desta forma não é à prova de erros: só afetará 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 % arquivo de inicialização bash adequado para executá-lo em cada login.

Agora, a execução kill interativamente produzirá:

$ kill 9999
-bash: kill_disabled: command not found

Como eu disse, o caminho acima é facilmente subvertido. Se você precisa de uma maneira infalível, a única solução é executar toda a sessão do shell de login em um ambiente chroot . Ele ainda desativará apenas o comando stock, não um syscall direto, no entanto feito. O último não pode ser desativado, porque é essencial para a operação normal (por exemplo, cada Ctrl + C envia SIGINT , os pipes requerem SIGPIPE e os 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 o sistema de arquivos inteiro.

    
por 22.06.2016 / 09:05
4

Se você deseja que os usuários possam usar kill normalmente, exceto quando tentam eliminar seu programa específico, você pode definir uma função kill no .bashrc do perfil do usuário e dentro dessa função, verifique se o usuário está tentando matar seu programa. Se não, você pode chamar o utilitário kill de dentro da sua própria função.

Como exemplo, eu escrevi uma pequena função kill que não mata o utilitário sleep , mas funcionará como um utilitário de 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
}
    
por 26.06.2016 / 21:22