获取在不同用户下运行的进程的环境

时间:2012-03-09 14:48:08

标签: c linux

假设我有一个在用户A下在后台运行PID 1234的过程。

如果我以用户A运行以下程序,则成功。如果我以用户B的身份运行它,则会失败并显示open: Permission denied

这是有道理的,因为environ文件归用户A所有,并且只有A的读权限。 但是,如果我为用户A创建程序set-user-ID并将其作为用户B运行,则它将失败并显示read: Permission denied。对于具有相同权限的常规文件,似乎不会发生这种情况。如果A是root,也不会发生。

任何想法为什么?有没有其他方法可以解决另一个解决此问题的进程的环境?

#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, const char *argv[])
{
    unsigned char ch = 0;
    int fd = -1;
    int read_result = -1;

    setresuid(geteuid(), geteuid(), geteuid());

    fd = open("/proc/1234/environ", O_RDONLY);
    if (-1 == fd) {
        perror("open");
        return EXIT_FAILURE;
    }

    read_result = read(fd, &ch, 1);
    if (-1 == read_result) {
        perror("read");
        return EXIT_FAILURE;
    }

    close(fd);

    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

正如您所看到的,如果您的程序运行而没有 SETUID,则打开(2)会为您提供Permission denied,而如果您使用 SETUID运行程序, open(2)工作正常,但read(2)导致相同的错误。发生这种情况是因为在/proc/* inode上的每个文件操作期间进行了额外的权限检查。看起来这个额外的权限检查使用了正在运行的进程的EUID以外的东西。如果您运行GNU / Linux,有关详细信息,请参阅<kernel_source>/fs/proc/base.c中代码开头的注意和同一文件中的environ_read()函数。

可能的快速解决方案之一:

  • 将程序文件的所有者设置为root
  • 将所有者组设置为某个特殊组
  • 将应该运行程序的用户(用户B)添加到该特殊组
  • 将模式位设置为4550(r-sr-x ---)
  • 请尽快致电setuid(getuid()),即在阅读environ档案
  • 之后立即删除权限

在这种情况下,来自给定群组的任何用户都可以阅读任何其他用户的/proc/*/environ

如果您想减少程序的权限以仅允许特定用户(用户A)的只读environ文件,您可能应该考虑其他一些技巧。例如配置文件,包含可以读取environ个文件的用户。

请务必小心额外的权限。特别是使用 root 权限。尽快执行必要的特权操作并删除权限。