有效UID的行为与预期不符

4

代码

我编写了以下C程序来打印实际和有效的用户ID:

#include <stdio.h> 
#include <unistd.h>
#include <sys/types.h>

void main() {
    printf("real uid: %d\n", (int) getuid());
    printf("effective uid: %d\n", (int) geteuid());
}

我使用gcc进行编译:
jazz@kryptonite beyond_basics $ gcc -o uid_demo.out uid_demo.c

接下来,我按照以下方式更改了所有者和权限:

jazz@kryptonite beyond_basics $ sudo chown root:root uid_demo.out
jazz@kryptonite beyond_basics $ sudo chmod u+s uid_demo.out

Result

Now I got:

jazz@kryptonite beyond_basics $ ll uid_demo.out
-rwsr-xr-x 1 root root 8712 Sep  8 18:12 uid_demo.out*

当运行程序时,我得到以下结果:
jazz@kryptonite beyond_basics $ ./uid_demo.out
real uid: 1000
effective uid: 1000

问题

我本来期望有效用户ID为0。

有人能解释一下为什么不是吗?

谢谢


你设置了粘滞位,是吗?这意味着非 root 用户可以执行代码/特权指令。据我所知,在运行时它并不会赋予你的用户 root 权限,仅仅因为你执行了程序。 - icbytes
4
请检查挂载选项,可能已经设置了 nosuid - ensc
好的,这是可行的。 - icbytes
@icbytes,那不是粘滞位 - 它是setuid位,应该按描述工作(将EUID设置为可执行文件的UID)。粘滞位将显示为“-rwxr-xr-t”。 - SusanW
哦,抱歉。无论如何,谢谢你提醒我。 - icbytes
@icbytes - 没问题...期待在这里找到真相 :-) ....也许是一些疯狂的事情,比如_"root的用户名被改成'jazz',而我的用户名被改成'root'_..所以文件的UID实际上是1000,他一直以uid=0运行...不,那么realuid将是0...好吧,无论如何... - SusanW
1个回答

2

这真是令人惊讶,不是吗?

检查文件系统的挂载选项是值得的 - 它可能已经被挂载了nosuid选项。要检查选项,请尝试运行mount命令或cat /proc/mounts命令。

(我相信您知道您在哪个文件系统中,但为了完整起见,如果您像您的示例一样处于该目录中,则可以使用df .


是的,我有这些安装选项: /home/jazz/.Private /home/jazz ecryptfs rw,nosuid,nodev,relatime,ecryptfs_fnek_sig=53fa347e3d1f5673,ecryptfs_sig=58c68ab1391f0d15,ecryptfs_cipher-aes,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs 0 0快速研究显示我可以像这样“设置”nosuid选项: mount -o remount,noexec,nosuid,nodev /home/jazz 但是我怎么取消它呢? - Tschasmine
@Tschasmine 这个命令看起来很好,但请将 nosuid 改为 suid - SusanW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接