Como você pode iniciar um processo e torná-lo invisível ao top
comando? O processo é iniciado por um usuário normal (não raiz) e não deve estar visível para outros usuários normais.
Como você pode iniciar um processo e torná-lo invisível ao top
comando? O processo é iniciado por um usuário normal (não raiz) e não deve estar visível para outros usuários normais.
Respostas:
O kernel do Linux desde o 3.3 contém suporte para ocultar processos para outros usuários.
Isso é feito por hidepid=
e gid=
opções de montagem para / proc, conforme descrito no commit e Documentation / filesystems / proc.txt correspondentes .
O Debian Wheezy também inclui esse recurso.
O top
comando 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.c
arquivo.
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_getattr
sí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
.
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.
Não é tão simples na caixa Linux padrão. Veja a grsecurity , mas ela requer correção do kernel etc.
você pode substituir seu argv [0] por outro nome ... mas estritamente falando, você está procurando algum tipo de rootkit. isso pode ajudá-lo: http://stupefydeveloper.blogspot.com/2008/10/linux-change-process-name.html
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 top
comando e modificá-lo de acordo. Você pode substituir o top
comando /usr/sbin
(ou onde quer que esteja) por sua versão.
top
comando.
this_is_not_the_process_you_are_looking_for
?