setuid 进程无法看到该用户拥有的进程

setuid 进程无法看到该用户拥有的进程

我想让非 root 用户 ( nicollet) 能够检测并向 Apache2 启动的进程发送信号(这些进程是 FastCGI 脚本,信号告诉它们清空缓存)。这些进程归 Web 用户 ( www-data) 所有,我在 Debian 不稳定版上运行。

我找不到任何方法让nicollet用户看到这些过程。

进程正在运行,和都可以root看到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:~#

但是,以我的用户身份运行相同的命令nicollet不会返回任何内容:

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

我尝试创建一个可执行文件,使用 运行上述查询system()。它属于www-data并设置了 setuid 位:

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:~#

然而,我观察到同样的情况:进程通过root和可见,www-data但通过 不可见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:~$

最令人惊讶的是,该grep进程确实由其运行www-data(因为它是从 setuid 可执行文件启动的)并且可见,但该baryton过程却不可见。

这是怎么回事?为什么可以ps通过www-data显示这些进程来运行,但ps通过以 setuid 身份运行的可执行文件却www-data无法运行,当它由 启动时nicollet

答案1

多年来,我们一直可以在内核级别限制普通用户帐户只能查看自己的进程。这种限制可以通过 grsecurity、SELinux 和其他安全框架实现,但发行版通常不默认使用。

我已经有一段时间没有尝试过 Debian 不稳定分支了(一直在运行 Lenny),但也许他们最近在内核配置中打开了那个开关。它会产生与您观察到的完全相同的效果——即使使用 setuid 可执行文件,原始 uid(nicollet)仍然已知,只有 EUID(有效 uid)会发生变化。

相关内容