setuid 和 setgid 仅适用于 0(root),我希望它可以用于其他用户

问题描述 投票:0回答:3

我正在尝试编写一个以用户 smith 权限运行 /bin/bash 的程序,

smith:x:1000:1000:Basket:/home/smith:/bin/bash

我试过这个:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
        setgid(1000);
        setuid(1000);
        char command[50];
        strcpy( command, "/bin/bash" );
        system(command);
        return(0);
} 

我使用这些命令来设置所有者、组和权限

chown smith command
chgrp smith command
chmod +x command
chmod u+s command

命令后的权限:

-rwsr-xr-x  1 smith smith   16840 Jun  6 17:11 command

但没有成功,我尝试使用root作为下一步:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
        setgid(0);
        setuid(0);
        char command[50];
        strcpy( command, "/bin/bash" );
        system(command);
        return(0);
} 

我使用相同的命令来获取权限等,但我不是用 smith,而是编写了 root 并进行了工作,当我运行它时,我得到了一个作为 root 的 shell。

那么我如何与 smith 用户一起做到这一点?

c linux guid setuid suid
3个回答
0
投票

Linux 就是这样工作的(tm)

如果任何用户都可以随意成为另一个用户,那么 Linux 将根本没有没有访问权限。

只有以 root 权限运行的进程才能更改其有效凭据。

话虽如此,Linux 提供了细粒度的凭据。 参见:

$ man 7 capabilities

了解详情。

“我想成为 root”综合症的更好解决方案是查看 sudo(8)。 使用 sudo(8) 更好,因为:

  1. 你可以控制谁拥有权力。
  2. 您可以控制用户可以运行哪些应用程序。
  3. 您甚至可以强制要求他们必须提供的前几个命令行操作。
  4. 一个条目会被记录到审计跟踪中,这样你就知道当他们使机器崩溃时应该归咎于谁。

0
投票

我使用这些命令来设置所有者、组和权限

chown smith command
chgrp smith command
chmod +x command
chmod u+s command

如果您在程序模式下使用SUID和/或SGID位,则程序不需要调用相应的身份更改函数。 系统将自动以所有者(SUID)和/或组(SGID)身份运行程序。 因此,如果您使用该方法在 root 以外的 uid 下运行,则程序不得尝试调用身份更改函数,因为只有以足够权限运行的程序才能执行此操作。

因此,您的主要(互斥)选项是:

  • 使用可执行文件的所有权和模式(SUID / SGID 位)来选择要运行的程序的非特权身份,并避免调用

    setuid()
    setgid()
    。 任何对该程序具有执行权限的用户都将以指定的用户/组的身份执行该程序。

  • 在运行时使用

    setuid()
    和/或
    setgid()
    函数来设置程序运行的身份。 如果程序由非特权用户运行,这些功能将失败。

  • 在 Linux 下,使用功能子系统授予可执行文件更改其用户身份的权限。 (细节将比另一个完整的答案更重要。)

  • 根本不要这样做。 这可能是您最好的选择。 setuid 程序是有风险的,setuid shell 脚本风险更大,据我所知,没有安全专家会接受像您这样的程序,该程序允许任意用户以不同的身份运行任意 shell 命令。


0
投票

在这种情况下

sudo setcap 'cap_setgid=ep' your_program
应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.