歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix資訊 >> 一個Unix SUID程序

一個Unix SUID程序

日期:2017/3/6 11:38:20   编辑:Unix資訊

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);
  4. }

編譯為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 //該進程轉變為超級用戶進程

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

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

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

Copyright © Linux教程網 All Rights Reserved