gpt4 book ai didi

c - 以 root 身份打开文件,但在读取文件之前放弃权限?

转载 作者:IT王子 更新时间:2023-10-29 00:43:35 25 4
gpt4 key购买 nike

长话短说

我正在编写 C 程序。我需要拥有 root 权限才能fopen 一个 sysfs 文件,而且我仍然需要 root 权限才能从中读取。但是,由于我的程序需要持续读取 sysfs 文件,这意味着它需要一直提升权限。我想尽快放弃 root 权限。解决此问题的公认方法是什么?

详情

我正在编写一个与 sysfs 交互的程序。如果我在 shell 上运行命令,我会使用:

myuser@mymachine:~$ sudo su
root@mymachine:/home/myhomedir# cd /sys/class/gpio
root@mymachine:/sys/class/gpio# echo 971 > export
root@mymachine:/sys/class/gpio# cat gpio971/value
0
root@mymachine:/sys/class/gpio# exit

我需要在非特权用户可调用的 C 程序中运行这些命令。一种方法是使用 fopenfprintffscanf 等以通常的方式编写程序,然后让用户运行该程序通过 sudo。然而,这意味着用户需要成为 sudoer,程序将一直拥有 root 权限。

另一个我非常喜欢的解决方案(因为不必将用户添加到 sudoers)是将程序的所有者更改为 root,并设置 setuid 位。 (这是我从 here 学到的)。

但是,有件事我想知道。我想做的是在程序的 euid 为 0 时打开 sysfs 文件,然后立即放弃所有权限(为了安全)。然后,既然文件已经打开,我们只需将 setuid() 设置为用户的 UID。但是,尽管我不能完全确定,但这是行不通的。这是我的代码的相关部分:

//At this point, due to the file permissions on the executable,
//euid = 0 and ruid = 1000. I know the following 4 lines work.
FILE *export = fopen("/sys/class/gpio/export", "wb");
fprintf(export, "971\n");
fclose(export);

FILE *sw_gpio = fopen("/sys/class/gpio971/value", "rb");

setuid(1000);
//Now euid = 1000 and ruid = 1000

int switch_val = -1;
fscanf(sw_gpio, "%d", &switch_val);
printf("Switch value: %d\n", switch_val); //-1
//Even though the only possible values in this sysfs file are 0 and 1,
//switch_val is still equal to -1

fclose(sw_gpio);

所以看来我需要保持提升的权限才能从 /sys/class/gpio/gpio971/value 中读取。但这正是我想要的!该程序将需要在整个程序执行过程中轮询该值,我不想一直使用 root 权限。

最后,为了完成,这里是我为我的可执行文件设置的权限:

-rwsr-xr-x 1 root myuser 10943 Jan 1 20:17 main*

那么如何放弃 root 权限,但继续从访问受控的 sysfs 文件中读取呢?

最佳答案

我还没有用 /sysfs 尝试过,但即使是普通文件,我的理解是文件 streams 在调用 后不会保留访问权限setuid()。但是,由于我不明白的原因,文件句柄 确实如此。因此,如果您的系统行为与我的相同(x64 上的 Fedora 20),您可以使用 open()/read() 而不是 fopen()/fscanf()

关于c - 以 root 身份打开文件,但在读取文件之前放弃权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45960961/

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