setuid(0) 与 CAP_SETUID

问题描述 投票:0回答:3

我正在尝试使用

CAP_SETUID
功能将我的 uid 更改为 0 作为非 root。我有以下程序:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/capability.h>
#include <sys/prctl.h>

int main(int argc, char *argv[])
{
    printf("cap setuid in bset: %d\n", prctl(PR_CAPBSET_READ, CAP_SETUID, 0, 0, 0));
    printf("%s\n", cap_to_text(cap_get_file(argv[0]), NULL));
    printf("%s\n", cap_to_text(cap_get_proc(), NULL));
    printf("uid: %d\n", (int) getuid());
    setresuid(0, 0, 0);
    printf("uid: %d\n", (int) getuid());
    return 0;
}

我分配 setuid 功能如下:

sudo /sbin/setcap cap_setuid=ep ./capsetuid

我得到以下输出

cap setuid in bset: 1
= cap_setuid+ep
=
uid: 1000
uid: 1000

我希望第二个 printf() 也能显示

CAP_SETUID
功能。不知何故,我的进程没有获得 setuid 文件功能。我在这里做错了什么?

linux privileges linux-capabilities
3个回答
3
投票

刚刚发现需要在内核命令行上使用 file_caps=1 启用文件功能。


2
投票

setuid()
设置进程的 effective 用户 ID,但
getuid()
获取 real 用户 ID。

getuid()
更改为
geteuid()
就可以了。


0
投票

设置了挂载选项 nosuid 的文件系统可能是另一个原因。

tmpfs
例如设置为nosuid,这可能会导致setcap根本不生效。

© www.soinside.com 2019 - 2024. All rights reserved.