O comando top
lê os dados do proc, que são fornecidos diretamente do kernel. Para esconder processos, você teria que usar código dentro do kernel para fazer o mascaramento.
Além de usar uma estrutura de segurança como o SELinux e o grsecurity (mencionadas nas outras respostas), o código no estilo rootkit é sua única opção restante. Eu digo "estilo" porque um "rootkit" por si só não é ruim, é como é usado. Existem razões perfeitamente legítimas por trás da ocultação de processos de outros usuários, e é por isso que essa capacidade existe em estruturas de segurança.
A rota básica que você deve seguir para fazer isso funcionar é ligar (ou sequestrar, dependendo de como você olha) a (s) função (ões) no kernel linux que distribui os dados /proc/pid/
. Eu demonstro um método de ligar as funções do kernel do Linux em um módulo de segurança que escrevi:
link
O código "alto nível" para isso está no método hijack_syscalls()
em security.c
, e a mágica do diabo nos detalhes por trás dele está no arquivo hijacks.c
.
Você provavelmente encontrará a (s) função (ões) que você irá querer conectar no diretório fs/proc/
do código-fonte do kernel do linux. Tenha em mente que o Linux não fornece uma ABI estável, então seu código precisará mudar um pouco para que funcione em diferentes versões do kernel do Linux. Além disso, lembre-se de que você precisa de acesso root completo à máquina para poder inserir este código.
ATUALIZAÇÃO:
Se você encapsular o símbolo do kernel pid_getattr
com algum código adicional, é muito fácil fazer isso. Eu adicionei recentemente algo que oculta processos ao módulo do kernel acima:
link
Você pode fazer algo semelhante, tornando os processos de um determinado usuário ou grupo não visíveis para ninguém, exceto para o usuário root. Fazê-lo pelo nome do processo é um pouco mais complexo, mas possível. Dê uma olhada na função exe_from_mm()
. Observe que pode haver implicações no desempenho de usá-lo dentro de pid_getattr
.