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

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

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


      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值