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

1

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 a eles para esvaziar seu cache). Os processos são de propriedade do usuário da web ( www-data ), e eu estou rodando no Debian instável.

Não consigo encontrar uma maneira de fazer com que o usuário nicollet veja esses processos.

Os processos estão sendo executados e podem ser vistos por root e 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 esse mesmo comando com meu nicollet user 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:~$

Eu tentei criar um executável que executa a consulta acima usando system() . Pertence a www-data e tem 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:~#

No entanto, observo a mesma situação: os processos são visíveis por root e www-data , mas 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 processo grep é executado por www-data (porque é iniciado a partir de um executável setuid) e é visível, mas o processo baryton não é.

O que está acontecendo aqui? Por que ps executado por www-data mostra esses processos, mas ps executado por um executável setuid executado como www-data não pode, quando é iniciado por nicollet ?

    
por Victor Nicollet 02.11.2010 / 10:55

1 resposta

2

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 foi possível com o grsecurity, SELinux e outras estruturas de segurança, mas não é comumente usada por padrão pelas distribuições.

Eu não tenho tentado o branch instável do Debian por um tempo (rodando o Lenny), mas talvez eles tenham alternado ultimamente naquele switch na configuração do kernel. Isso causaria exatamente o mesmo efeito que você está observando - mesmo com o executável setuid, o uid original (nicollet) ainda é conhecido e somente o EUID (uid efetivo) é alterado.

    
por 02.11.2010 / 11:53

Tags