Linux 如何知道它必须仅将 euid 0(root 的 uid)提供给某些进程,如 passwd、setuid 等。
如果一个进程能够获得root权限,那岂不是会导致Linux平台潜在的安全漏洞吗?
例如,如果我编写一个可以获得root用户权限(如passwd)的程序,我可能会损坏重要的系统文件(如/etc/passwd、/etc/groups)。
Linux 如何保持安全?
答案1
该passwd
程序有设定值位设置,您可以使用以下命令查看ls -l
:
-rwsr-xr-x 1 root root 39104 2009-12-06 05:35 /usr/bin/passwd
这是s
(该行的第四个字符)。
所有设置了此权限位的程序都作为该程序的所有者运行。在此示例中,用户是root
(该行的第三个单词)。
这些 setuid 程序需要确保它们不会损坏任何东西,因为系统的每个用户都可以运行它们有效root权限。这就是为什么您只能更改自己的密码。 Linux 和其他类似的操作系统仍然是安全的,因为这些 setuid 程序的作者非常小心。
参见示例苏执行程序来自 Apache Web Server,这是一个流行的 setuid 程序。该源代码中有异常多的注释。
答案2
作为 Roland Illig 答案的补充,完全有可能编写一个程序,当授予 root 权限时,它会以各种方式损坏系统文件和/或危害您的系统。
问题是仅仅写作这并不意味着它会自动以root身份运行——它需要将其所有者设置为root,然后必须设置Roland提到的setuid位——并且只有root有权这样做。
简而言之:是的,每个设置了 setuid 位的二进制文件至少都存在潜在的安全风险。利用启用 setuid 的二进制文件中的缺陷来获取 root 权限是所谓的最常见的来源权限提升攻击发生时往往会造成严重后果。因此,使用 setuid 的软件相对较少,而且现有的软件往往受到严格审查。