Unix操作系统有很多值得学习的地方,这里我们主要介绍Unix操作系统中的一个Unix SUID程序,大家一起来学习下吧!希望对大家对Unix操作系统的学习有所帮助。
下面的程序是用来演示Unix文件的Unix SUID,取名为parent.c
- QUOTE:
- #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);
- }
该程序将一个Unix 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
故而,Unix SUID的程序往往伴随着一定的安全问题。在早期的Unix环境中,Unix SUID/SGID的程序调用system()函数就存在着安全性漏洞。
【编辑推荐】