首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中运行setuid程序的正确方法

在C中运行setuid程序的正确方法
EN

Stack Overflow用户
提问于 2012-02-16 00:42:19
回答 3查看 23.9K关注 0票数 6

我有一个拥有4750权限的进程。我的Linux系统中有两个用户。root用户和appz用户。该进程继承以"appz“用户身份运行的进程管理器的权限。

我有两个基本的例程:

代码语言:javascript
复制
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);
        }
}

我的流程如下:

代码语言:javascript
复制
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();

    }

 }

如您所见,我想以root用户身份执行一些命令。我正在尝试暂时删除权限,如果任务需要根用户访问权限,我会在do_root和undo_root调用之间包装命令。

然而,我的程序似乎不能正常工作。

做这件事的规范方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-16 00:59:20

老式的方法是在do_root和undo_root中使用setreuid()来交换ruid和euid:

代码语言:javascript
复制
setreuid(geteuid(), getuid());

如果程序足够小,可以进行完整的安全审计,那么这是完全可以接受的。

新学校的方法要复杂得多,它涉及fork()派生子进程,该子进程接受根用户的操作指令,然后执行setuid(getuid())以永久地将根目录删除到父进程中。子进程负责验证它收到的所有指令。对于足够大的程序,这将减少必须进行安全审计的代码量,并允许用户使用作业控制来管理进程或终止它,等等。

票数 6
EN

Stack Overflow用户

发布于 2012-02-16 00:53:35

有一篇名为“Setuid Demystified”的论文,作者是陈浩、大卫·瓦格纳和德鲁·迪恩。它是在USENIX 2002上展示的。它非常详细地描述了setuid()和转换是如何工作的(2002年是正确的)。这本书非常值得一读(读了好几遍--我一定已经晚了一两年才重读这本书)。

从根本上说,正如Petesh在一条评论中指出的那样,当EUID0的进程使用nuid != 0执行setuid(nuid)时,将无法返回到root (EUID0)权限。事实上,它是至关重要的。否则,当您登录时,使您登录的root进程不会将您限制为您自己的权限-您将能够返回到root。保存UID会使事情变得复杂,但我不相信它会影响EUID0执行setuid()的单向陷阱。

票数 5
EN

Stack Overflow用户

发布于 2012-02-16 00:50:17

setuid手册页显示了以下内容:

...如果set- user -ID-root程序希望暂时删除root权限,使用非root用户的身份,然后重新获得root权限,则不能使用setuid()

这意味着您不能使用setuid()。您必须使用seteuid(),可能还需要使用setreuid()。有关更多详细信息,请参阅Setuid Program Example

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9297415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档