特殊权限位是什么
Linux 的权限位里还有三位特殊标记:SUID(4)、SGID(2)与粘滞位(1)。SUID 让程序以文件属主身份运行,passwd 就是典型例子;SGID 用于文件时以文件属组身份运行,用在目录上则让新建文件继承该目录的属组;粘滞位作用在目录上,限制只有文件属主或目录属主才能删除文件,/tmp 就是 1777。三者都改变「以什么身份、能做什么」的语义,而不只是读写权限。
基本信息
| 数字位 | SUID=4、SGID=2、粘滞位=1,与普通权限位相加,如 4755、2755、1777 |
|---|---|
| 查看方式 | ls -l 中属主执行位显示 s 表示 SUID,属组执行位显示 s 表示 SGID,其他人位显示 t 表示粘滞位 |
| 大小写含义 | 小写 s 或 t 表示同时带有执行位,大写 S 或 T 表示没有执行位 |
| 排错入口 | stat -c '%a %n' 直接看八进制值最直观 |
典型使用场景
- 理解系统二进制:passwd、sudo 这类需要临时提权的程序依赖 SUID
- 共享目录协作:目录设 SGID 后组内新建文件自动继承属组,省掉反复改属组
- 公共可写目录:粘滞位防止用户互相删除他人文件,/tmp 与 /var/tmp 都这么用
- 安全盘点:定期找出系统里所有 SUID 文件,核对是否有异常新增
- 挂载加固:数据盘或用户目录挂载时加 nosuid、nodev,削弱特殊位带来的风险
识别与设置
识别与设置
ls -l /usr/bin/passwd # -rwsr-xr-x 表示 SUID
ls -ld /tmp /var/tmp # drwxrwxrwt 表示粘滞位
ls -ld /data/share # drwxrws--- 表示目录级 SGID
stat -c '%a %n' /usr/bin/passwd /tmp /data/share
chmod g+s /data/share # 给目录加 SGID,新建文件继承属组
chmod +t /data/public # 加粘滞位
chmod 0755 /opt/app/tool # 清掉全部特殊位盘点与挂载加固
盘点与挂载加固
find / -xdev -perm -4000 -type f -ls 2>/dev/null # 全盘 SUID 文件清单
find /data -xdev -perm -2000 -type d -ls 2>/dev/null # 带 SGID 的目录
cp -a src dst # cp -a 会保留特殊位,慎用
# /etc/fstab 中给数据盘与用户目录加保护
# /dev/vg0/data /data ext4 defaults,nosuid,nodev 0 2
mount | grep -E 'nosuid|noexec'权限位显示与含义
| 显示形态 | 数值 | 含义 |
|---|---|---|
| -rwsr-xr-x | 4755 | SUID 且属主有执行位 |
| -rwSr--r-- | 4644 | 有 SUID 但属主无执行位,SUID 实际不生效 |
| -rwxr-sr-x | 2755 | SGID 且属组有执行位 |
| drwxrws--- | 2770 | 目录级 SGID,新建文件继承属组 |
| drwxrwxrwt | 1777 | 目录粘滞位,只有属主可删自己的文件 |
| drwxrwxrwT | 1776 | 有粘滞位但其他人无执行位,通常无法进入该目录 |
脚本文件设置 SUID 在多数现代内核上不生效(内核对解释型脚本的提权做了限制)。需要提权能力时应使用编译型程序或通过进程能力与 sudo 规则实现。
SUID 程序是提权攻击的首选目标:它天然以更高权限运行,一旦程序本身存在缺陷,影响面会被放大。定期盘点 SUID 清单、及时清理不再需要的条目,是最基本的防线。