Ani*_*ban -2 linux c setuid environment-variables setgid
我有一个特权 C 程序,它由标准用户(例如stduser)执行并在执行时切换到系统用户(例如sysuser),如下所示。基本上,我正在尝试做一些类似于sudo -u sysuser env会做的事情。
环境测试.c:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<errno.h>
#include<shadow.h>
#include<pwd.h>
int main(void){
struct passwd*pw;
uid_t sysuid;
gid_t sysgid;
char err_module_name[256] = "";
pw = getpwnam ("ayauser");
endpwent();
if (!pw){ //user doesn't really exist
perror("getpwnam()");
return errno;
}
sysuid = pw->pw_uid;
sysgid = pw->pw_gid;
(strcpy(err_module_name, "setregid()") == NULL || setregid(sysgid, sysgid) == 0) &&
(strcpy(err_module_name, "setreuid()") == NULL || setreuid(sysuid, sysuid) == 0) &&
(strcpy(err_module_name, "execl()") == NULL || execl("/usr/bin/env", "/usr/bin/env", NULL) == 0);
perror(err_module_name);
return errno;
}
Run Code Online (Sandbox Code Playgroud)
我已经做好了:
$ sudo chgrp root envtest
$ sudo chown root envtest
$ chmod 6555 envtest
Run Code Online (Sandbox Code Playgroud)
之后,当我运行envtest程序时,它显示了与stdusernot相同的环境变量sysuser。即env命令和envtest命令的输出是一样的。正如我所期望的那样,输出应该与sudo -u sysuser env.
代码中缺少什么?如何修改程序以具有相同的环境变量,即为sysuser?
ilk*_*chu 10
什么sudo -i是:
-i, --login运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着shell 将读取特定于登录的资源文件,例如
.profile或.login。
最后一点很重要,shell 会读取许多启动文件(取决于它们的启动方式,例如参见Bash 的手册)。您的程序不读取这些文件,因此它看不到其中的变量分配。