【发布时间】:2010-09-29 14:30:55
【问题描述】:
我正在尝试使用 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 文件功能。我在这里做错了什么?
【问题讨论】:
-
这可能会有所帮助:blog.famzah.net/tag/cap_setuid
-
这似乎也有相关信息——尤其是接近尾声:linux.die.net/man/7/capabilities
-
看起来该进程必须具有 CAP_SETUID 权限(以及,或代替文件)。
-
@Jonathan:我刚刚更新了问题,您可能一直在查看旧问题。我发现问题是该进程没有获得文件功能,请参阅更新的问题。
标签: linux privileges linux-capabilities