歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> Unix資訊

一個Unix SUID程序

Unix操作系統有很多值得學習的地方,這裡我們主要介紹Unix操作系統中的一個Unix SUID程序,大家一起來學習下吧!希望對大家對Unix操作系統的學習有所幫助。

下面的程序是用來演示Unix文件的Unix SUID,取名為parent.c
 

  1. QUOTE:   
  2. #include 〈stdio.h〉  
  3. #include 〈stdlib.h〉  
  4. #include 〈unistd.h〉  
  5. #include 〈sys/types.h〉  
  6. int  
  7. main(int argc,char **argv)  
  8. {  
  9. int i;  
  10. char **argu;  
  11. uid_t uid;  
  12. uid=geteuid(); //獲取調用進程的有效用戶ID  
  13. if(argc<2){  
  14. fprintf(stderr,"usage: %s \n",argv[0]);  
  15. exit(0);  
  16. }  
  17. if(setuid(uid)<0){  
  18. fputs("setuid error.\n",stderr);  
  19. exit(1);  
  20. } //將調用進程的實際用戶ID設置為有效用戶ID  
  21. if((argu=(char**)malloc(argc*sizeof(char*)))==NULL){  
  22. fputs("malloc error.\n",stderr);  
  23. exit(1);  
  24. } //為execvp的參數指針數組分配內存空間  
  25. for(i=0;i argu[argc-1]=(char *)0; //參數指針數組以空指針結尾  
  26. if(execvp(argv[1],argu)<0){  
  27. fputs("exec error.\n",stderr);  
  28. exit(1);  
  29. } //用execvp調用命令行參數指定的程序  
  30. exit(0);  
  31. }  

該程序將一個Unix SUID的進程轉變為一個超級用戶進程。將此程序編譯成可執行目標文件parent ,用另一個簡單的程序進行檢驗

  1. int main(void){  
  2. printf("real uid=%d, effective uid=%d\n",getuid(),geteuid());  
  3. exit(0);  

編譯為printuids。運行程序得到下列結果:

  1. $ ./parent printuids //正常執行,無特權  
  2. real uid=506, effective uid=506 
  3. $ su root  
  4. Password:  
  5. # chown root parent //更改所有者  
  6. # chmod u+s parent //添加SUID  
  7. # exit  
  8. $ ./parent printuidsv real uid=0, effective uid=0 //該進程轉變為超級用戶進程  
  9.  

某一進程一旦轉變為超級用戶進程,將擁有系統的完全控制權。比如,我們可以這樣執行演示程序:
 

  1. $ ./parent useradd hacker  
  2. $ ./parent passwd hacker 

故而,Unix SUID的程序往往伴隨著一定的安全問題。在早期的Unix環境中,Unix SUID/SGID的程序調用system()函數就存在著安全性漏洞。

Copyright © Linux教程網 All Rights Reserved