I am trying to change my uid to 0 as non-root with the CAP_SETUID
capability. I have the following program:
#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;
}
I assign the setuid capability as follows:
sudo /sbin/setcap cap_setuid=ep ./capsetuid
And I get the following output
cap setuid in bset: 1
= cap_setuid+ep
=
uid: 1000
uid: 1000
I would expect the second printf() to also show the CAP_SETUID
capability. Somehow my process does not get the setuid file capability. What am I doing wrong here?
刚刚发现,需要在内核命令行上使用file_caps = 1启用文件功能。
setuid()
sets the effective user-id of the process, but getuid()
gets the real user-id.
Change the getuid()
to geteuid()
and it should work.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.