ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 以root身份打开文件,但在读取之前删除权限?

2019-07-10 18:50:23  阅读:222  来源: 互联网

标签:c-3 linux setuid sysfs


TL; DR

我正在写一个C程序.我需要拥有root权限来打开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程序中运行这些命令.一种方法是使用fopen,fprintf,fscanf等以通常的方式编写程序,并让用户通过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,但即使使用普通文件,我的理解是文件流在调用setuid()后不保留访问权限.但是,由于我不理解的原因,文件句柄会这样做.因此,如果您的系统行为类似于我的(x64上的Fedora 20),您可以使用open()/ read()而不是fopen()/ fscanf().

标签:c-3,linux,setuid,sysfs
来源: https://codeday.me/bug/20190710/1427133.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有