我正在尝试编写一个以用户 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 用户一起做到这一点?
Linux 就是这样工作的(tm)
如果任何用户都可以随意成为另一个用户,那么 Linux 将根本没有没有访问权限。
只有以 root 权限运行的进程才能更改其有效凭据。
话虽如此,Linux 提供了细粒度的凭据。 参见:
$ man 7 capabilities
了解详情。
“我想成为 root”综合症的更好解决方案是查看 sudo(8)。 使用 sudo(8) 更好,因为:
我使用这些命令来设置所有者、组和权限
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 命令。
在这种情况下
sudo setcap 'cap_setgid=ep' your_program
应该可以工作。