uid=real uid =用户登录shell时的用户id 执行程序的用户id
euid = effective uid = 执行该程序的用户id 可执行程序的属主id
通过whoami 或 id命令可以查看
setuid()用来重新设置执行目前进程的用户识别码。不过,要让此函数有作用,其有效的用户识别 码必须为0(root)。在Linux下,当root使用setuid()来变换成其他用户识别码时,root权限会被抛弃,完全转换成该用户身份,也就 是说,该进程往后将不再具有可setuid()的权利,如果只是向暂时抛弃root 权限,稍后想重新取回权限,则必须使用seteuid()。
执行成功则返回0,失败则返回-1,错误代码存于errno。
一般在编写具setuid root的程序时,为减少此类程序带来的系统安全风险,在使用完root权限后建议马上执行setuid(getuid());来抛弃root权限。此外,进程uid和euid不一致时Linux系统将不会产生core dump。
int setuid(uid_t uid)
1) 若进程具有超级用户权限(以root用户来执行文件),则setuid将实际用户ID、有效用户ID及保存的设置用户ID设置为uid
2) 若进程没有超级用户权限(用普通用户来执行文件),但是uid等于实际用户ID或保存的设置用户ID,则setuid只将有效用户ID设置为uid
int seteuid(uid_t uid)
1) 若进程具有超级用户权限,则setuid只将有效用户ID设置为uid
2) 若进程没有超级用户权限,则setuid只将有效用户ID设置为uid, 但是uid必须等于实际用户ID或保存的设置用户ID,
int setreuid(uid_t ruid, uid_t euid)
1) 针对设置用户ID位的程序: 交换有效用户ID和保存的设置用户ID
2) 针对没有设置用户ID位的程序: 交换有效用户ID和实际用户ID
===============================================
http://hubingforever.blog.163.com/blog/static/171040579201372932033844/
[root@10:25:48 c]>>> id root
uid=0(root) gid=0(root) groups=0(root)
[root@10:26:16 c]>>> id bwei
uid=500(bwei) gid=500(bwei) groups=500(bwei)
[root@10:26:29 c]>>> id bwei2
uid=501(bwei2) gid=501(bwei2) groups=501(bwei2)
两个函数声明如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void show_ids()
{
uid_t uid = getuid();
uid_t euid = geteuid();
printf("real userid :%d, effective uerid:%d\n", uid, euid);
}
int main()
{
show_ids();
if(setuid(501) < 0)
{
perror("setuid error");
}
show_ids();
return 0;
}
real userid :0, effective uerid:0
real userid :501, effective uerid:501
[bwei@10:28:13 c]>>> ./a.out
real userid :500, effective uerid:500
setuid error: Operation not permitted //普通用户不能setuid(其他用户id)
real userid :500, effective uerid:500
切换到root用户,设置强制位
[bwei@10:35:18 c]>>> su
[root@10:35:40 c]>>> chmod +s a.out
-rwsr-sr-x 1 root root 7108 May 20 10:22 a.out
再以普通用户执行
[root@10:35:58 c]>>> su bwei
[bwei@10:36:03 c]>>> ./a.out
输出:
real userid :500, effective uerid:0
real userid :501, effective uerid:501