运行 root 仅执行具有非 root id 的进程

Posted

技术标签:

【中文标题】运行 root 仅执行具有非 root id 的进程【英文标题】:running a root only execute process with non root id 【发布时间】:2016-02-02 00:28:04 【问题描述】:

好吧,我只是想了解 setuid 机制。所以我编写了一个触发 bash 的 C 程序 (prog1)(我在执行时使用了system("/bin/sh"),并且我为可执行文件设置了 setuid 位(以 root 身份),所以通常,当它由另一个用户执行时,而不是 root,它将正在运行的进程的有效 id 设置为 0(root id),但真正的 uid 保持不变(在我的情况下为 1000 用于用户测试)。

现在我写了另一个可执行文件 (prog2) & 我只给了 root -rwx------ 的执行权限。

我以用户“test”登录并执行了“prog1”,因此按预期引入了 bash,我执行了命令“id”并得到了以下结果:

uid=1000(test) gid=1001(test) euid=0(root)groups=1001(test),27(sudo) 

因为它显示真正的 uid 是 1000 并且有效的 uid id 0(root) 这正是 setuid-bit 所做的......现在我想执行 prog2(只有 root 可以执行)& 我很惊讶执行成功& 我什至可以阅读 /etc/shadow ...这不是安全问题吗??? ...我的意思是通常只有root的读/写/执行程序永远不能被另一个用户读/写/执行?? ...所以请你给我一些有用的信息吗?!

【问题讨论】:

【参考方案1】:

在linux下,检查文件系统权限时会参考fsuid。如果没有明确设置,这个fsuid匹配进程的euid

事实上,几乎每个权限都会根据有效用户 ID 进行检查(这就是它被称为有效的原因)。例如,真实用户 ID 用于检查是否可以发送信号(因此您可以终止您启动的 suid 进程)。许多 shell 还执行seteuid(getuid()); 之类的操作以增强安全性。

【讨论】:

以上是关于运行 root 仅执行具有非 root id 的进程的主要内容,如果未能解决你的问题,请参考以下文章

非root用户运行容器(K8S SecurityContext)

linux下切换用户命令?

非root用户ssh 执行 sudo远程机器免密钥

runuser 命令详解

使用非root用户时,Docker节点权限被拒绝

非root用户使用1024以下端口