假设我有一个在用户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;
}
答案 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
setuid(getuid())
,即在阅读environ
档案在这种情况下,来自给定群组的任何用户都可以阅读任何其他用户的/proc/*/environ
。
如果您想减少程序的权限以仅允许特定用户(用户A)的只读environ
文件,您可能应该考虑其他一些技巧。例如配置文件,包含可以读取environ
个文件的用户。
请务必小心额外的权限。特别是使用 root 权限。尽快执行必要的特权操作并删除权限。