6

我目前正在阅读一本关于用 C 编程的书,我到了必须编写一个程序的部分,该程序将显示正在执行文件的真实 uid 和有效 uid。用 编译代码后gcc,我输入命令查看当前的 uOwner 和 gOwnerls- l id_demo输出是这样的:

-rwxrwxr-x 1 user user 8629 Sep 21 13:04 id_demo

然后我执行程序本身,这就是我得到的:

real uid: 1000 effective uid: 1000

...到目前为止,一切都很好。然后我输入一个命令来更改文件的所有者:

sudo chown root:root ./id_demo

ls -l确认所有者已更改为 root :

-rwxrwxr-x 1 root root 8629 Sep 21 13:04 id_demo

再次,执行程序显示real uid和为 1000。必须为 0uid之后的最后一步是:但对我来说,它们保持为 1000,在书中输出清楚地显示为:uidsudo chmod u+s ./uid_demo

real uid: 1000
effective uid: 0

任何想法为什么会发生这种情况?

更新

id_demo 源代码:

#include <stdio.h>

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

更新 2 屏幕截图

            #1

              ls -l testuid

请帮忙。我要疯了,我花了 6 个多小时寻找解决方案,我需要继续前进。

4

2 回答 2

8

我们已经想通了。原因是ecryptfs挂载的主目录。mount输出包含以下行:

/home/evgeny/.Private on /home/evgeny type ecryptfs 

这意味着主目录实际上不是根文件系统的一部分(具有必要的suid标志),而是它自己的虚拟文件系统,默认情况下显然不支持 setuid 二进制文件。我已经成功地使用具有加密主目录的测试用户重现了该问题。

可以suid使用以下命令将标志添加到 ecryptfs:

sudo mount -i -o remount,suid /home/evgeny

我不确定这有多安全,也不确定如何永久更改它以使其能够在重新启动后继续存在。

于 2013-09-21T23:14:00.570 回答
2

这对我有用:

编译

$ gcc uid_demo.c -o uid_demo

$ ll
total 12
-rwxrwxr-x 1 saml saml 6743 Sep 21 17:05 uid_demo
-rw-rw-r-- 1 saml saml  116 Sep 21 16:58 uid_demo.c

chown

$ sudo chown root:root uid_demo
$ ll
total 12
-rwxrwxr-x 1 root root 6743 Sep 21 17:05 uid_demo
-rw-rw-r-- 1 saml saml  116 Sep 21 16:58 uid_demo.c

修改

$ sudo chmod u+s uid_demo
$ ll
total 12
-rwsrwxr-x 1 root root 6743 Sep 21 17:05 uid_demo
-rw-rw-r-- 1 saml saml  116 Sep 21 16:58 uid_demo.c

$ ./uid_demo 
real uid: 500
effective uid: 0
于 2013-09-21T21:08:08.673 回答