【问题标题】:setuid(0) fails to execute for root owned programsetuid(0) 无法为 root 拥有的程序执行
【发布时间】:2015-04-08 08:55:04
【问题描述】:

我需要编写一些代码来获得 root 权限并执行系统级操作。这是我写的(这不是实际代码,只是为了测试我是否正确地做事):

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
    int current_uid = getuid();
    printf("My UID is: %d. My GID is: %d\n", current_uid, getgid());
    system("/usr/bin/id");
    if (setuid(0))
    {
        perror("setuid");
        return 1;
    }
    //I am now root!
    printf("My UID is: %d. My GID is: %d\n", getuid(), getgid());
    system("/usr/bin/id");
    //Time to drop back to regular user privileges
    setuid(current_uid);
    printf("My UID is: %d. My GID is: %d\n", getuid(), getgid());
    system("/usr/bin/id");
    return 0;
}

在完成gcc -o setuid setuid.c 之后,我对此运行 ls -al 以获得以下结果:

tarun@staging:~$ ls -al setuid
-rwxr-xr-x 1 tarun tarun 9792 2009-10-03 18:09 setuid
adam@staging:~$

尝试运行应用程序会导致:

tarun@staging:~$ ./setuid
My UID is: 1000. My GID is: 1000
uid=1000(tarun) gid=1000(tarun) groups=1000(tarun),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),125(sambashare),999(bumblebee)
setuid: Operation not permitted

我将所有者更改为 root 并相应地设置粘性位:

tarun@staging:~$ su - root
Password:
staging:~# cd /home/tarun
staging:/home/tarun# chown root.root setuid
staging:/home/tarun# chmod +s setuid
staging:/home/tarun# ls -al setuid
-rwsr-sr-x 1 root root 9792 2009-10-03 18:09 setuid
staging:/home/tarun# exit
logout
tarun@staging:~$

现在执行程序给出:

adam@staging:~$ ./setuid
My UID is: 1000. My GID is: 1000
uid=1000(tarun) gid=1000(tarun) groups=1000(tarun),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),125(sambashare),999(bumblebee)
setuid: Operation not permitted

虽然理想情况下它应该完全执行并将我的 uid 更改为 0。我做错了什么?

【问题讨论】:

  • 我觉得奇怪的是你的文件是 2009 年的,无论如何,你遵循的步骤应该可以工作,事实上,它们已经在我的机器上工作了。
  • @Rafael 我想这一定是我的系统有问题。看看我能不能弄清楚这是怎么回事。
  • 检查 mount 的输出,看是否启用了 suid。也许分区是用 nosuid 挂载的。
  • 谢谢,原来我使用的文件系统是ecryptfs,它强制执行 nosuid 和 nodev 以避免特权升级攻击。我不认为我可以关闭它。有什么办法吗?
  • 添加了可以帮助你驯服 eCryptFS 的链接。

标签: c linux shell root setuid


【解决方案1】:

您的代码没有问题,只需检查正确的setuid / 'sgid' 序列:

sudo chmod 6775 setuid
sudo chown root:root setuid

您必须至少设置 SUID、SGID 和执行权限(6555 掩码)。在这种情况下,设置用户/组写入(6775 掩码)也很常见。当然,为了安全起见,您可以将其限制为用户写入掩码 (6755)。

请确保您在重新编译期间不会放弃权限:

$ ls -al
-rwsrwsr-x 1 root  root  8772 Feb  8 17:52 setuid

以防万一您(或未来的读者)需要这样的指南: What is SUID and how to set SUID in Linux/Unix?

关于 eCryptfs 的问题:这里有一篇文章可以帮助你:https://wiki.archlinux.org/index.php/ECryptfs

【讨论】:

  • 感谢您的回答,但仍然无法正常工作。 ls -al 产生所需的输出,但 ./setuid 仍然没有让我获得 root 权限:-/
  • 请同时检查 UID 和 SGID。您不在第 0 组。
【解决方案2】:

粘性位具有完全不同的功能。如今,在文件上它基本上是未定义的,而在目录上,它会阻止非所有者(root 除外)删除目录中的文件,而不管目录权限如何。

您正在寻找设置的 UID 位:

  chown root setuid
  chmod +s setuid

显然,您必须是 root 才能为 root 拥有的文件设置 SUID 权限。但是,由于存在 setUID 位,我怀疑您可能会付出不必要的努力。

【讨论】:

    【解决方案3】:

    改变

    chown root.root setuid
    

    chown root setuid
    

    chown root.tarun setuid
    

    【讨论】:

    • 注意:某些文件系统需要在挂载时设置 setuid allowed 选项。为了允许 setuid 操作。检查您的挂载点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2020-03-30
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多