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()函數就存在著安全性漏洞。