如何在 C 中的 setregid() 和 setreuid() 之后访问/设置其他用户的环境变量

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 的手册)。您的程序不读取这些文件,因此它看不到其中的变量分配。

  • @Anirban,这与任何 pre-exec 活动无关,而是关于 _what_ 是 exec'd。`sudo -i` 启动一个 shell,而你的程序直接启动 `env`。你可以执行相当于运行`bash -l -c /usr/bin/env"`(类似于`execl("/bin/bash", "bash", "-l" "-c", "/usr /bin/env", NULL)` 在中间运行 shell。虽然 `sudo` _does_ 也清理环境,`sudoers` 中有很多选项(`env_reset `,`env_keep`,也许其他。要重现这些,请编辑您传递给 exec 的环境(显式或隐式)。 (9认同)