Administrator
Published on 2025-09-29 / 22 Visits
0
0

【Linux 权限科普】什么是 setuid?一招让普通用户也能执行“root 命令”


在 Linux/Unix 系统里,最常见的权限管理机制就是 rwx(三个权限位):读 (read)、写 (write)、执行 (execute)。
但是,光靠这三种权限,很多情况下无法满足安全和功能的平衡需求。

举个例子:

  • 普通用户不能执行 passwd 修改自己的密码,因为修改密码需要写系统文件 /etc/shadow,而这个文件只有 root 能改。

  • 那么,Linux 是怎么允许普通用户安全修改自己密码的?
    答案就是 setuid


一、setuid 的定义

setuid(Set User ID) 是 Linux 文件权限的一种特殊标志。
它的作用是:
当一个可执行文件带有 setuid 标志时,执行它的进程会临时拥有该文件所有者的权限,而不是当前用户的权限。

换句话说:

  • 普通用户执行带有 setuid 的程序时,会“借用”文件所有者的身份来运行。

  • 这样,就能完成原本只有高级用户才能做的操作。


二、怎么看 setuid 权限

在 Linux 里,使用 ls -l 查看文件权限时,如果某个文件有 setuid 标志,会显示一个 s

示例:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 Sep 29  /usr/bin/passwd

解读:

  • 普通用户都能执行 /usr/bin/passwd,因为有 x

  • 额外的 s 出现在 用户权限位 上,说明这是一个带 setuid 的程序。

  • 所以,即使普通用户执行,它也会以 root 身份修改 /etc/shadow,从而完成改密码操作。


三、如何给文件加 setuid

命令格式:

chmod u+s 文件名

举例:

sudo chmod u+s /usr/local/bin/myscript

查看效果:

ls -l /usr/local/bin/myscript
-rwsr-xr-x 1 root root 12345 Sep 29  /usr/local/bin/myscript

四、setuid 的常见应用

  1. passwd:允许普通用户安全修改密码。

  2. ping:发送 ICMP 报文需要 root 权限,但普通用户也能 ping。

  3. 自定义脚本:如前文提到的“只有指定用户能 reboot 服务器”的安全脚本,可以借助 setuid 提权执行。


五、setuid 的风险

setuid 用好了是好帮手,用不好就是安全漏洞大坑!

  • 被利用提权:如果 setuid 程序里存在 bug,攻击者就可能利用它获得 root 权限。

  • 不当使用:给随便的脚本加 setuid,可能让普通用户干掉系统。

  • root 绕过:一些安全检查写得不严谨时,攻击者可能直接变身 root。

因此,最佳实践

  1. 只给必要的二进制文件添加 setuid。

  2. 自定义脚本必须写死逻辑(白名单用户、日志记录、防止命令注入)。

  3. 配合 auditd 或堡垒机监控所有 setuid 程序调用。


六、总结

  • setuid 的本质:让程序临时以文件所有者权限运行。

  • 典型用途:普通用户改密码、执行 ping、特殊的受控脚本。

  • 风险与控制:必须谨慎使用,避免被小白和黑客利用。

记住一句话:
setuid 就像一把“权限钥匙”,用好了能解锁功能,用不好可能直接把服务器大门敞开!



Comment