Contents

Linux SetUID程序及其用户ID

1. 概述

Linux 等现代操作系统提供了控制对其资源访问的措施。一种这样的方法是可以更改进程的用户。因此,特权级别的变化随之而来。

在本教程中,我们将了解 setuid 特殊文件权限和支持它的三种用户 ID。

2. Setuid 程序

默认情况下,进程的用户是运行它的用户。**因此,该进程与用户一样享有特权。**但是,Linux 提供了 setuid 位功能,**它允许将进程所有权更改为文件所有者。**当文件属于root时它特别有用。

让我们将此功能应用于可执行文件test_id

$ ls -all test_id
-rwxrwxr-x. 1 joe joe 23984 Apr 11 12:01 test_id

首先,让我们使用chown 将文件的所有者更改为root

$ sudo chown root test_id
$ ls -all test_id
-rwxrwxr-x. 1 root joe 23984 Apr 11 12:01 test_id

然后我们应该使用*chmod u+s来设置s* 位:

$ sudo chmod u+s test_id
$ ls -all test_id
-rwsrwxr-x. 1 root joe 23984 Apr 11 12:01 test_id

使用*ls -all,让我们检查s位是否出现在所有者的常规x*可执行位 的位置。也许最著名的 setuid 程序是sudopasswd

3. 三种Linux用户ID

操作系统使用三种用户 ID 管理进程的所有权:

  • RUID——真实用户ID标识运行程序的用户
  • EUID——有效 ID 告诉内核进程的权限
  • SUID – 进程更改其 UID 时使用的已保存用户 ID

让我们解释一下,当带有“x”位的可执行文件启动时,EUID 被设置为真实的。相反,具有特殊“s”位的可执行文件的初始 EUID 等于文件的所有者 ID。

当特权进程放弃其执行某些普通用户工作的特权时,SUID 开始发挥作用。随后,该进程可能会要求内核恢复其由 SUID 定义的初始特权级别。

4. 如何查看进程的用户ID

我们将使用ps 命令显示进程的真实有效用户。假设我们运行我们的 setuid test_id程序:

$ ps -C test_id -o pid,tty,ruser,user,cmd
    PID TT       RUSER    USER     CMD
   3250 pts/1    joe      root     ./test_id

请注意,列为RUSER 的真实用户与USER列中显示的有效用户不同。

现在让我们使用grep 查询proc 伪文件系统以获取有关进程 UID 的信息。

$ grep "^Uid" /proc/3250/status
Uid:	1000	0	0	0

详细来说,IDs的含义从左到右依次为:真实、有效、保存、文件系统UID。

5. Bash 脚本安全限制

现代 Linux 发行版不允许在 Bash 脚本上设置 setuid 位。我们应该知道,脚本容易受到多种方式的攻击。

由于脚本可能会隐式访问系统环境变量,因此修改PATHIFS 可能会导致运行恶意代码。

此外,攻击者可能会利用调用 Bash 解释器和执行脚本之间的时间间隔来替换其内容。