编写具有临时root权限的应用

本文以dpkg为例进行演示

关于setuid具体原理可查阅《Unix高级环境编程》“进程控制”章节关于“设置用户id和设置组id”的介绍

1. 首先需要通过setuid(0),让程序获取临时的root权限,此处操作容易受各方面影响(如权限)导致调用失败

2. 调用execl函数或system函数,执行dpkg

3. 还原setuid,确保恢复原始的执行权限

以上为代码编写方面的原则,以下几步为对可执行文件的权限设置

4. 使用gcc -o test test.c编译生成test可执行文件

5. 设置可执行文件权限,在设置前后可通过ls -l查看权限区别,此处可以在安装脚本中完成

  sudo chown root:staff test

  sudo chmod 4755 test

6. 编写test.sh, 调用exec ./test进行执行,因为exec会不会更改进程的uid

7. 运行测试,显示结果

直接上代码(代码中未对system返回值以及system执行信息进行处理,只为演示效果):

 1 #include<stdio.h>  
 2 #include<unistd.h>  
 3 #include<sys/types.h>  
 4 
 5 int main(int argc, char **argv)  
 6 {  
 7     uid_t uid = getuid();  
 8     if(setuid(0)) 
 9     {   
10         printf("setuid error");  
11         return -1;  
12     }  
13     printf("run as root, setuid is 0\n");  
14 
15     // 临时具备root权限,可以正常执行
16     system("dpkg -i /Library/Caches/test.deb");
17 
18     if(setuid(uid)) 
19     {  
20         printf("setuid error");  
21         return -1;  
22     }  
23     printf("run as user, setuid is %d\n", uid);  
24 
25     // 恢复用户权限,执行失败
26     system("dpkg -i /Library/Caches/test.deb");
27     return 0;                                                                                                                                                                                                                                                                 
28 }

 

test.sh

1 #!/bin/sh
2 
3 exec ./test

 

by yytong

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值