【问题标题】:Effective user id does not change after making the file owned by root使文件为root拥有后,有效用户ID不会改变
【发布时间】:2013-09-27 01:57:40
【问题描述】:

我目前正在阅读一本关于使用 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 uiduid 显示为1000。uid 必须为0 的最后一步是:sudo chmod u+s ./uid_demo 但对我来说它们保持为1000,在书中输出清楚地显示为:

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 屏幕截图

            

             

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

【问题讨论】:

  • 这可能是无关的,但对于 getuid()geteuid() 你需要 unistd.hsys/types.h 你不包括在内。参考man 2 getuid
  • 我试试看,但代码来自书中。
  • 同样的结果仍然该死的 1000

标签: command-line permissions privileges


【解决方案1】:

We've figured it out. 原因是安装了ecryptfs 的主目录。 mount 输出包含以下行:

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

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

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

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

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

【讨论】:

  • 这不应该被迁移到 SO,这更多地属于 U&L。我会问模组把它带回来。
  • 非常感谢您的帮助。你统治!
  • @slm 是的,绝对属于 U&L,因为我们发现它确实是系统特定问题而不是编程问题。
  • @MichaelKjörling - 仅供参考,昨晚我向 U&L 模组发送了一封便条,询问是否将其迁移回来,等待回复。
【解决方案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

chmod

$ 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

【讨论】:

  • 怎么...为什么它不适合我?我已经编辑了 fstab 和 mtab 条目,所以启用了 suid 仍然没有结果我做错了什么?
  • ubuntu 13.04。我同样认为使用较新的发行版提高安全性..
  • @EvgenyDanilenko 尝试将二进制文件移动到您和others 没有写入权限的地方,例如到/usr/local/bin。某些安全机制可能会意识到您对二进制文件所在的文件夹具有写访问权限,因此会忽略 setuid 位,因为您可以利用它。
  • @EvgenyDanilenko 是的,sudo mv uid_demo /usr/local/bin。然后执行为uid_demo
  • 那可能是不可能的。如果它以我认为的方式工作(无法通过谷歌搜索找到任何来源),那么内核将确保普通用户(如您的帐户)没有对 setuid 二进制文件的写入权限。一旦您将文件放入您的家中,您就拥有了写访问权限(至少您可以相当容易地获得写访问权限),内核会捕捉到这一点并忽略 setuid 位以防止漏洞利用。这毕竟是一件好事。
猜你喜欢
  • 2013-08-30
  • 2019-03-04
  • 2014-06-10
  • 1970-01-01
  • 2011-10-30
  • 2018-06-28
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
相关资源
最近更新 更多