O processo setuid não pode ver os processos pertencentes a esse usuário

O processo setuid não pode ver os processos pertencentes a esse usuário

Eu gostaria de dar a um usuário não root ( nicollet) a capacidade de detectar e enviar um sinal para processos iniciados pelo Apache2 (esses processos são scripts FastCGI e o sinal diz para eles esvaziarem o cache). Os processos são de propriedade do usuário web ( www-data) e estou rodando no Debian instável.

Não consigo encontrar nenhuma maneira de o nicolletusuário ver esses processos.

Os processos estão em execução e podem ser vistos por roote www-data:

root@linux-01:~# ps -Af | grep baryton
www-data 17649 17648  0 10:27 ?        00:00:00 baryton
www-data 28145     1  0 Nov01 ?        00:00:12 baryton --bot
root     18701 18700  0 10:46 pts/0    00:00:00 grep baryton
root@linux-01:~#

No entanto, executar o mesmo comando com meu nicolletusuário não retorna nada:

nicollet@linux-01:~$ ps -Af | grep baryton
nicollet 18704 18703  0 10:46 pts/0    00:00:00 grep baryton
nicollet@linux-01:~$

Tentei criar um executável que execute a consulta acima usando system(). Pertence e www-datatem o bit setuid definido:

root@linux-01:~# which setuid-update
/usr/local/bin/setuid-update
root@linux-01:~# ls -l /usr/local/bin/setuid-update 
-rwsr-xr-x 1 www-data www-data 11046 Nov  2 10:27 /usr/local/bin/setuid-update
root@linux-01:~#

Porém, observo a mesma situação: os processos são visíveis por roote www-datamas não nicollet:

root@linux-01:~# setuid-update
www-data 17649 17648  0 10:27 ?        00:00:00 baryton
www-data 28145     1  0 Nov01 ?        00:00:13 baryton --bot
www-data 18712 18711  0 10:46 pts/0    00:00:00 sh -c ps -Af | grep baryton
www-data 18714 18712  0 10:46 pts/0    00:00:00 grep baryton
root@linux-01:~# su nicollet
nicollet@linux-01:~$ setuid-update
www-data 18716 18715  0 10:46 pts/0    00:00:00 sh -c ps -Af | grep baryton
www-data 18717 18716  0 10:46 pts/0    00:00:00 grep baryton
nicollet@linux-01:~$

O mais surpreendente é que o grepprocesso é realmente executado www-data(porque foi iniciado a partir de um executável setuid) e é visível, mas o barytonprocesso não é.

O que está acontecendo aqui? Por que psrun by www-datamostra esses processos, mas psexecutado por um executável setuid rodando como www-datanão pode, quando é iniciado por nicollet?

Responder1

Durante anos foi possível restringir no nível do kernel as contas de usuários regulares para ver apenas seus próprios processos. Esta restrição tem sido possível com grsecurity, SELinux e outras estruturas de segurança, mas não é comumente usada por padrão pelas distribuições.

Faz um tempo que não experimento o branch instável do Debian (estou executando o Lenny), mas talvez eles tenham ativado recentemente essa opção na configuração do kernel. Causaria exatamente o mesmo efeito que você está observando - mesmo com o executável setuid, o uid original (nicollet) ainda é conhecido e apenas o EUID (uid efetivo) é alterado.

informação relacionada