Como tornar um processo invisível para outros usuários?

19

Como você pode iniciar um processo e torná-lo invisível ao topcomando? O processo é iniciado por um usuário normal (não raiz) e não deve estar visível para outros usuários normais.

Depurador
fonte
1
Esse tipo de derrota o objetivo do topo e seria muito fácil de abusar. Por que não simplesmente renomear o processo? this_is_not_the_process_you_are_looking_for?
Entendo, que tal esconder o usuário?
5
Por favor, diga-nos que você não está tentando escrever um kit raiz. Você pode explicar seu cenário para que talvez possamos sugerir uma arquitetura de segurança melhor em vez de uma que seja geralmente considerada um comportamento "maligno"?
Caleb
2
Você pode usar grsecurity ou SELinux . Ambos requerem intervenção raiz para a configuração inicial.
Gilles 'SO- stop be evil'

Respostas:

11

O topcomando lê os dados do proc, que é fornecido diretamente do kernel. Para ocultar processos, você teria que usar código dentro do kernel para fazer o mascaramento.

Além de usar uma estrutura de segurança como SELinux e grsecurity (mencionada 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. Há razões perfeitamente legítimas por trás da ocultação de processos de outros usuários, razão pela qual esse recurso existe nas estruturas de segurança.

A rota básica que você precisa seguir para que isso funcione é conectar (ou seqüestrar, dependendo de como você olha) as funções no kernel do Linux que distribuem os /proc/pid/dados. Eu demonstro um método de ligação às funções do kernel do linux em um módulo de segurança que escrevi:

https://github.com/cormander/tpe-lkm

O código de "alto nível" para isso está no hijack_syscalls()método in security.c, e a mágica do diabo nos detalhes por trás dele está no hijacks.carquivo.

Você provavelmente encontrará as funções nas quais deseja se conectar no fs/proc/diretório do código-fonte do kernel do linux. Lembre-se de que o linux não fornece uma ABI estável; portanto, seu código precisará mudar um pouco para fazê-lo funcionar 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 esse código.

ATUALIZAR:

Se você envolver o pid_getattrsímbolo do kernel com algum código adicional, será muito fácil fazer isso. Recentemente, adicionei algo que oculta processos ao módulo do kernel acima:

https://github.com/cormander/tpe-lkm/commit/899bd5d74764af343d5fee1d8058756ddc63bfe3

Você pode fazer algo semelhante, tornando os processos de um determinado usuário ou grupo não visíveis por ninguém, exceto root e esse usuário. Fazer isso pelo nome do processo é um pouco mais complexo, mas possível. Dê uma olhada na exe_from_mm()função. Observe que pode haver implicações no desempenho de usá-lo dentro de pid_getattr.

Corey Henderson
fonte
4

Parece as duas opções principais.

  • O Selinux trabalha colocando pessoas diferentes em diferentes domínios de segurança e, de certa forma, encaixotando-as na areia para que elas não possam ver as coisas umas das outras. Isso é abordado nesta questão . Como o selinux está rapidamente se tornando a estrutura de segurança de fato no mundo Linux, essa é provavelmente a direção que você deve procurar.

  • O outro é a segurança, conforme mencionado por marioosh e conforme solicitado nesta pergunta . Algumas distribuições têm pacotes alternativos de kernel com patches de segurança aplicados. Se o seu tiver isso, você pode usá-los.

Se, por algum motivo, você quiser fazer isso sem a adição de uma estrutura de segurança como selinux ou grsecurity, explique como o que você está fazendo não está escrevendo um kit raiz.

Caleb
fonte
1

Não é tão simples na caixa Linux padrão. Veja a grsecurity , mas ela requer correção do kernel etc.

marioosh
fonte
2
Eu acho que isso vem de fábrica com um kernel selinux.
user606723
0

Você pode escrever um comando equivalente que funcione da mesma maneira top, mas não exiba processos que correspondam a um nome específico. Como alternativa, você pode obter o código-fonte do topcomando e modificá-lo de acordo. Você pode substituir o topcomando /usr/sbin(ou onde quer que esteja) por sua versão.

LawrenceC
fonte
2
Substituir 'top' não impede que um usuário faça o que top faz.
Tim Post
2
Não, mas a pergunta foi feita como tornar os processos invisíveis ao topcomando.
LawrenceC