如何使用 setcap 启用 setuid 功能

问题描述

我有以下 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 拥有。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...