1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <unistd.h>
#include <stdio.h>

static bool switch_to_user(uid_t user_id, gid_t gp_id)
{
if ((user_id == 0) && (gp_id == 0))
{
return false;
}

gid_t gid = getgid();
uid_t uid = getuid();
if (((gid != 0) || (uid != 0)) && ((gid != gp_id) || (uid != user_id)))
{
return false;
}

if (uid != 0)
{
return true;
}

if ((setgid(gp_id) < 0) || (setuid(user_id) < 0))
{
return false;
}

return true;
}

int main()
{
printf("uid:%d gid:%d\n", getuid(), getgid());

switch_to_user(1000, 1000);
printf("uid:%d gid:%d\n", getuid(), getgid());

return 0;
}

 评论