首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式获得root权限?

问如何以编程方式获得root权限?
EN

Stack Overflow用户
提问于 2010-03-21 00:12:08
回答 7查看 44.4K关注 0票数 32

我正在编写一些软件(在C++中,用于Linux/Mac ),它以非特权用户的身份运行,但在某些情况下需要根用户权限(以创建新的虚拟设备)。

作为root用户运行这个程序是不可行的(主要是为了安全问题),我需要知道“真正”用户的身份(uid)。

有没有办法模仿"sudo“命令的行为(询问用户密码)来临时获得root权限并执行特定的任务?如果是这样,我将使用哪些函数?

非常感谢您的帮助!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-03-21 00:25:19

原始答案

您可以考虑对可执行文件本身使用setuid开关。维基百科上有一个article,它甚至非常有效地向你展示了geteuid()和getuid()之间的区别,前者是为了找出你在“模仿”谁,而后者是为了找出你是谁。例如,sudo进程geteuid应该返回0(根用户),getuid则返回用户的id,然而,它的子进程确实是以根用户身份运行的(您可以使用sudo id -u -r验证这一点)。

我不认为有一种方法可以轻松地以编程方式获得root访问权限-毕竟,应用最小特权原则,为什么需要这样做?常见的做法是仅以提升的权限运行代码的有限部分。在现代系统中,许多守护进程等也被设置为以自己的用户身份运行,并拥有所需的大部分权限。只有对于非常具体的操作(挂载等),才真正需要root权限。

2013更新

我最初的回答是成立的(尽管我2013年的回答可能比我2010年的回答更好),但如果你正在设计一个需要根访问权限的应用程序,你可能想要考虑到底需要哪种根访问权限,并考虑使用POSIX Capabilities (man page)。这些与L4等人实现的capability-based security不同。POSIX功能允许您的应用程序被授予root权限的子集。例如,CAP_SYS_MODULE将允许您插入内核模块,但不会给您其他根权限。这在发行版中使用,例如具有不加区别的根访问的Fedora has a feature to completely remove setuid binaries。

这很重要,因为作为一个程序员,你的代码显然是完美的!但是,你所依赖的库(叹息,如果你写了它们就好了!)可能会有漏洞。使用功能,您可以限制此漏洞的使用,并使您自己和您的公司免于与安全相关的审查。这会让每个人都更快乐。

票数 15
EN

Stack Overflow用户

发布于 2010-03-21 00:21:43

如果每次都需要超级用户权限,最好的方法是以超级用户身份启动程序,然后使用setuid和setgid删除它们(在子进程中)。这就是apache在需要绑定到受限端口80时所做的事情。

如果获得根权限是例外,而不是规则,并且程序以交互方式运行,则另一种方法是编写程序add_interface并执行

代码语言:javascript
复制
sudo add_interface args

让sudo为您处理身份验证。您可能希望使用图形前端,而不是sudo,如gksu、gksudo、kdesu或kdesudo。我不会尝试自己实现安全的密码输入;这可能是一个棘手的问题,您可能会留下巨大的安全漏洞和功能问题(您支持指纹识别器吗?)。

另一种选择是polkit,以前称为PolicyKit。

票数 20
EN

Stack Overflow用户

发布于 2010-03-21 00:26:54

您不能获得root权限,必须从root权限开始,并根据需要减少您的权限。通常的做法是在安装程序时设置"setuid“位:这将使用文件所有者的有效用户is运行程序。如果您在sudo上运行ls -l,您将看到它是这样安装的:

代码语言:javascript
复制
-rwsr-xr-x 2 root root 123504 2010-02-25 18:22 /usr/bin/sudo

当您的程序以根权限运行时,您可以调用setuid(2)系统调用将您的有效用户is更改为某个非特权用户。我相信(但没有尝试过这样做),您可以在setuid位打开的情况下以root身份安装您的程序,立即降低权限,然后根据需要恢复权限(但是,一旦降低了权限,就无法恢复权限)。

一个更好的解决方案是拆分需要作为root运行的程序部分,并在安装时打开setuid位。当然,您需要采取合理的预防措施,使其不能在主程序之外调用。

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

https://stackoverflow.com/questions/2483755

复制
相关文章

相似问题

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