您的位置:首页 > 其它

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

2013-06-22 15:32 375 查看
本文以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执行信息进行处理,只为演示效果):

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(int argc, char **argv)
{
uid_t uid = getuid();
if(setuid(0))
{
printf("setuid error");
return -1;
}
printf("run as root, setuid is 0\n");

// 临时具备root权限,可以正常执行
system("dpkg -i /Library/Caches/test.deb");

if(setuid(uid))
{
printf("setuid error");
return -1;
}
printf("run as user, setuid is %d\n", uid);

// 恢复用户权限,执行失败
system("dpkg -i /Library/Caches/test.deb");
return 0;
}


test.sh

#!/bin/sh

exec ./test


by yytong
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: