用 setuid() 设置实际用户 UID 和有效用户 UID。
用 setgid() 设置实际组 ID 和有效组 ID。
两个函数声明如下:
运行输出:
引用# ./setuid.exe 1001
real uid: 0
effective uid: 0
real uid: 1001
effective uid: 1001
由此可见,在 root 下,实际用户 ID 和有效用户 ID 均被设为 setuid() 的参数 uid 的值。
2. 若进程不具有 root 权限,那么普通用户使用 setuid() 时参数 uid 只能是自己的,没有权限设置别的数值,否则返回失败:
引用$ ./setuid.exe 1001
real uid: 1000
effective uid: 1000
setuid error: Operation not permitted
real uid: 1000
effective uid: 1000
由以上可以看出,只有超级用户进程才能更改实际用户 ID 。所以一个非特权用户进程不能通过 setuid 或 seteuid 得到特权用户权限。但是 su 命令却能使一个普通用户变成特权用户。这并不矛盾,因为 su 是一个 "set_uid" 程序。执行一个设置了 "set_uid" 位的程序时,内核将进程的有效用户 ID 设置为文件属主的 ID(root 的 ID)。而内核检查一个进程是否具有访问某权限时,是使用进程的有效用户 ID 来进行检查的。su 程序的文件属主是 root,普通用户运行 su 命令时,su 进程的权限是 root 权限。
Warning:对于调用了 setuid() 函数的程序要格外小心,当进程的有效用户 ID 即 euid 是 root 用户时,如果调用 setuid() 使 euid 为其他非 root 用户,则该进程从此就不具有超级用户权限了。看下面代码:
我们使用 root 编译上面的程序,并运行 chmod u+s 给程序添加 suid 位,然后以普通用户来运行它。
在上面程序中,在运行 setuid (1000) 函数时,我们还是具有 root 权限的,所以该函数会设置成功。正是因为有了 root 权限,所以 3 个 ID (真实用户ID,已保存用户ID,有效用户ID)都会被设置为 1000。所以此后程序已经被降权为普通用户,想再 seteuid (0) 已经不可能。
可以这样使用 stuid() 函数:
开始时,某个程序需要 root 权限玩成一些工作,但后续的工作不需要 root 权限。可以将该可执行程序文件设置 set_uid 位,并使得该文件的属主为 root。这样,普通用户执行这个程序时,进程就具有了 root 权限,当不再需要 root 权限时,调用 setuid( getuid() ) 恢复进程的实际用户 ID 和有效用户 ID 为执行该程序的普通用户的 ID 。对于一些提供网络服务的程序,这样做是非常有必要的,否则就可能被攻击者利用,使攻击者控制整个系统。
对于设置了 set_uid 位的可执行程序也要注意,尤其是对那些属主是 root 的更要注意。因为 Linux 系统中 root 用户拥有最高权力。黑客们往往喜欢寻找设置了 set_uid 位的可执行程序的漏洞。这样的程序如果存在缓冲区溢出漏洞,并且该程序是一个网络程序,那么黑客就可以从远程的地方轻松地利用该漏洞获得运行该漏洞程序的主机的 root 权限。即使这样的成不是网络程序,那么也可以使本机上的恶意普通用户提升为 root 权限。
相关推荐
CAP_SETUID和CAP_SETGID是两种能力,分别允许进程改变其UID和GID,即使它不是root。 3. **sudo 和 su**:这两个命令常用于在系统中切换用户身份。理解它们如何安全地更改进程凭证对于系统管理员至关重要。 4. **...
- `setuid()` 函数可以重新设置当前进程的用户识别码 (UID)。 - 通常只有当进程的有效用户识别码为 0 (即 root 用户) 时,该函数才能生效。 - 在 Linux 系统中,当 root 用户通过 `setuid()` 变换为其他用户的 ...
文件权限的理解和设置是用户和组管理中的一个重要方面。文件权限定义了用户或组对文件或目录的访问权限,包括读(r)、写(w)和执行(x)。文件权限可以通过chmod命令修改,文件的所有者(owner)、所属组(group)...
通过理解用户和组的分类,以及如何管理和设置权限,我们可以确保系统的安全性和高效运行。以下是对这些知识点的详细阐述: 首先,Linux中的用户分为三类:超级用户、系统用户和服务用户。超级用户,也称为root用户...
- setuid、setgid位:设置这些权限后,文件执行时会使用文件所有者的权限(setuid)或文件所属组的权限(setgid)。 7. **用户与组的实际应用**: - 文件权限管理:通过合理分配用户和组,可以实现用户间的资源...
1. **进程管理**:PHP-FPM能创建和管理PHP工作进程,支持进程的守护进程化,包括PID文件、日志文件、setsid、setuid、setgid和chroot等功能。它还允许优雅地停止和启动工作进程,确保在升级配置或二进制文件时不会...
例如,`chmod u+s filename` 设置 setuid 位,`chmod g+s dirname` 设置 setgid 位。 #### 6. 粘贴位及设置方法 粘贴位(sticky bit)通常用于目录上,它确保只有文件的拥有者才能删除或重命名自己的文件,即使其他...
特殊权限可以在文件或目录上设置,如setuid允许任何用户以文件所有者的权限运行该文件,setgid则使得在目录下创建的新文件继承目录的属组,sticky bit常用于共享目录,确保只有文件所有者能删除自己的文件。...
同时,每个进程也有实际和有效的UID与GID,实际ID通常与有效ID一致,但在运行设置了setuid或setgid位的程序时,有效ID可能会临时变为程序文件的属主的ID,使得进程能够以那个用户的身份执行特定操作。 归属关系和...
- os.setuid(uid)和os.setgid(gid)函数用于设置当前进程的用户ID和组ID。 5. 进程相关操作 - os模块提供了创建新进程和管理进程的函数。os.system(command)用于执行系统命令。os.execv(path, args)用于执行新的程序...
Linux系统通过用户ID(UID)和组ID(GID)来限制对资源的访问,有效用户ID(EUID)和有效组ID(EGID)则在某些情况下(如setuid和setgid程序)用于改变进程的权限级别。通过这些机制,可以确保用户只能访问他们有权...
6. **程序接口**:在编程中,C语言的`getpwuid`和`getgrgid`函数用于获取用户和组信息,`setuid`和`setgid`用于改变进程的权限上下文。 7. **sudo和su**:`sudo`允许普通用户以管理员身份执行命令,而`su`则允许...
特殊的权限位包括SetUID(suid)和SetGID(sgid)。对于可执行文件,suid允许程序以文件所有者的权限运行,而不是执行者的权限。sgid则使得程序运行时具有文件所属组的权限。对于目录,设置sgid意味着在该目录下创建...
可能还会涉及umask命令和文件的特殊权限,如setuid、setgid和sticky位。 5. "linux-1 shell基本命令.ppt":这是关于Linux命令行界面和shell的基础教程,可能会涵盖ls、cd、mkdir、rm、cp、mv、cat、more、less等...
- `-u filename`:如果文件设置了setuid位,返回真。 - `-w filename`:如果当前用户有写文件权限,返回真。 - `-x filename`:如果当前用户有执行文件权限,返回真。 - `-z string`:如果指定的字符串长度为0,返回...
5. **`setuid`和`setgid`位**:当一个程序被设置为`setuid`或`setgid`时,它将运行时继承文件的所有者权限,即使实际执行它的用户没有这些权限。这可能用于创建允许普通用户执行特定特权操作的程序,比如隐藏进程。 ...
此外,还有隐藏的setuid、setgid和sticky位,它们可以提供额外的安全控制。setuid允许文件执行时临时获取文件所有者的权限,setgid则使进程继承文件所属组的权限,而sticky位通常用于目录,确保只有文件所有者或管理...
文件访问控制位SetUID和SetGID则用于改变文件执行时的有效用户或组ID,以提供特殊权限,例如允许普通用户执行需要根权限的程序。 学习Linux操作系统用户管理是理解和操作Linux系统的基础,对于系统维护和日常使用至...