SUID权限控制问题
- monkey1992
- 帖子: 9
- 注册时间: 2012-07-16 14:19
SUID权限控制问题
我们linux的课程设计要用shell做一个作业管理系统,要求实现不同权限的用户(比如管理员,教师,学生等),系统是基于文件的。所以需要一中权限管理机制来实现让用户只能通过我所写的shell脚本才能访问系统中的那些文件,而不能直接去访问。
我一开始想到的是SUID权限,以为这个对shell脚本也适用,但是昨天晚上才发现SUID只对可执行二进制程序有用,对shell脚本是没用的,汗!!!
于是我想到能不能把shell脚本给它转化成二进制程序,然后给二进制程序加上SUID权限。
我在网上找到了一个叫shc软件,可以把sh脚本转化成c语言代码进而转化成二进制程序,但是试验了一下发现对二进制程序设定SUID权限后还是没有用,不知道还有什么其他的方法能够把SUID权限应用到shell上来?SUID权限到底是怎么起作用的?用户在执行二进制程序后产生的子进程中suid权限是不是就没掉了?
如果实在不能应用suid权限的话,那么对于这样的系统来说应该用什么方法来实现:用户直接是不能碰文件,但是透过一个特定的shell就可以碰了……
码字有点多,不知道说的是不是够清楚了,求大大解答
我一开始想到的是SUID权限,以为这个对shell脚本也适用,但是昨天晚上才发现SUID只对可执行二进制程序有用,对shell脚本是没用的,汗!!!
于是我想到能不能把shell脚本给它转化成二进制程序,然后给二进制程序加上SUID权限。
我在网上找到了一个叫shc软件,可以把sh脚本转化成c语言代码进而转化成二进制程序,但是试验了一下发现对二进制程序设定SUID权限后还是没有用,不知道还有什么其他的方法能够把SUID权限应用到shell上来?SUID权限到底是怎么起作用的?用户在执行二进制程序后产生的子进程中suid权限是不是就没掉了?
如果实在不能应用suid权限的话,那么对于这样的系统来说应该用什么方法来实现:用户直接是不能碰文件,但是透过一个特定的shell就可以碰了……
码字有点多,不知道说的是不是够清楚了,求大大解答
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: SUID权限控制问题
写个二进制Í程序 system 你的 shell 脚本。
当然,专业点的用 execv。
当然,专业点的用 execv。
- monkey1992
- 帖子: 9
- 注册时间: 2012-07-16 14:19
Re: SUID权限控制问题
试了system和execvp,结果都不行。lilydjwg 写了:写个二进制Í程序 system 你的 shell 脚本。
当然,专业点的用 execv。
我是这样试的,不知道对么。
代码: 全选
//b.c
#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char *program = "./a.sh"; /*a.sh是当前目录下面的一个脚本文件,内容是查看一个只有owner才有r权限的文件*/
char *arg_list[] = {NULL};
execvp(program,arg_list);
return 0;
}
/*然后编译,并设置可执行文件的suid*/
cc b.c -o b.out
chmod u+s b.out

- cuihao
- 帖子: 4793
- 注册时间: 2008-07-24 11:33
- 来自: 郑州
- 联系:
Re: SUID权限控制问题
给其他用户加执行权限了么?
代码: 全选
chmod a+x 程序
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 蓝红黄蓝绿红
Site: CUIHAO.TK Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
Site: CUIHAO.TK Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
- monkey1992
- 帖子: 9
- 注册时间: 2012-07-16 14:19
Re: SUID权限控制问题
我没说清楚,这个加了的。cuihao 写了:给其他用户加执行权限嘛:代码: 全选
chmod a+x 程序
这个程序的所有者运行结果是显示一个文件的内容,而换其他用户运行这个程序会出现提示cat:permission denied。
这说明,其他用户执行这个程序是还是没有获得所有者的权限,看来想通过exec让脚本程序支持suid是不行的了
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: SUID权限控制问题
setuid 和 seteuid 都试试。
另外,arg_list 中少了 argv[0]。
另外,arg_list 中少了 argv[0]。
- monkey1992
- 帖子: 9
- 注册时间: 2012-07-16 14:19
Re: SUID权限控制问题
我改成如下的代码,然后生效了,对比以前我似乎知道问题所在了。lilydjwg 写了:setuid 和 seteuid 都试试。
另外,arg_list 中少了 argv[0]。
代码: 全选
#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
execl("/bin/cat","cat","testfile",(char *)0); /*这里必须直接用cat,而不能是shell脚本,否则就没效*/
return 0;
}
看来我以前的想法是彻底不行了。
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: SUID权限控制问题
1. 试试 setuid / seteuid。monkey1992 写了:我改成如下的代码,然后生效了,对比以前我似乎知道问题所在了。lilydjwg 写了:setuid 和 seteuid 都试试。
另外,arg_list 中少了 argv[0]。即使使用exec等函数族,也不能使得shell脚本获取suid权限,即exec shell脚本是没用的,除非你在exec里面直接去运行二进制程序,比如/bin/cat,/bin/touch等等,这样才行。代码: 全选
#include<stdlib.h> #include<stdio.h> #include <sys/types.h> #include <unistd.h> int main() { execl("/bin/cat","cat","testfile",(char *)0); /*这里必须直接用cat,而不能是shell脚本,否则就没效*/ return 0; }
看来我以前的想法是彻底不行了。
2. 试试 exec bash、
- monkey1992
- 帖子: 9
- 注册时间: 2012-07-16 14:19
Re: SUID权限控制问题
不行哎,bash是不支持suid的,怎么折腾都不行,我试着换成了zsh,结果可以了。也就是说,zsh支持suid权限lilydjwg 写了:1. 试试 setuid / seteuid。monkey1992 写了:我改成如下的代码,然后生效了,对比以前我似乎知道问题所在了。lilydjwg 写了:setuid 和 seteuid 都试试。
另外,arg_list 中少了 argv[0]。即使使用exec等函数族,也不能使得shell脚本获取suid权限,即exec shell脚本是没用的,除非你在exec里面直接去运行二进制程序,比如/bin/cat,/bin/touch等等,这样才行。代码: 全选
#include<stdlib.h> #include<stdio.h> #include <sys/types.h> #include <unistd.h> int main() { execl("/bin/cat","cat","testfile",(char *)0); /*这里必须直接用cat,而不能是shell脚本,否则就没效*/ return 0; }
看来我以前的想法是彻底不行了。
2. 试试 exec bash、
- link_01
- 帖子: 1024
- 注册时间: 2008-11-05 13:24