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
当一个进程生成另一个进程的时候,一定要保持其最小权限原则,防止权限被不断的复制。