据我了解,
- 鲁伊德:进程调用者的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/sh
,Bash 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/sh
:bash
作为安全措施,版本bash
2 在启动时会放弃权限。(Debian 使用不同的 shell,,dash(1)
它在以 调用时不会执行此操作sh
。)
事实证明,该手册不是最新的。如今dash
表现得像bash
。坦白说,我不知道你的操作系统使用什么 shell sh
(你标记了Ubuntu,Ubuntu 使用dash
;但kali
您的问题可能建议使用 Kali,我不确定 Kali 使用什么)。使用 进行检查ls -l /bin/sh
,可能是。无论它是什么,它最有可能放弃权限,这就是您观察到dash
的原因。Permission denied
即使你sh
没有放弃特权,system()
这也不是一个好主意。已经链接的手册明确建议不要这样做:
请勿
system()
从特权程序(设置用户 ID 或设置组 ID 的程序,或具有功能的程序)中使用,因为某些环境变量的奇怪值可能会被用来破坏系统完整性。