如何启动(或查找)RUID 与 EUID 不同的进程?

如何启动(或查找)RUID 与 EUID 不同的进程?

受到其中之一的启发之前回答过的问题,我尝试由不是其所有者的用户执行一个程序,并且该进程的 RUID 和 EUID 保持不变。 (除非我读错了答案,而这不是你实现差异的方式。)

然后我尝试通过 -- 以另一个用户身份打开一个程序sudo,但仍然没有结果。

我已经通过 扫描了所有已经存在的进程(我认为)ps axo euid,ruid,comm -e g,并且它们都没有不同的 RUID 和 EUID。

我怎样才能实现(或找到具有)差异的过程?一些特定的命令会有所帮助,因为我可能在某些步骤中犯了一些错误。

答案1

调用不属于您的可执行文件没什么了不起的。系统上的大多数可执行文件都属于root,运行它们不会给用户任何额外的权限。

这只是设置用户标识以以下开头的可执行文件有效UID设置为可执行文件的所有者,而真实 UID仍然是调用进程的真实UID。

sudosetuid root,因此它使用有效 UID 0 和您的真实 UID 运行。但是当它调用另一个命令时,它会为目标用户设置有效 UID 和真实 UID。您必须捕获sudo自身才能观察到与 RUID 不同的 EUID。除非sudo提示您输入密码,否则您很快就看不到。

passwd您可以通过以非 root 用户身份运行该命令来轻松观察不同的 UID 。当显示提示时,ps在另一个终端中运行:

ps -o user,ruser -C passwd

要查找具有不同 EUID 和 RUID 的所有正在运行的进程,您可以使用

ps -e -o user= -o ruser= | awk '$1 != $2'

找不到任何setuid进程是很正常的,大多数setuid进程都是短暂的。

答案2

如果有人只想让id命令显示与 uid 不同的 euid (这是手册页的行为),一种方法是在临时 c 程序中运行它:

$ sudo gcc -o test.bin -xc - <<EOF
     #include <stdlib.h>
     #include <unistd.h>
     int main() { seteuid(0); system("id"); }
EOF
$ sudo chmod +s test.bin && ./test.bin && sudo rm test.bin

结果是这样的:

uid=1000(user) gid=1000(user) euid=0(root) egid=0(root) groups=0(root),1000 ...

相关内容