我编写了一个名为killSPR
的小型C实用程序,以在我的RHEL盒上终止以下进程。这个想法是任何登录到这个linux系统的人都可以使用这个工具来杀死下面提到的进程(这是行不通的 - 下面会解释)。setuid在可执行文件上似乎不起作用
[email protected] /tmp > ps -eaf | grep -v grep | grep " SPR "
cadmn 5822 5821 99 17:19 ? 00:33:13 SPR 4 cadmn
cadmn 10466 10465 99 17:25 ? 00:26:34 SPR 4 cadmn
cadmn 13431 13430 99 17:32 ? 00:19:55 SPR 4 cadmn
cadmn 17320 17319 99 17:39 ? 00:13:04 SPR 4 cadmn
cadmn 20589 20588 99 16:50 ? 01:01:30 SPR 4 cadmn
cadmn 22084 22083 99 17:45 ? 00:06:34 SPR 4 cadmn
[email protected] /tmp >
该实用程序是由用户cadmn
(下这些过程运行)所拥有,并且具有的setuid标志在其上设置(如下所示)。
/*
* Program Name: killSPR.c
* Description: A simple program that kills all SPR processes that
* run as user cadmn
*/
#include <stdio.h>
int main()
{
char *input;
printf("Before you proceed, find out under which ID I'm running. Hit enter when you are done...");
fgets(input, 2, stdin);
const char *killCmd = "kill -9 $(ps -eaf | grep -v grep | grep \" SPR \" | awk '{print $2}')";
system(killCmd);
return 0;
}
用户(pmn
)从cadmn
尝试不同杀与该实用程序的上述处理和失败(如下所示)::
[email protected] /tmp > ls -l killSPR
-rwsr-xr-x 1 cadmn cusers 9925 Dec 17 17:51 killSPR
[email protected] /tmp >
C代码在下面给出
[email protected] /tmp > ./killSPR
Before you proceed, find out under which ID I'm running. Hit enter when you are done...
sh: line 0: kill: (5822) - Operation not permitted
sh: line 0: kill: (10466) - Operation not permitted
sh: line 0: kill: (13431) - Operation not permitted
sh: line 0: kill: (17320) - Operation not permitted
sh: line 0: kill: (20589) - Operation not permitted
sh: line 0: kill: (22084) - Operation not permitted
[email protected] /tmp >
当用户等待点击上面的输入时,过程killSPR
被检查,并且看起来像用户cadmn
(如下所示),尽管killSPR无法终止进程。
[email protected] /tmp > ps -eaf | grep -v grep | grep killSPR
cadmn 24851 22918 0 17:51 pts/36 00:00:00 ./killSPR
[email protected] /tmp >
顺便说一句,没有一个主分区对他们
[email protected] /tmp > mount | grep nosuid
[email protected] /tmp >
上的可执行了setuid标记任何nosuid
似乎并没有收到预期的效果。我在这里错过了什么?我误解了setuid的工作原理吗?
是有一个原因,这可能不只是用'777'权限,而不是一个编译的二进制shell脚本? – txtechhelp
@txtechhelp - 带有perms 777的shell脚本不起作用。这就是为什么 - 如果用户'pmn'调用了这个脚本,那么接下来的过程将以用户'pmn'运行,该用户没有权限杀死以用户'cadmn'运行的进程(除非你是root,你不能杀死别人运行的进程)。 顺便说一下,在脚本上设置setuid标志也将不起作用:setuid用一种shell语言编写的脚本被系统忽略为安全功能。因此,这需要一个编译的程序。 希望这回答你的问题。 – pmn
我理解Linux/Unix系统的用户权限和限制,我在问你为什么要通过C程序来做到这一点(如果在单独的登录中作为单独用户运行,它具有相同的限制)已经发布..你只是简单地从C程序中调用系统命令,它与通过shell脚本调用相同命令(在程序中为'kill')具有相同的效果。相反,你所要做的就是想给特定的程序提供'服务控制'给非root用户...如果这是正确的,请更改你的问题 – txtechhelp