
Me gustaría darle a un usuario no root ( nicollet
) la capacidad de detectar y enviar una señal a los procesos iniciados por Apache2 (esos procesos son scripts FastCGI y la señal les indica que vacíen su caché). Los procesos son propiedad del usuario web ( www-data
), y los estoy ejecutando en Debian inestable.
No encuentro ninguna manera de que el nicollet
usuario vea esos procesos.
Los procesos se están ejecutando y se pueden ver tanto por como root
por 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:~#
Sin embargo, ejecutar ese mismo comando con mi nicollet
usuario no devuelve nada:
nicollet@linux-01:~$ ps -Af | grep baryton
nicollet 18704 18703 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
Intenté crear un ejecutable que ejecute la consulta anterior usando system()
. Pertenece www-data
y tiene el bit setuid configurado:
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:~#
Sin embargo, observo la misma situación: los procesos son visibles por root
y www-data
pero no 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:~$
Lo más sorprendente es que el grep
proceso se ejecuta www-data
(porque se inicia desde un ejecutable setuid) y es visible, pero el baryton
proceso no lo es.
¿Que está pasando aqui? ¿Por qué se puede ps
ejecutar mediante www-data
mostrar esos procesos, pero ps
ejecutar mediante un ejecutable setuid que se ejecuta como www-data
no se puede, cuando se inicia mediante nicollet
?
Respuesta1
Durante años ha sido posible restringir a nivel de kernel las cuentas de usuario habituales para ver sólo sus propios procesos. Esta restricción ha sido posible con grsecurity, SELinux y otros marcos de seguridad, pero las distribuciones no la utilizan comúnmente de forma predeterminada.
No he probado la rama inestable de Debian por un tiempo (he estado ejecutando Lenny), pero quizás últimamente hayan activado ese interruptor en la configuración del kernel. Causaría exactamente el mismo efecto que está observando: incluso con el ejecutable setuid, el uid original (nicollet) todavía se conoce y solo se cambia el EUID (uid efectivo).