问题描述
我有以下 C 程序。
$ cat main.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char *argv[]) {
int fd;
if((fd = open(argv[1],O_RDONLY)) == -1) {
perror("open");
return 1;
}
if(close(fd) == -1) {
perror("close");
return 1;
}
return 0;
}
但我收到以下错误。
touch tmpfile
sudo chown root tmpfile
sudo chown root ./main_prog
sudo setcap cap_setuid+ep ./main_prog # There will be no error if I use sudo chmod u+s
./main_prog tmpfile
open: Permission denied
谁能告诉我如何将 setcap 用于 setuid?
解决方法
您尝试做的是访问需要访问权限的文件。 cap_setuid
功能不直接授予此权限 - 它授予进程更改其自己的 UID 的权限。您可以通过此路径到达那里,但需要在您的程序中添加更多代码。
您希望为您的用例提供的功能是覆盖自由访问控制:cap_dac_override
。
使用您写的 ./main_prog
,试试这个:
$ touch tmpfile
$ sudo chown root.root tmpfile
$ sudo chmod go-r tmpfile
$ ls -l tmpfile
-rw------- 1 root root 0 Apr 9 08:02 tmpfile
$ cat tmpfile
cat: tmpfile: Permission denied
$ sudo setcap cap_dac_override=ep ./main_prog
$ ./main_prog tmpfile
$ echo $?
0
请注意,使用功能,main_prog
不需要由 root 拥有。