suid

本文详细解释了SUID(Set-User-ID)位的概念及其在Linux系统中的应用。通过具体实例介绍了SUID如何允许普通用户临时获得文件所有者的权限,从而解决如修改受保护文件等问题,并讨论了其可能带来的安全风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SUID
 
 
Why we need suid,how do we use suid?

         r    --     读访问 
    w   --    写访问 
    x    --    执行许可 
     s    --   SUID/SGID 
     t     --   sticky位  
                        
 那么 suid/sgid是做什么的? 为什么会有suid位呢?
 要想明白这个,先让我们看个问题:如果让每个用户更改自己的密码?
 用户修改密码,是通过运行命令passwd来实现的。最终必须要修改/etc/passwd文件,
 而passwd的文件的属性是:
  #ls -l /etc/passwd
 -rw-r--r--    1 root     root         2520 Jul 12 18:25 passwd
 
我们可以看到passwd文件只有对于root用户是可写的,而对于所有的他用户来说都是没有写权限的。 那么一个普通的用户如何能够通过运行passwd命令修改这个passwd文件呢? 
为了解决这个问题,SUID/SGID便应运而生。而且AT&T对它申请了专利。 呵呵。

SUID和SGID是如何解决这个问题呢?
 首先,我们要知道一点:进程在运行的时候,有一些属性,其中包括 实际用户ID,实际组ID,有效用户ID,有效组ID等。 实际用户ID和实际组ID标识我们是谁,谁在运行这个程序,一般这2个字段在登陆时决定,在一个登陆会话期间, 这些值基本上不改变。

而有效用户ID和有效组ID则决定了进程在运行时的权限。内核在决定进程是否有文件存取权限时, 是采用了进程的有效用户ID来进行判断的。
 
 知道了这点,我们来看看SUID的解决途径:
 当一个程序设置了为SUID位时,内核就知道了运行这个程序的时候,应该认为是文件的所有者在运行这个程序。即该程序运行的时候,有效用户ID是该程序的所有者。举个例子: 
 [root@sgrid5 bin]# ls -l passwd
 -r-s--s--x    1 root     root        16336 Feb 14  2003 passwd

虽然你以test登陆系统,但是当你输入passwd命令来更改密码的时候,由于passwd设置了SUID位,因此虽然进程的实际用户ID是test对应的ID,但是进程的有效用户ID则是passwd文件的所有者root的ID,因此可以修改/etc/passwd文件。
  
让我们看另外一个例子。 

ping命令应用广泛,可以测试网络是否连接正常。ping在运行中是采用了ICMP协议,需要发送ICMP报文。但是只有root用户才能建立ICMP报文,如何解决这个问题呢?同样,也是通过SUID位来解决。
  [root@sgrid5 bin]# ls -l /bin/ping
  -rwsr-sr-x    1 root     root        28628 Jan 25  2003 /bin/ping 
我们可以测试一下,如果去掉ping的SUID位,再用普通用户去运行命令,看会怎么样。

 [root@sgrid5 bin]#chmod u-s /bin/ping
 [root@sgrid5 bin]# ls -l ping
 -rwxr-xr-x    1 root     root        28628 Jan 25  2003 ping
 [root@sgrid5 bin]#su test
 [test@sgrid5 bin]$ ping byhh.net
 ping: icmp open socket: Operation not permitted


 SUID虽然很好了解决了一些问题,但是同时也会带来一些安全隐患。
 因为设置了 SUID 位的程序如果被攻击(通过缓冲区溢出等方面),那么hacker就可以拿到root权限。
 因此在安全方面特别要注意那些设置了SUID的程序。
 
 通过以下的命令可以找到系统上所有的设置了suid的文件:


 [root@sgrid5 /]# find  / -perm -04000 -type f -ls

 对于这里为什么是4000,大家可以看一下前面的st_mode的各bit的意义就明白了。


 在这些设置了suid的程序里,如果用不上的,就最好取消该程序的suid位。

