cat*_*eof 6 c linux security setuid
我有一个权限为4750的进程.我的Linux系统中存在两个用户.root用户和appz用户.该进程继承了以"appz"用户身份运行的进程管理器的权限.
我有两个基本的例程:
void do_root (void)
{
int status;
status = seteuid (euid);
if (status < 0) {
exit (status);
}
}
/* undo root permissions */
void undo_root (void)
{
int status;
status = seteuid (ruid);
if (status < 0) {
exit (status);
}
status = setuid(ruid);
if (status < 0) {
exit (status);
}
}
Run Code Online (Sandbox Code Playgroud)
我的流程如下:
int main() {
undo_root();
do some stuff;
do_root();
bind( port 80); //needs root perm
undo_root();
while(1) {
accept commads()
if ( commands needs root user access)
{
do_root();
execute();
undo_root();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我想以root身份执行一些命令.我试图临时删除权限,如果任务需要root访问权限,我在do_root和undo_root调用之间包装命令.
然而,似乎我的程序不起作用.
做这个规范的方法是什么?
老派的方法是在do_root和undo_root中使用setreuid()来交换ruid和euid:
setreuid(geteuid(), getuid());
Run Code Online (Sandbox Code Playgroud)
如果程序足够小,可以进行完整的安全审计,那么这是完全可以接受的.
新学校的方式要复杂得多,并且涉及fork()关闭一个孩子,该子女接受以root身份做什么的指令,然后做setuid(getuid())以永久地在父母中删除root.孩子负责验证它收到的所有指令.对于足够大的程序,这会丢弃必须进行安全审计的代码量,并允许用户使用作业控制来管理进程或将其终止等.
陈浩,大卫瓦格纳和德鲁迪恩有一篇论文" Setuid Demystified ".它在USENIX 2002上发表.它描述了如何setuid()和过渡非常详细(2002年正确).这是值得一读的(好几次 - 我必须在一年或两年的时间内重新阅读它).
从根本上说,作为Petesh的评论指出,当EUID 0的过程确实setuid(nuid)有nuid != 0,有没有办法回root(EUID 0)权限.事实上,它至关重要.否则,当您登录时,root登录您的进程无法限制您自己的权限 - 您可以返回root.保存的UID使事情复杂化,但我不相信它会影响EUID 0的单向陷阱setuid().
| 归档时间: |
|
| 查看次数: |
19970 次 |
| 最近记录: |