一篇速成Linux 设置位 S(SetUID)
🔐 Linux 设置位 S(SetUID)详解
一、SetUID(S位)的作用
SetUID 是 Linux 文件权限中的一种特殊权限,目的是让普通用户在执行某些程序时,暂时拥有该程序“所属用户”的权限。
✳️ 经典例子:
系统中用于修改密码的命令 passwd
,其路径通常是 /usr/bin/passwd
。
但 /etc/passwd
和 /etc/shadow
文件仅 root 用户拥有写权限。为了让普通用户可以修改自己的密码,passwd
命令被设置了 SetUID 权限,使其在执行时临时以 root 权限运行,从而实现修改操作。
二、s 权限的设置对象
-
SetUID
:只能应用于可执行的二进制文件 -
s
位加在用户(user)的执行权限上:chmod u+s
三、实际操作示例
✅ 查看 passwd 命令路径:
which passwd
✅ 查看权限(含 S 位):
ll /usr/bin/passwd
正常情况下输出如下:
-rwsr-xr-x 1 root root 54256 Apr 23 08:32 /usr/bin/passwd
注意rws
中的 s
,说明已开启 SetUID,执行时临时使用 root 权限。
四、如何移除 S 权限
🔸 方法一:直接去除 s 位
chmod u-s /usr/bin/passwd
🔸 方法二:重设权限位,去除特殊权限
chmod 0755 /usr/bin/passwd
-
0755
中的前导0
表示 不使用任何特殊权限 -
若要添加 SetUID:
chmod 4755
,其中: -
4
代表 SetUID -
7
代表所有者的读写执行权限 -
5
分别为组和其他用户的读执行权限
五、权限位补充
权限类型 | 数字表示 | 含义 |
---|---|---|
普通权限 | 0 | 无特殊权限(默认) |
SetUID | 4 | 用户(u)的 s 位 |
SetGID | 2 | 组(g)的 s 位 |
Sticky Bit | 1 | 其他用户(o)的粘着位 |
🔍 深度理解 Linux 的 SetUID 权限
一、SetUID 的本质:权限的临时借用机制
当一个程序文件被设置了 SetUID,用户在执行这个程序时,进程会临时获得该文件“属主”的身份执行权限。
📌 举个类比:
-
你是普通用户,像是没门卡的访客;
-
某个设置了 SetUID 的程序是管理员提前放好的一把“限时门卡”;
-
你执行程序 = 用了那张卡,权限升级,能完成只有管理员能做的操作(比如改密码)。
这个过程是临时的,程序执行完权限就消失。
二、SetUID 的底层机制
当你执行一个二进制程序时,系统会进行以下判断:
IF 文件具有 SetUID 且为可执行文件 THEN将执行进程的有效UID(effective UID)切换为该文件的“所有者UID”
ELSE使用当前用户的UID 执行进程
因此:
- passwd
文件所有者是 roo
,具有 SetUID
-
任何用户执行它时,进程权限都会提升为
root
-
可以写
/etc/shadow
文件(否则连读都不能)
三、SetUID 的使用场景
场景 | 说明 |
---|---|
密码修改程序 | passwd 普通用户执行,程序临时拥有 root 权限修改 /etc/shadow |
网络工具如 ping (早期) | 需要打开 socket,需要 root 权限 |
用户切换 su / sudo | 程序本身不是 root,但执行后临时以 root 运行 |
四、安全风险与管理建议
SetUID 是把“双刃剑”,用得好是便利,用不好是系统漏洞。
🚨 潜在风险:
程序存在漏洞时(如缓冲区溢出、任意文件写入等),攻击者可能通过 SetUID 程序提权为 root,拿下整台机器。
若不慎给 脚本文件 设置 S 位(虽然不会生效),仍有可能被误导滥用。
✅ 安全建议:
1、只对系统可信任的二进制程序设置 S 位
2、定期扫描系统中具有 SetUID 的文件:
find / -perm -4000 -type f 2>/dev/null
3、避免对可疑程序设 S 位,如自写脚本、测试程序
4、使用 sudo 替代部分 SetUID 场景(更安全,可审计)
五、延伸补充:SetUID vs SetGID vs Sticky Bit
特殊权限 | 数字 | 用途说明 |
---|---|---|
SetUID(u+s ) | 4 | 进程以文件“所有者”身份运行 |
SetGID(g+s ) | 2 | 进程以文件“所属组”身份运行;或新建文件自动归组 |
Sticky Bit(+t ) | 1 | 应用于目录,只有文件所有者能删除该目录下自己的文件(典型如 /tmp ) |
六、一个实际对比案例
原始文件权限:
-rwxr-xr-x 1 root root 54256 Apr 23 08:32 /usr/bin/passwd
任何人可执行,但只有 root 能修改 /etc/shadow
,普通用户运行会失败。
开启 SetUID:
chmod u+s /usr/bin/passwd
权限变为:
-rwsr-xr-x 1 root root 54256 Apr 23 08:32 /usr/bin/passwd
此时任何用户执行 passwd
都临时获得 root 权限,能安全修改自己密码。
✅ 总结一句话:
SetUID 是让“普通用户临时拥有管理员权限”的关键机制,强大但危险,务必在可控范围内使用。