SUID

本文详细介绍了SUID、SGID和Sticky位的概念及其实现方式,并通过实例解释了它们在Linux系统中的具体用途,特别是如何利用这些特性进行权限管理。

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

 转自:

http://www.hudong.com/wiki/SUID

 自我对下面文章的总结:

系统是根据EUID和EGID来判断user是否有运行程序的权限的,而RUID和RGUID则是user自己的本来所属。

1、SUID和SGID

#chmod   u+s  filename
#chmod   g+s  filename

filename代表一个可执行程序的名称;上面两行命令分别设置了用户ID权限位和组ID权限位。设置后文件权限的可执行标识x将被s代替。程序在运行时将具有该用户或该组的权限。

被设置了SUID和SGID权限位的程序的文件属性例如:
-rwsrwsr-x   1   guest   guest   26   Sep   28   14:00   execute-word

2、Sticky位

#chmod   +t   dirctory_name

Linux系统的/tmp目录是已经被设置了Sticky位的例子。因为该目录是多个用户共享的目录,每个用户都对其有写权限。为保证每个用户只能对自己的文件有修改、删除权限,所以设置了Sticky位。

例如:
drwxrwxrwt   2   root   root   4096   Sep 28   14:00   shells

注:在设置SUID和SGID,以及Sticky位前,要求被设置的文件或目录是可执行的。不然在设置以后,相应的位置上将会出现T或S。

针对sticky位补入以下说法:

{

sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件.

采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下,
abc
a - setuid位, 如果该位为1, 则表示设置setuid
b - setgid位, 如果该位为1, 则表示设置setgid
c - sticky位, 如果该位为1, 则表示设置sticky

设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如
rwsrw-r-- 表示有setuid标志
rwxrwsrw- 表示有setgid标志
rwxrw-rwt 表示有sticky标志
那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)

要删除一个文件,你不一定要有这个文件的写权限,但你一定要有这个文件的上级目录的写权限。也就是说,你即使没有一个文件的写权限,但你有这个文件的上级目录的写权限,你也可以把这个文件给删除,而如果没有一个目录的写权限,也就不能在这个目录下创建文件。
如何才能使一个目录既可以让任何用户写入文件,又不让用户删除这个目录下他人的文件,sticky就是能起到这个作用。stciky一般只用在目录上,用在文件上起不到什么作用。
在一个目录上设了sticky位后,(如/tmp,权限为1777)所有的用户都可以在这个目录下创建文件,但只能删除自己创建的文件,这就对所有用户能写的目录下的用户文件启到了保护的作用。(我当时/tmp没有设sticky位,而在文件上设了,这也就是为什么我为什么设了sticky位,还能删除自己创建的文件的原因了)

 }

=================================================================================================================

SUID --> Set User ID

SGID --> Set Group ID

SUID的作用就是:让本来没有相应权限的用户运行这个程序时,可以访问没有权限访问的资源。

SUID - UNIX下关于文件权限的表示方法和解析

SUID

UNIX下可以用ls -l 命令来看到文件权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。

下面解析一下格式所表示的意思,这种表示方法一共有十位:
9 8 7 6 5 4 3 2 1 0
- r w x r - x r - x

第9位表示文件类型,可以为p、d、l、s、c、b和-:
p表示命名管道文件
d表示
目录文件
l表示
符号连接文件
-表示
普通文件
s表示
socket文件
c表示
字符设备文件
b表示
块设备文件

第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:
r表示可读,可以读出文件的内容
w表示可写,可以修改文件的内容
x表示可执行,可运行这个程序
没有权限的位置用-表示

例子:
rwxr-x---   1 foo   staff  7734 Apr 05 17:07 myfile

表示文件myfile是普通文件,文件的所有者是foo用户,而foo用户属于staff组,文件只有1个硬连接,长度是7734个字节,最后修改时间4月5日17:07。

所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他的用户对这个文件没有权限。

如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户权限的可执行位上。例如
1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置
2、-rwSr--r-- 表示SUID被设置,但所有者权限中可执行位没有被设置
3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置
4、-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被设置

其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是1,表示有相应的权限:
11 10 9 8 7 6 5 4 3 2 1 0
S  G T r w x r w x r w x

第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。 
-rwsr-xr-x的值为: 1  0 0 1 1 1 1 0 1 1 0 1
-rw-r-Sr--的值为: 0  1 0 1 1 0 1 0 0 1 0 0

给文件加SUID和SUID的命令如下:
chmod u+s filename   设置SUID位
chmod u-s filename   去掉SUID设置
chmod g+s filename   设置SGID位
chmod g-s filename   去掉SGID设置

另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也很简单。

SUID - 详细解析

SUID

由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。

普通文件的SUID和SGID的作用

例子:如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命令显示如下:
-rwxr-xr-x   1 foo   staff  7734 Apr 05 17:07 myfile

任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括user idgroup id。用户可以用id命令来查到自己的或其他用户的user id和group id。除了一般的user id 和group id外,还有两个称之为effective id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源的访问权限。

一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。

如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问没有权限访问的资源。passwd就是一个很鲜明的例子。SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

讨论一个例子:

UNIX系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为:cr--r-----   1 root     system     2,  1 May 25 1998  kmem
但ps等程序要读这个文件,而ps的权限设置如下:
-r-xr-sr-x   1 bin      system     59346 Apr 05 1998  ps

这是一个设置了SGID的程序,而ps的用户是bin,不是root,所以不能设置SUID来访问kmem,bin和root都属于system组,而且ps设置了SGID,一般用户执行ps,就会获得system组用户的权限,而文件kmem的同组用户的权限是可读,所以一般用户执行ps就没问题了。但有些人说,为什么不把ps程序设置为root用户的程序,然后设置SUID位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序,如果可能的话。

SUID对目录没有影响。如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。

SUID - 关于SUID和SGID的编程

和SUID和SGID编程比较密切相关的有以下的头文件函数

#include 
#include 

uid_t getuid(void);

uid_t geteuid(void);

gid_t getgid (void);

gid_t getegid (void);

int setuid (uid_t UID);

int setruid (uid_t RUID);

int seteuid (uid_t EUID);

int setreuid (uid_t RUID,uid_t EUID);

int setgid (gid_t GID);

int setrgid (gid_t RGID);

int setegid (git_t EGID);

int setregid (gid_t RGID, gid_t EGID);

<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]: 文件覆盖提权技术
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值