使用 EUID 是什么意思?如果一个进程的 RUID 和 EUID 分别为 1000、0,并且如果我们运行任何命令,该命令将以 1000 权限级别运行,为什么?

使用 EUID 是什么意思?如果一个进程的 RUID 和 EUID 分别为 1000、0,并且如果我们运行任何命令,该命令将以 1000 权限级别运行,为什么?

据我了解,

  • 鲁伊德:进程调用者的uid称为真实uid。
  • 欧盟身份证:有效 uid 表示该进程允许的权限。
// setuid_file.c
#include<stdio.h>
int main(void)
{
        int uid;
        uid=getuid();
        printf("RUID : getuid() : %d\n",uid);
        uid=geteuid();
        printf("EUID : geteuid() : %d\n",uid);

        system("whoami");
        system("cat /etc/sudoers"); //only root user can access. here we can write any command which only root user can execute.
}
 
gcc setuid_file.c -o euid_zero
chmod ug+s euid_zero

因此,在 root 终端上,我为 euid_zero 可执行文件设置了 suid 和 guid。现在,我尝试使用普通用户运行可执行文件,下面是输出。

ll euid_zero
-rwsr-sr-x 1 root root 16768 Dec 30 00:59 euid_zero

whoami
kali

id
uid=1000(kali) gid=1000(kali) groups=1000(kali)

./euid_zero

RUID : getuid() : 1000
EUID : geteuid() : 0
kali
cat: /etc/sudoers: Permission denied
                                      

因此,如果 EUID 为零,我们也无法获得 root 权限。这意味着我们根据 RUID 拥有访问权限,那么如果没有 EUID 的使用,EUID 的意义何在?

答案1

它允许流程暂时地根据需要提高或降低权限。

例如,文件服务器守护进程 (smbd、ftpd) 以 root 身份启动,然后 seteuid() 设置为登录用户的 EUID。现在它可以在大多数时间使用登录用户的 EUID 运行,让内核应用文件访问检查,但仍能够将其权限提升回 EUID 0 以执行某些操作。

但请注意,当您使用时system(),这将通过调用命令/bin/shBash shell 故意放弃权限每当检测到 UID/EUID 不匹配时。您自己的 setuid 进程可以事实上/etc/shadow可以正常打开 – 只有通过 system() 启动的工具无法打开。

如果您用 fork+exec 替换所有 system() 调用,或者甚至用一个简单的open("/etc/shadow", O_RDONLY),您将看到 RUID=1000 但 EUID=0 允许您访问该文件。(此外,您还将看到id报告两组 UID/GID。)

答案2

总体而言,EUID 本身可以正常工作,但这里的“问题”在于它使用system(3)什么sh。请参阅手册(man 3 system):

system()事实上,在版本 2 的系统上,无法通过具有 set-user-ID 或 set-group-ID 权限的程序正常工作/bin/shbash作为安全措施,版本bash2 在启动时会放弃权限。(Debian 使用不同的 shell,,dash(1)它在以 调用时不会执行此操作sh。)

事实证明,该手册不是最新的。如今dash表现得像bash。坦白说,我不知道你的操作系统使用什么 shell sh(你标记了,Ubuntu 使用dash;但kali您的问题可能建议使用 Kali,我不确定 Kali 使用什么)。使用 进行检查ls -l /bin/sh,可能是。无论它是什么,它最有可能放弃权限,这就是您观察到dash的原因。Permission denied

即使你sh没有放弃特权,system()这也不是一个好主意。已经链接的手册明确建议不要这样做:

请勿system()从特权程序(设置用户 ID 或设置组 ID 的程序,或具有功能的程序)中使用,因为某些环境变量的奇怪值可能会被用来破坏系统完整性。

相关内容