一个Unix SUID程序

该程序将一个Unix SUID的进程转变为一个超级用户进程。将此程序编译成可执行目标文件parent ,用另一个简单的程序进行检验.
首页 新闻资讯 行业资讯 一个Unix SUID程序

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

【编辑推荐】

  1. 学习使用自定义Unix系统功能键

  2. 选用Unix系统交换区的指导方针

  3. Unix系统交换区动态设置及其他知识讲解

  4. Unix系统交换区类型大讲堂

  5. Unix系统数据库及通信软件的启停处理

14    2010-05-06 16:40:47    Unix SUID