euid和uid以及gcc的euid uid链接问题
来源:互联网 发布:网络使人更亲近的例子 编辑:程序博客网 时间:2024/06/05 00:42
linux用户标识UID与有效用户标识EUID
标签:euiduid有效用户id 用户id linux
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://keren.blog.51cto.com/720558/144908
linux系统中每个进程都有2个ID,分别为用户ID和有效用户ID,UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。可以通过函数getuid()和geteuid()或者进程的两个ID值。
当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。
以下通过一个典型问题和代码实例来说明UID和EUID的问题。
【关于linux的passwd命令】
passwd命令是用来修改用户登陆密码的,用来记录用户登陆密码的文件为/etc/shadow,该文件只有root用户具有访问权限,如下所示:
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ cd /etc
gaolu@gaolu-desktop:/etc$ ls -l shadow
-rw-r----- 1 root shadow 978 2009-02-22 21:25 shadow
gaolu@gaolu-desktop:/etc$
gaolu@gaolu-desktop:~$ cd /etc
gaolu@gaolu-desktop:/etc$ ls -l shadow
-rw-r----- 1 root shadow 978 2009-02-22 21:25 shadow
gaolu@gaolu-desktop:/etc$
这是出现了矛盾:出于安全考虑,不允许普通用户查看并修改shadow文件;但是如果这样普通用户就无法为自己修改密码。
Linux系统就是使用setuid来解决这个矛盾的问题:如果一个程序被设置了setuid位,那么它无论被哪个用户启用,都会具备程序所有者的权限。而passwd程序的所有者是root用户,passwd的权限如下所示,那么任何用户执行该程序,程序的EUID就会变成root用户的EUID,而不是执行该程序的UID。
gaolu@gaolu-desktop:/etc$ cd /usr/bin
gaolu@gaolu-desktop:/usr/bin$ ls -l passwd
-rwsr-xr-x 1 root root 32988 2008-06-10 02:10 passwd
gaolu@gaolu-desktop:/usr/bin$
gaolu@gaolu-desktop:/usr/bin$
gaolu@gaolu-desktop:/usr/bin$ ls -l passwd
-rwsr-xr-x 1 root root 32988 2008-06-10 02:10 passwd
gaolu@gaolu-desktop:/usr/bin$
gaolu@gaolu-desktop:/usr/bin$
因此,普通用户可以通过passwd程序修改shadow文件内容,完成密码修改。
【让代码说明问题】
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
printf("Current process UID: %ld\n",(long)getuid());
printf("Current process EUID: %ld\n",(long)geteuid());
return 1;
}
执行情况:
gaolu@gaolu-desktop:~$ gcc -o uid uid.c
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ chmod u+s uid //用户主增加权限setuid
gaolu@gaolu-desktop:~$ ls -l uid
-rwsr-xr-x 1 gaolu gaolu 9118 2009-03-08 22:26 uid
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ ./uid
Current process UID: 1000
Current process EUID: 1000
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ su //切换到root用户
Password:
root@gaolu-desktop:/home/gaolu# ls -l uid
-rwsr-xr-x 1 gaolu gaolu 9118 2009-03-08 22:26 uid
root@gaolu-desktop:/home/gaolu# ./uid
Current process UID: 0
Current process EUID: 1000 //有效用户ID为1000
root@gaolu-desktop:/home/gaolu#
root@gaolu-desktop:/home/gaolu#
gaolu@gaolu-desktop:~$ chmod u+s uid //用户主增加权限setuid
gaolu@gaolu-desktop:~$ ls -l uid
-rwsr-xr-x 1 gaolu gaolu 9118 2009-03-08 22:26 uid
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ ./uid
Current process UID: 1000
Current process EUID: 1000
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ su //切换到root用户
Password:
root@gaolu-desktop:/home/gaolu# ls -l uid
-rwsr-xr-x 1 gaolu gaolu 9118 2009-03-08 22:26 uid
root@gaolu-desktop:/home/gaolu# ./uid
Current process UID: 0
Current process EUID: 1000 //有效用户ID为1000
root@gaolu-desktop:/home/gaolu#
root@gaolu-desktop:/home/gaolu#
本文出自 “淡泊明志,宁静致远” 博客,请务必保留此出处http://keren.blog.51cto.com/720558/144908
如果不采取特别的措施,允许用户控制动态连接库会对setuid/setgid程序造成灾难性的后果。因此在实现GNU glibc时,如果是setuid或setgid程序,将忽略这些变量(和其它类似的变量),或者严格限制这些变量所起的作用。GNU的glibc库通过检查程序的证明来确定其是否为setuid或setgid程序;如果uid和euid不同,或者gid和egid不同,则库就假设该程序为setuid/setgid程序(或者为其子程序),然后严格限制它控制连接的能力。如果载入GNU的glibc库,就可以看到这种情况;
请特别阅读一下文件elf/rtld.c和sysdeps/generic/dl-sysdep.c.这就意味着如果使uid和gid等于euid和egid,再调用程序,这些变量就具有完全的效力。其它类Unix系统处理这些情况有所不同,但原因相同:一个setuid/setgid程序不应受到环境变量集的过分影响。
- euid和uid以及gcc的euid uid链接问题
- linux的uid和euid相关问题
- uid 和 euid 的区别
- 进程的uid和euid
- Linux进程的uid和euid
- Linux进程的uid和euid
- Linux进程的uid和euid
- Linux进程的uid和euid
- UID, EUID, SUID, FSUID
- UID, EUID, SUID, FSUID
- UID, EUID, SUID
- UID, EUID, SUID, FSUID
- Uid euid gid egid关系
- uid gid euid egid详解
- uid gid euid egid详解
- uid euid suid 相关函数
- Linux中的UID,EUID,SUID
- UNIX(2) euid, suid, uid
- 插入数据
- 用户模式异步过程调用(APC)
- 简单配置自己的Bash Shell
- QEMU-KVM Command Line学习笔记1
- SQLSERVER2008 18456错误
- euid和uid以及gcc的euid uid链接问题
- Cannot find bean: "EmpNumber" in any scope
- 【笔者支招】巧挪用户文件夹提高系统盘稳定性
- Largest Rectangle in Histogram
- Tomcat Server.xml详解
- c语言实现一般的延时
- MAT 工具的使用的一些知识
- WP8 Tile(磁贴) 介绍
- 推荐两个Windows安装制作程序