gpt4 book ai didi

c - 以 root 身份运行程序时出现奇怪的结果

转载 作者:IT王子 更新时间:2023-10-29 00:37:42 26 4
gpt4 key购买 nike

这是演示我的问题的程序的完整源代码(如果重要的话,操作系统是 Ubuntu 14.04 32 位):

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
int status, fd;

printf("CURRENT UID: %d, CURRENT GID: %d\n", getuid(), getgid());

fd = open("/dev/ttyS0", O_WRONLY);
if(fd < 0)
{
printf("Error opening /dev/ttyS0: %s\n", strerror(errno));
return 1;
}
printf("Successfully opened /dev/ttyS0\n");
close(fd);

/* DROP PRIVILEGES */

setgid(1000);
setuid(1000);

printf("CURRENT UID: %d, CURRENT GID: %d\n", getuid(), getgid());

fd = open("/dev/ttyS0", O_WRONLY);
if(fd < 0)
{
printf("Error opening /dev/ttyS0: %s\n", strerror(errno));
return 1;
}
printf("Successfully opened /dev/ttyS0\n");
return 0;
}

系统中有两个用户:root 和一个 id=1000 的常规非 root 用户(我们称他为“ubuntu”)。上面的程序试图打开串行端口 (/dev/ttyS0) 两次:第一次是作为 root 或 ubuntu(取决于它的调用方式),第二次总是作为 ubuntu。第一次不成功的尝试会导致程序中止。用户 ubuntu 是 dialout 组的成员,因此理论上他具有打开/dev/ttyS0 的必要权限。我以四种不同的方式调用该程序:

1) 直接以ubuntu运行

调用:

<我的程序路径>

2) 以 ubuntu 运行,但使用 sudo

调用:

sudo -u ubuntu <我程序的路径>

3) 以 root 身份运行,但权限下降到 ubuntu 的权限(所以,实际上,作为 ubuntu 运行):

调用:

须藤须
sudo -u ubuntu <我程序的路径>

在这三种情况下,我都得到了以下预期结果:

CURRENT UID: 1000, CURRENT GID: 1000
Successfully opened /dev/ttyS0

CURRENT UID: 1000, CURRENT GID: 1000
Successfully opened /dev/ttyS0

然而,在最后一种情况下,会发生一些奇怪的事情:

4) 直接以root身份运行

调用:

须藤须
<我的程序路径>

结果:

CURRENT UID: 0, CURRENT GID: 0
Successfully opened /dev/ttyS0

CURRENT UID: 1000, CURRENT GID: 1000
Error opening /dev/ttyS0: Permission denied

当然是输出的最后两行我看不懂:这次root掉权限的时候发现ubuntu没有足够的权限打开/dev/ttyS0,但是为什么呢?这个案例与案例 1-3 有何不同?

最后一件事值得一提:如果我更改这行代码:

setgid(1000);

为此:

setgid(20); /* 20 is the id of dialout group */ 

那么最后一次打开/dev/ttyS0 的尝试也成功了。

这是否意味着当我以 root 身份运行程序然后通过将 uid 和 gid 更改为 1000 来放弃 ubuntu 的权限时,关于 ubuntu 作为 dialout 组成员的信息由于某种原因丢失了?能否请您详细解释我的示例中的情况 4 中发生的情况以及为什么结果与我预期的不同?

最佳答案

设置 userid 和 groupid 不会设置所有补充组(即所有组,这些组不是用户的主要组,而是在 /etc/groups 中分配给他的>) 自动地。尝试使用

initgroups("ubuntu", 1000);

setgid() 调用之前。然后该进程应该具有 dialout 组的权限。

关于c - 以 root 身份运行程序时出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com