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); }
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.
该程序将一个Unix SUID的进程转变为一个超级用户进程。将此程序编译成可执行目标文件parent ,用另一个简单的程序进行检验
复制
int main(void){ printf("real uid=%d, effective uid=%d\n",getuid(),geteuid()); exit(0); }
1.
2.
3.
4.
编译为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 //该进程转变为超级用户进程
1.
2.
3.
4.
5.
6.
7.
8.
9.
某一进程一旦转变为超级用户进程,将拥有系统的完全控制权。比如,我们可以这样执行演示程序:
复制
$ ./parent useradd hacker $ ./parent passwd hacker
1.
2.
故而,Unix SUID的程序往往伴随着一定的安全问题。在早期的Unix环境中,Unix SUID/SGID的程序调用system()函数就存在着安全性漏洞。
【编辑推荐】