Swayer_Chen 发表于 2017-01-03 11:46

进程执行文件访问权限

我想实现的功能是:以root用户执行一个进程process,但是需要此进程对系统文件访问权限不能有root权限,对其他文件只能拥有只读权限(root用户可读写)。

方案:
1、将可执行文件process,通过命令chown修改起文件所用着为用户heop,并设置可执行文件的setuid位,即+s。
2、修改系统文件的权限为644(root用户存在读写权限,其他用户只读)。
3、然后运行可执行文件process。

这样基本可以实现进程process对系统文件的只读操作。

但是存在一个问题,如果进程process调用setuid将uid设置为root,这样进程就拥有了root权限了,请问有没有哪位大神能有更好的方案。
是不是设置执行文件的setuid位,不能彻底的抛弃root权限?

我这里测试发现,按照我方案步骤实现,在运行程序的时候ps命令出来看到进程usr为heop。
如果在process中调用setuid(0)将uid设置为root,进程运行后ps命令看到的进程usr变为root。



cao627 发表于 2017-01-03 16:58

回复 1# Swayer_Chen

我在当前目录用root用户创建了一个空白文本文件test.txt。权限为644。

然后在普通用户下用c语言写了一段代码, 打开如上的test.txt.并向其中写入字符,代码如下:

#include<fcntl.h>
#include<unistd.h>
int main()
{
    setuid(0);
    sleep(10);
    int f1=open("./test.txt",O_CREAT|O_RDWR);
    write(f1,"hello,world\n",8);
    close(f1);
    return 0;
}

编译执行如上代码生成可执行文件 a.out,由于如上代码的源文件的宿主是普通用户,编译后的可执行文件a.out的宿主也是普通用户,又以普通用户的身份执行这个a.out    执行后文件test.txt依旧空白。

用chown 命令改变a.out宿主为root, 依旧依普通用户执行a.out , 用ps命令看到a.out的进程的拥有者还是普通用户,并且命令执行完毕后 test.txt依旧空白。

最后用sudo 执行a.out   命令结束后text.txt文件中被写入了字符。

Swayer_Chen 发表于 2017-01-04 09:31

回复 2# cao627

你好,我这里的环境是嵌入式的,所以没有办法以普通用户去执行或者引导a.out。现在的模式是将一个进程文件导入到嵌入式设备中,用嵌入式设备中的一个主进程引导这个a.out进程启动,所以引导进程启动的肯定是root用户,即RUID肯定是root。
所以,问题来了, 以root用户引导启动的进程,怎么让他彻底抛弃root权限?
环境:
1、系统文件(待访问的文件)都是root或者非heop用户。
2、需要引导的进程用root用户启动。
3、可以修改待引导进程文件宿主为heop。


cao627 发表于 2017-01-04 16:45

回复 3# Swayer_Chen

不管这个a.out文件的宿主是谁,只要以root身份运行它,它包含的对系统的操作,就是在以root的身份在做。

在我的桌面linux上
将如上代码中的setuid改写为setuid (1000)
那么即使用sudo命令执行a.out,也不能向test.txt文件写入字符串。因为以sudo命令启动a.out ,那么a.out的运行身份就是root 。然后,当a.out执行到setuid (1000) ,a.out身份就跳到id为1000的那个用户,由于id为1000的用户为系统中的一个普通用户,对宿主为root,权限为644的test.txt没有写权限。

Swayer_Chen 发表于 2017-01-12 10:19

回复 4# cao627

好吧。。。。谢谢~~~~
页: [1]
查看完整版本: 进程执行文件访问权限