Linux权限体系:UGO模型、特殊权限(SUID/SGID)与提权后门

Linux权限体系:UGO模型、特殊权限(SUID/SGID)与提权后门

如果说 Windows 的权限模型是一座戒备森严、充斥着各种访问控制列表(DACL)和安全描述符的迷宫,那么传统的 Linux 权限模型(UGO)则更像是一座由三个简单数字(如 755)控制的城堡。

然而,极简并不代表安全。在 Linux 中,“一切皆文件”。这种万物归一的设计哲学,使得文件权限的微小配置失误,往往会直接导致系统最高权限(Root)的彻底沦陷。本文将结合终端命令,解剖 Linux 的 UGO 权限基础,并深入探讨红队最钟爱的提权跳板——SUID 特殊权限


1. 基础权限基石:UGO 模型

Linux 使用 UGO (User, Group, Others) 模型来管理文件的访问权限。

💻 日常接触:拆解 ls -l 的输出 当我们在终端输入 ls -l 时,最左侧的 10 个字符就是 Linux 安全的基石:

$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1234 Jan 01 10:00 /etc/shadow

这 10 个字符可以拆解为四部分:

  1. 第一位 (-):文件类型。- 代表普通文件,d 代表目录,l 代表软链接,c/b 代表设备文件。
  2. U (User,文件所有者):接下来的三位 rw-。代表文件拥有者 root 具备读取(r)和写入(w)权限,但不能执行(x)。
  3. G (Group,所属组):中间的三位 r--。代表属于 shadow 组的用户只具备读取(r)权限。
  4. O (Others,其他人):最后的三位 ---。代表除了所有者和组成员之外的其他任何用户,没有任何权限。

安全关联/etc/shadow 文件存储着全系统用户的密码 Hash(如 SHA-512)。如果运维人员手误执行了 chmod o+r /etc/shadow(将 Others 权限赋予读取),那么任何一个通过 Web 漏洞拿到低权限 Shell 的黑客,都可以直接下载该文件进行离线暴力破解,从而获取 root 密码。


2. 突破边界的魔法:特殊权限机制

如果 UGO 限制得如此死板,那普通用户如何修改自己的密码? 普通用户运行 passwd 命令时,必须要将新密码写入 /etc/shadow 文件,但根据前面的分析,普通用户对 /etc/shadow 是绝对没有写入权限的!

为了解决这个“死锁”,Linux 引入了极其强大的特殊权限机制

2.1 SUID (Set User ID):权限跃迁

底层逻辑:当一个可执行文件被设置了 SUID 标志后,任何用户在运行该文件时,进程的有效用户 ID (eUID) 都会瞬间提升为该文件所有者 (通常是 root) 的 ID!

💻 日常接触:查看 passwd 命令的特殊权限 注意 passwd 所有者权限中的那个神秘的 s

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Jan 01 10:00 /usr/bin/passwd

这里的 s 替换了原本的 x。当普通用户 alice 执行 passwd 时,内核会发现该文件有 SUID 标志且所有者是 root,于是内核将这个正在运行的 passwd 进程的权限提升为 root。这样,该进程就能合法地写入 /etc/shadow 了。命令执行完毕,进程销毁,权限回落。

2.2 SGID (Set Group ID) 与 Sticky Bit (粘滞位)

  • SGID (s 出现在 Group 权限位):类似于 SUID,运行时继承文件所属组的权限。如果作用在目录上,则任何人在该目录下创建的新文件,都会强制继承该目录的所属组(常用于部门共享文件夹)。
  • Sticky Bit (t 出现在 Others 权限位,如 /tmp 目录)
    $ ls -ld /tmp
    drwxrwxrwt 17 root root 4096 Jan 01 10:00 /tmp
    /tmp 目录的权限是 777(所有人可读可写可执行),如果没有限制,黑客可以随意删除系统或其他用户放在里面的临时文件。粘滞位 t 的作用是:在 /tmp 中,只有文件的拥有者和 root 才能删除该文件,其他人只能读写自己创建的文件。

3. 渗透实战:SUID 提权与权限维持 (Backdoor)

SUID 机制虽然精巧,但如果管理员为了图方便,给一些本身就具备命令执行、文件读取能力的基础工具赋予了 SUID 权限,这就等于给黑客敞开了一扇通往 Root 的大门。

3.1 寻找目标:全盘扫描 SUID 文件

在获取了低权限 Shell 后,攻击者的第一步通常是执行以下命令,在整个文件系统中搜寻带有 SUID 且属于 root 的文件:

# 查找所有者是root,且具有SUID权限(-perm -4000)的文件
$ find / -user root -perm -4000 -type f 2>/dev/null

3.2 经典提权案例:以 find 命令为例

假设管理员为了让普通用户能全局搜索文件,脑子一热执行了 chmod u+s /usr/bin/find

攻击者发现 find 具有 SUID 后,如何提权? find 命令有一个极其危险的参数 -exec,它允许对找到的文件执行指定的系统命令。 由于 find 运行时是 root 权限,那么由 -exec 派生出的子进程,自然也是 root 权限!

💻 实战命令:利用 SUID find 提权

# 随便找个文件触发find,然后利用 -exec 启动一个 bash
$ find /etc/passwd -exec /bin/sh -p \;
# 此时终端提示符通常会从 $ 变成 #
# whoami
root

注意:现代 Bash 有一种防御机制,如果发现 eUID (有效ID) 和 rUID (真实ID) 不一致,会自动丢弃 eUID。因此提权时通常需要加上 -p 参数(保持特权模式)。

其他经常被错误配置 SUID 从而沦为提权跳板的经典命令包括:vim(可在内部执行 :!/bin/sh)、nmapawkbash 等。

3.3 权限维持 (Root Backdoor)

如果黑客通过某个 Web 0day 漏洞拿到了 Root 权限,他需要留下一个后门,以便明天即便漏洞被修了,依然能重返系统。 最简单的 Linux 隐藏后门,就是拷贝一个 bash,赋予 SUID 隐藏起来:

# 黑客在 root 下的操作:
$ cp /bin/bash /tmp/.hidden_bash
$ chmod 4755 /tmp/.hidden_bash   # 4 代表 SUID 标志

第二天,黑客通过一个低权限的普通用户登录系统,只需执行 /tmp/.hidden_bash -p,瞬间重获 Root 权限!


4. 总结与防御

UGO 权限模型是 Linux 安全的基础,而 SUID/SGID 机制则是为了在严格的隔离中开辟一条业务通道。然而,滥用 SUID 无异于在堡垒中埋下地雷。

防御视角

  1. 定期审计:运维人员应定期执行扫描命令,比对系统中 SUID 文件的哈希,确保没有被植入后门或错误配置。
  2. 挂载防御:对于无需执行程序的数据盘或临时目录(如挂载 /tmp/var/www/uploads),在 /etc/fstab 中使用 nosuidnoexec 参数进行挂载。这样即使黑客在里面放了 SUID 后门文件,内核也会直接拒绝提升权限。

下一篇预告: SUID 提权虽然经典,但在现代 Linux 容器(Docker/Kubernetes)中,Root 权限被进一步细化了。哪怕你在容器里是 Root,也可能什么破坏都做不了! 下一篇,我们将探讨现代 Linux 认证与权限的进阶框架:PAM 认证模块Capabilities 进程提权机制