我只是想了解setuid机制。所以我编写了一个触发bash的C程序(prog1)(我在执行时使用了system("/bin/sh")
并且我为可执行文件设置了setuid-bit(以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用户的读/写/执行程序永远不会被其他用户读/写/执行? ...那么请你能给我一些有用的信息吗?!
答案 0 :(得分:0)
在linux下,检查文件系统权限时会查询fsuid
。如果未明确设置,则此fsuid
与流程的euid
匹配。
实际上,几乎每个权限都会根据有效用户ID进行检查(这就是为什么它被称为有效)。实际用户ID用于检查是否可以发送信号(因此您可以杀死您启动的suid进程)。许多shell也会执行seteuid(getuid());
之类的操作来增强安全性。