有什么方法可以增强您的流程的权限吗?下面是一个示例:假设程序 A 是用 C 语言编译的,仅具有用户模式权限。现在假设这个程序想要获得 root 权限,但它需要 root 的用户名和密码。因此它调用了一个宏或库,然后请求用户名和密码。如果用户名或密码不正确,则会返回错误,但如果用户名和密码正确,则会授予进程 root 权限。
答案1
这不可能。不是因为 C 中没有函数,而是因为 Unix 安全模型禁止这样做。
在Unix安全模型下,程序只能减少其权限,而永远不能增加其权限。一个进程可以暂时减少其有效的特权,并在以后恢复其原来的“真正”特权,但它永远不能比它开始的地方更进一步。
用户登录的进程必须以 root 权限启动,即有权执行所有操作。一旦用户输入了名称和密码并且登录程序验证了它们,该过程将永久更改为所需的用户。它可以通过以下两种方式获取root权限:
- 它可以由另一个以 root 身份运行的进程启动。这就是控制台登录和 SSH 登录的工作原理。
- 它可以是一个设定值属于 root 的可执行文件。这就是如何
su
工作sudo
的。
我在这里简化了一些事情,但是程序不能增加其权限的基本原则始终是正确的。进程获得特权的方法只有一种,那就是执行setuid1 可执行文件。
如果一个程序需要执行一些具有更高权限的任务,它自己将无法完成。它必须获得更高权限的进程才能做到这一点。它可以通过联系以所需权限运行的已运行服务器或通过运行 setuid 可执行文件来完成此操作。 setuid 可执行文件可以类似于su
或 ,sudo
它反过来运行一个没有任何特殊权限的可执行文件,但如果存在权限提升,则链中必须有一个 setuid 可执行文件。
或 setgid、setpcap ...