运行 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 的进程的主要内容,如果未能解决你的问题,请参考以下文章