setuid和setgid是作用于执行上下文的身份继承开关:setuid(位11,值4000)使可执行文件以属主uid运行,如passwd;setgid(位10,值2000)对文件以属组gid运行,对目录则使新文件继承其gid。

setuid 和 setgid 不是普通权限,而是作用于执行上下文的“身份继承开关”,它们各自对应一个独立的二进制位,直接参与进程启动时的 UID/GID 切换逻辑。
setuid 二进制位:控制有效用户 ID 的临时切换
setuid 对应第 12 位(从 0 开始计数,即 bit 11),数值为 4000(八进制)或 211 = 2048(十进制)。它只对具有执行权限(x)的二进制可执行文件生效。
- 当该位被置位(如 chmod 4755),且文件属主有 x 权限时,ls -l 显示为小写 s(例如 -rwsr-xr-x)
- 若属主无 x 权限但 setuid 位已设,显示为大写 S(例如 -rwSr--r--),表示设置无效
- 执行时,内核将进程的 EUID(有效用户 ID)设为文件属主 UID,RUID(真实 UID)保持不变
- 典型例子:/usr/bin/passwd 属主 root,普通用户执行时以 root 身份写入 /etc/shadow
setgid 二进制位:双重语义,取决于目标类型
setgid 对应第 11 位(bit 10),数值为 2000(八进制)或 210 = 1024(十进制)。它的行为分两类:
- 对可执行文件:作用类似 setuid,但影响的是 EGID(有效组 ID),进程以文件属组身份运行(如 /usr/bin/wall)
- 对目录:功能完全不同——新创建的文件和子目录自动继承该目录的 GID,且子目录也继承 setgid 位(保证协作目录中组一致性)
- 目录上 setgid 位设后,ls -ld 显示为 drwxr-sr-x;若属组无 x,则显示 drwxr-Sr-x
设置与验证:数字法与符号法本质一致
chmod 的数字模式(如 4755、2755、2775)本质就是按位或操作:把基本权限(0755)与特殊位(4000 或 2000)相加。符号法(u+s / g+s)底层同样修改对应比特位。
- chmod 4755 prog → 设置 setuid,等价于 chmod u+s prog
- chmod 2775 shared/ → 设置目录 setgid,等价于 chmod g+s shared/
- 用 ls -l 或 stat 查看时,注意小写 s 表示“已设且生效”,大写 S 表示“已设但因缺少 x 而不生效”
安全关键点:位本身不危险,滥用才风险
setuid/setgid 位只是内核提供的机制,风险来自程序自身是否可信、是否及时降权、是否校验输入。
- 脚本文件(.sh/.py)即使设了 setuid,内核也会忽略——这是硬性限制,非 bug
- no_new_privs 标志可全局禁用 setuid/setgid 效果,常用于容器或沙箱环境
- 生产系统应定期扫描:find /usr/bin -perm -4000 2>/dev/null,审查所有 setuid 二进制











