设置用户ID的程序调用system危险

来源:互联网 发布:dota2数据库 编辑:程序博客网 时间:2024/06/06 08:38

system函数实现调用了fork, exec和waitpid。如果调用system的程序设置了用户ID,那么在fork,exec后的进程,保存了父进程的权限。当一个进程执行某个程序时,如果程序设置来用户ID,那么进程的有效用户ID将被设置为程序文件的实际用户ID,那么进程将拥有该文件拥有者的权限。这个权限在调用system后,被子进程继承来下来。

例如:systest.c

int main(int argc,char *argv[]){     int status;     ...     status = system(argv[1]);     ... }

被system函数调用的程序:test.c
int main(){  int status;  if((status = mkdir("/root/rub",S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) == -1){          perror("mkdir error");          exit(-1);     }//需要有超级用户权限    exit(0)}

$ gcc -o systest systest.c

$gcc -o test test.c

$./systest  ./test

mkdir error: Permission denied

$su root  //OK后

#chown root systest

$./systest  ./test

mkdir error: Permission denied

$chmod u+s systest

$./systest ./test

$ls /root

rub

当一个进程生成另一个进程的时候,一定要保持其最小权限原则,防止权限被不断的复制。