<think>我们正在讨论Linux中的SUID权限位及其在提权中的应用。根据引用,SUID(Set UserID)是一种特殊权限,当它设置在一个可执行文件上时,该文件在执行时会以文件所有者的权限运行,而不是执行者的权限。这为提权提供了可能,因为普通用户执行该文件时可能获得root权限(如果文件所有者是root)。关键点:1. SUID权限的表示:在文件权限中,所有者的执行权限位如果是's'(小写)则表示有SUID权限且文件可执行;如果是'S'(大写)则表示有SUID权限但文件不可执行(这通常没有实际意义)。2. SUID权限的设置:可以通过`chmodu+s文件名`来设置,也可以通过数字形式设置,如`chmod4755文件名`(其中4表示SUID位)。3.SUID提权原理:如果某个属于root且设置了SUID的可执行文件存在漏洞(或者被精心构造参数执行),那么普通用户执行它就可能获得root权限。常见的可用于提权的SUID程序包括:find、vim、bash、cp、nmap等。这些程序通常不需要SUID权限,因此移除它们的SUID位是安全的加固措施。引用[1]详细介绍了SUID、SGID和SBIT三种特殊权限。引用[2]提到了Linux中的用户分类(root、普通用户、虚拟用户)以及权限提升的概念。引用[3]举例说明了SUID的特性:普通用户执行具有SUID的程序时会以文件所有者的身份运行。引用[4]则给出了一个具体的提权例子:通过复制cp命令并保留权限属性,然后利用它修改bash的权限,从而获得root权限。现在,我们将详细解释SUID提权机制,并提供一些实际例子。回答结构:1. SUID权限的基本概念和设置方法2.SUID提权的原理3.常见的SUID提权方法及示例4.如何查找系统中设置了SUID的文件5.安全加固建议6.相关问题注意:在解释过程中,我们将使用LaTeX格式来表示权限位等数学表达式。</think>### Linux SUID 权限位提权详解 #### 一、SUID 权限基础概念 SUID(Set User ID)是 Linux 文件系统中的特殊权限位,当设置在可执行文件上时,会使程序**以文件所有者的身份运行**,而非执行者的身份[^1]。其数学表示为: $$ \text{权限位} = 4000_{octal} $$ 在权限列表中显示为所有者的执行位变为 `s`: ```bash -rwsr-xr-x 1 root root /usr/bin/passwd ``` 此处 `s` 表示: 1. 文件所有者是 root (UID 0) 2. 任何用户执行时都获得 root 权限 #### 二、提权原理与技术实现 当普通用户执行 SUID-root 程序时: ```mermaid graph TB A[普通用户执行] --> B{SUID 程序} B -->|程序以root身份运行| C[执行特权操作] C -->|存在漏洞| D[获取root shell] ``` **经典提权方法**: 1. **环境变量劫持**: ```bash # 利用find命令的-exec漏洞 $ find / -name test -exec /bin/bash -p \; ``` 因 `find` 有 SUID 权限,`-exec` 会以 root 执行 bash[^4] 2. **共享库注入**: ```bash # 劫持LD_PRELOAD加载恶意库 $ gcc -shared -fPIC -o exploit.so exploit.c $ sudo -u root SUID_PROGRAM # 程序加载exploit.so ``` 3. **文件覆盖攻击**: ```bash # 利用cp命令的SUID覆盖/etc/passwd $ cp ./malicious_passwd /etc/passwd ``` 当 `cp` 有 SUID 时,可覆盖系统文件[^4] #### 三、高风险 SUID 程序示例 | 程序 | 提权方法 | 风险等级 | |-----------|------------------------------|----------| | `find` | `-exec /bin/sh` | ⚠️⚠️⚠️ | | `bash` | `bash -p` | ⚠️⚠️⚠️ | | `vim` | `:!sh` | ⚠️⚠️ | | `cp/mv` | 覆盖敏感文件 | ⚠️⚠️ | | `nmap` | `--interactive` 模式 | ⚠️⚠️ | #### 四、防御与加固措施 1. **权限最小化**: ```bash # 移除非必要SUID sudo chmod u-s /path/to/program ``` 2. **文件系统加固**: ```bash # 使用nosuid挂载选项 mount -o remount,nosuid /home ``` 3. **入侵检测**: ```bash # 监控SUID文件变化 auditctl -w / -p wa -k suid_change ``` #### 五、SUID 与 SGID 区别 | 特性 | SUID | SGID | |------------|------------------------------|------------------------------| | **作用对象** | 可执行文件 | 可执行文件/目录 | | **权限继承** | 继承文件所有者权限 | 继承文件所属组权限 | | **提权方向** | 用户→所有者 | 用户→组 | | **数字表示** | $4000_{octal}$ | $2000_{octal}$ | > 注意:`/usr/bin/passwd` 等核心工具需保留 SUID,但应定期审计[^1]。 --- ### 相关问题 1. 如何区分合法 SUID 程序与恶意后门? 2. 在容器环境中,SUID 提权有哪些特殊风险? 3. 除了 SUID,Linux 还有哪些特殊权限可能被用于提权? 4. 如何利用 Linux 能力(Capabilities)替代 SUID 实现最小权限? 5. SUID 权限与 SELinux 策略如何协同工作? [^1]: Linux 特殊权限原理 [^2]: 用户权限层级划分 [^3]: SUID 执行机制示例 [^4]: 文件覆盖提权技术
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值