【问题标题】:setuid and setgid wotking with 0 (root) only, I want it to work other usersetuid 和 setgid wotking 仅使用 0(root),我希望它可以为其他用户工作
【发布时间】:2021-06-06 17:17:18
【问题描述】:

我正在尝试编写一个以用户 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 用户呢?

【问题讨论】:

  • Setuid/setgid wrapper 围绕 shell 脚本的 C 程序和运行其他命令的 system() 调用在不引入可利用的安全问题的情况下几乎是不可能的......
  • 你需要设置你的程序的gid:chmod g+s program,这样它就是一个setgid程序(我认为命令是正确的)。然后在程序中做setgid(getegid()); setuid(geteuid());

标签: c linux guid setuid suid


【解决方案1】:

Linux 就是这样工作的 (tm)

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

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

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

$ man 7 capabilities

了解详情。

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

  1. 您可以控制谁拥有权力。
  2. 您可以控制用户可以运行哪些应用程序。
  3. 您甚至可以强制执行它们必须提供的前几个命令行操作。
  4. 在审计跟踪中输入了一个条目,因此您知道当机器崩溃时该责备谁。

【讨论】:

    【解决方案2】:

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

    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 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 2020-05-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      相关资源
      最近更新 更多