`

setuid 的摘录

 
阅读更多

来源:http://bbs.chinaunix.net/viewthread.php?tid=820766

Maurice J.Bach 的《The Design of The UNIX Operating System》一书中对这个问题的论述。。。



p227

7.6 THE USER ID OF A PROCESS

内核会给每个进程关联两个和进程ID无关的用户ID,一个是真实用户ID,还有一个是有效用户ID或者称为setuid(set user ID)。真实用户ID用于标识由谁为正在运行的进程负责。有效用户ID用于为新创建的文件分配所有权、检查文件访问许可,还用于通过kill系统调用向其它进程发送信号时的许可检查。内核允许一个进程以调用exec一个setuid程序或者显式执行setuid系统调用的方式改变它的有效用户ID。

所谓setuid程序是指一个设置了许可模式字段中的setuid bit的可执行文件。当一个进程exec一个setuid程序的时候,内核会把进程表以及u区中的有效用户ID设置成该文件所有者的ID。为了区分这两个字段,我们把进程表中的那个字段称作保存用户ID。可以通过一个例子来演示这两个字段的区别。

setuid系统调用的语法是 setuid(uid) ,其中,uid是新的用户ID,该系统调用的结果取决于有效用户ID的当前值。如果调用进程的有效用户ID是超级用户,内核会把进程表以及u区中的真实和有效用户ID都设置成uid。如果调用进程的有效用户ID不是超级用户,仅当uid等于真实用户ID或保存用户ID时,内核才会把u区中的有效用户ID设置成uid。否则,该系统调用将返回错误。一般来说,一个进程会在fork系统调用期间从父进程那儿继承它的真实和有效用户ID,这些数值即使经过 exec系统调用也会保持不变。

存储在u区中的有效用户ID是最近一次setuid系统调用或是exec一个setuid程序的结果;只有它会被用于文件访问许可。进程表中的保存用户ID使得一个进程可以通过执行setuid系统调用把有效用户ID设置成它的值,以此来恢复最初的有效用户ID。

setuid程序的例子:login,mkdir。



Uresh Vahalia 的《UNIX Internals:The New Frontiers》一书中对这个问题的论述。。。

p27

2.3.3 User Credentials

UID和GID这样的标识符会影响文件的所有权和访问许可,以及向其它进程发送信号的能力。这些属性统称为凭证。

每个进程都有两对ID ——真实的和有效的。当一个用户登录的时候,login程序会把两对ID设置成密码数据库(/etc/passwd文件,或某些如Sun Microsystems的NIS之类的分布式机制)中指定的UID和GID。当一个进程fork的时候,子进程将从父进程那儿继承它的凭证。

有效UID和有效GID印象文件的创建和访问。在创建文件的时候,内核将文件的所有者属性设置成创建进程的有效UID和有效GID。在访问文件的时候,内核使用进程的有效UID和GID来判断它是否能够访问该文件。真实UID和真实GID标识进程的真实所有者,会影响到发送信号的权限。对于一个没有超级用户权限的进程来说,仅当它的真实或有效UID于另一个进程的真实UID匹配时它才能向那个进程发送信号。

有三个系统调用可以改变凭证。如果一个进程调用exec执行一个安装为suid模式的程序,内核将把进程的有效UID修改成文件的所有者。同样,如果该程序安装为sgid模式,内核则会去修改调用进程的有效GID。UNIX提供这个特性是想赋予用户特殊的权限以完成一些特定的任务。

一个用户还可以通过调用setuid或setgid来改变它的凭证。超级用户可以通过这些系统调用改变真实的和有效的UID以及GID。普通用户则只能通过这些调用来把它们的有效UID或GID改回到真实的数值。

System V和BSD UNIX在处理凭证方面存在着一些差别。SVR3还维护了一个saved UID和saved GID,分别是在调用exec之前的有效UID和GID的数值。setuid和setgid系统调用还可以把有效ID恢复为保存的数值。4.3BSD不支持这一特性,它允许一个用户属于一个辅组(supplemental group)的集合(使用setgroups系统调用)。用户创建的文件将属于它的主组(primary group),而用户则既可以访问属于主组的文件,也可以访问属于辅组的文件。

SVR4整合了上述所有特性。它支持附组,也会在exec的时候维护saved UID和GID。

setuid程序的例子:passwd。




Marshall Kirk McKusick, George V. Neville-Neil 的《The Design and Implementation of the FreeBSD Operating System》一书中对这个问题的论述。。。

3.7 User, Group, and Other Identifiers

每个FreeBSD进程的状态里都有一个UID和一组GID。一个进程的文件系统访问特权就是由它的UID和GIDs来定义的。通常,这些标识符都是新进程创建的时候从父进程那儿自动继承过来的。只有超级用户才能修改一个进程的真实UID或真实GID。这个方案在各种特权之间进行了严格的区分,确保除了超级用户之外的其它任何用户都无法获得特权。

每个文件都有三组许可bit,分别用于所有者、组以及其它用户的读、写或执行许可。这些许可bit将按如下顺序进行检查:
    1、如果文件的UID和进程的UID相同,则仅应用所有者的许可,不再检查组和其它用户的许可。
    2、如果UID不匹配,但文件的GID和进程的众多GID之一匹配,则仅引用组的许可,不再检查所有者和其它用户的许可。
    3、仅当进程UID和GID与文件的UID和GID都不匹配时,才会去检查其它用户的许可。如果这些许可不允许所请求的操作,该操作就会失败。

一个进程的UID和GIDs是从它的父进程那儿继承来的。当一个用户登录的时候,login程序会在执行exec系统调用运行用户的登录shell之前设置好UID和GIDs,因此,后续的所有进程都会继承到恰当的标识符。

我们经常会想赋予一个用户有限的额外特权。......为了解决这个问题,内核允许程序在运行过程中创建被赋予特权的程序。以不同的UID运行的程序被称为setuid程序,以一个额外的组特权运行的程序被称为setgid程序。当运行一个setuid程序的时候,进程的许可将被扩展以包括与程序相关联的 UID的许可。该程序的UID就被称为进程的有效UID,而进程最初的UID则被称为真实UID。同样,执行一个setgid程序会把进程的许可扩展为程序的GID的许可,相应的也有有效GID和真实GID的定义。

系统可以通过setuid和setgid程序来提供对文件或服务的受控访问。当然,这样的程序必须仔细编写,以保证它们只具有一些有限的功能。

UID和GIDs是作为每个进程的状态的一部分来维护的。由于历史原因,GIDs被实现成了一个显著的GID(即有效GID)和一个GIDs的辅助数组,不过在逻辑上则被看作是一组GIDs。在FreeBSD中,那个显著的GID就是GIDs数组中的第一个条目。辅助数组的大小是固定的(FreeBSD中是16),不过可以通过重新编译内核来修改这个数值。

FreeBSD是通过把运行setgid程序的进程的辅组数组中的第0个元素设置成文件的属组来实现setgid功能的。之后就可以像普通进程那样对许可进行检查了。由于存在额外的组,setgid程序就能够比一个运行没有特殊权限的程序的用户进程访问更多的文件。为了避免在运行一个setgid程序的时候丢失与第0个数组元素中的组相关联的特权,login程序会在初始化用户的辅组数组的时候将第0个数组元素复制到第一个数组元素中。因此,当运行的 setgid程序修改第0个元素的时候,用户不会丢失任何特权,因为曾经保存在第0个数组元素中的组仍然可以从第一个数组元素中得到。

setuid功能是通过把进程的有效UID从用户的数值修改为被运行的程序的数值来实现的。和setgid一样,保护机制此时将毫不变样地允许访问,同时也不会意识到程序正在运行setuid。由于一个进程在同一时刻只能有一个UID,在运行setuid的时候就可能会丢失某些特权。在加载新的有效UID 的时候,之前的真实UID将会继续作为真实UID。不过真实UID是不会用于任何确认检查的。

一个setuid进程在运行过程中可能会想临时取消它的特殊权限。比如,它可能只在运行开始和结束的时候需要访问某个受限文件的特殊权限。在其余的运行时间中,它应当只具有真实用户的权限。在BSD的早期版本中,特权的回收是通过对真实的和有效的UID进行切换来完成的。由于只有有效UID被用于访问控制,这个方法既提供了所需的语义,又提供了一个隐藏特殊权限的地方。这个方法的缺点是很容易就混淆了真实的和有效的UID。

在FreeBSD中,使用了一个额外的标识符,即saved UID来记录setuid程序的身份。当一个程序被exec之后,它的有效UID会被拷贝到saved UID中。下表中的第1行表示了一个没有特权的程序,它的真实、有效以及saved UID都是真实用户的数值。第2行正在运行中的setuid程序,它的有效UID被设置成了具有相应特权的UID,而这个特权UID也会被拷贝到 saved UID中。

Actions affecting the real, effective, and saved UIDs.
_________________________________________________________________
Action            Real    Effective    Saved

1.exec-normal     R       R            R
2.exec-setuid     R       S            S
3.seteuid(R)      R       R            S
4.seteuid(S)      R       S            S
5.seteuid(R)      R       R            S
6.exec-normal     R       R            R

Key:R-real user identifier; S-special-privilege user identifier
_________________________________________________________________


seteuid系统调用只会修改有效UID,而不会影响真实的或saved UID。seteuid系统调用被允许将有效UID修改为真实的或saved UID的数值。表中的第3行和第4行表示了一个setuid程序在一直保持正确的真实UID的同时是如何放弃和重新取回它的特殊权限的。第5行和第6行表示了一个setuid程序可以运行一个子进程而不赋予它特殊权限。首先,它会把它的有效UID设置成真实UID。然后,当exec那个子进程的时候,有效 UID就会被拷贝到saved UID中,从此就会失去对特权UID的所有访问。

与此类似,也有一个saved GID机制,允许进程在真实GID和最初的有效GID之间进行切换。

分享到:
评论

相关推荐

    setuid-bishop

    ### setuid-bishop:如何编写安全的Setuid程序 #### 概述 在UNIX系统中,Setuid(Set User ID upon execution)程序是一种特殊类型的程序,它能够在执行时赋予普通用户临时权限,以便他们可以执行通常只有超级用户...

    jetty-setuid-6.1.6rc0.jar

    jetty-setuid-6.1.6rc0.jar

    复旦大学_软件安全_SEED labs_3-Environment_Variable_and_SetUID.zip

    在本实验"复旦大学_软件安全_SEED labs_3-Environment_Variable_and_SetUID"中,我们将探讨两个关键的计算机安全概念:环境变量(Environment Variables)和SetUID位(Set User ID)。这两个概念在软件安全领域起着...

    setuid-wrapper:一个简单的setuid包装程序,旨在启动具有提升特权的shell脚本

    编译中gcc -o setuid-wrapper setuid-wrapper.c正在安装chown root setuid-wrapperchmod 4755 setuid-wrapper用法假设myscript.sh是要以提升的特权运行的脚本,请创建一个包含以下内容的脚本: #!/bin/sh/path/to/...

    网络攻防课程seed-labs实验-Environment_Variable_and_SetUID.zip

    《网络攻防课程:环境变量与SetUID权限深入探索》 在网络安全领域,理解系统的工作原理至关重要,尤其是在涉及网络攻防的时候。本实验——“Environment_Variable_and_SetUID”旨在帮助学生深入理解两个关键概念:...

    linux三个特殊权限setuid、setgid和stick bit.docx

    Linux 三个特殊权限 setuid、setgid 和 stick bit Linux 系统中除了我们熟知的读(r)、写(w)、执行(x)权限外,还有三个比较特殊的权限,分别为:setuid、setgid 和 stick bit(粘滞位)。这三个特殊权限在 Linux ...

    权限管理-文件特殊权限-SetUID

    详细介绍了权限管理中的文件特殊权限-SetUID,在CentOS中有每一步骤的操作演示,并附有截图。

    set-UID实验报告

    **set-UID实验报告** 在计算机系统中,特别是在Unix和类Unix系统如Ubuntu上,set-UID(Set-User-ID)是一种特殊的权限标志,用于控制程序执行时的权限。这个标志允许一个用户运行一个程序时,该程序可以暂时获得...

    Linux之又爱又恨的SetUID权限详解

    权限管理-2.1SetUID 写在前面:自己写完检查可能会有所纰漏,读者们如若发现哪里有错误,可在下方留言或私信我,我会第一时间改正 1. SetUID的功能 只有可执行的二进制程序才能设定 SUID 权限(普通文件与目录设定...

    set-uid漏洞实验报告

    Set-UID漏洞实验报告主要探讨了Linux系统中的Set-UID机制及其安全性问题。Set-UID是一种特殊权限,允许用户在执行某个程序时暂时获得该程序所有者的权限,通常是root权限。这种机制对于某些需要特殊权限的系统命令至...

    SetUID-File-Copy-System:安全复制(scopy)的目的是允许一个用户根据除UNIX文件许可权(SetUID)之外的某些访问配置以安全的方式复制另一位用户的文件。

    SetUID-文件复制系统scopy的目的是允许一个用户根据UNIX文件许可权(SetUID)以外的某些访问配置复制另一个用户的文件。 项目的总体结构包含两个主要部分:-addConfig:为指定的受保护文件创建/添加到.acl配置文件中...

    环境变量与SET-UID实验.pdf

    在网络安全领域,理解环境变量和特殊权限如SET-UID对于分析和保护系统安全至关重要。SEED Labs提供的这个实验旨在让学生深入理解这些概念。实验主要分为四个部分:管理环境变量、将环境变量从父进程传递给子进程、...

    lua-setuid:一个暴露 setuidchroot 的 Lua 模块

    一个提供setuid和chroot功能的 Lua 模块。 要求 lua >= 5.1 用法 setuid.setuid( username ) :将当前进程用户 ID(真实、有效、已保存)更改为username ID。 setuid.chroot( path, username ) : chroot进入path 。...

    Seed报告,是一个入门的set uid 材料

    ### Seed报告:Set-UID程序漏洞实验室 #### 实验室简介 本实验旨在探索与学习Unix操作系统中的Set-UID机制及其潜在的安全问题。Set-UID(Set User ID on execution)是一种重要的安全机制,在Unix和类Unix系统(如...

    reference.rar

    在Linux操作系统中,Set UID(Set User ID)是一种特殊的权限机制,它允许用户以不同于他们当前用户身份的权限运行程序,通常是提升到更高权限,如root。这种机制是为了某些特定功能而设计的,例如普通用户可以使用...

    Set-UID原理及漏洞攻击实验详细过程及实验报告

    Set-UID(Set-User-Id)是一种在Unix和类Unix操作系统中用于权限管理的机制。这个特性允许普通用户执行一个具有特殊权限的程序,通常是系统管理员(root)的权限。这种权限提升是为了某些必要的任务,例如更新系统...

    东南大学网络空间安全实验基础——环境变量和Set-UID程序实验

    在网络安全领域,环境变量和Set-UID程序是两个重要的概念,它们与系统安全密切相关。本实验旨在通过一系列任务深入理解这两个概念以及它们如何影响程序执行和权限管理。 环境变量是操作系统中存储信息的一种方式,...

    SetUIDLab:一个基于Du博士的Set UID SEED Lab的实验室。 该实验室旨在在锡拉丘兹大学信息安全俱乐部进行1个小时的演讲

    SetUIDLab 这是2021年3月9日在锡拉丘兹大学Infosec俱乐部提出的Set-UID实验室的存储库。 它很大程度上基于Du Dr的Set Environment Variable和Set-UID Lab,可访问。

    C++学习摘录

    STL是C++标准库的一部分,包含容器(如vector、list、set)、迭代器、算法和函数对象等组件。容器存储和管理元素,迭代器提供访问容器内元素的方式,算法则对容器内的元素进行操作,如排序、查找等。函数对象(或...

    linux系统调用分析

    ### Linux系统调用分析——setuid系统调用深入解析 #### 概述 在Linux操作系统中,`setuid`是一个非常重要的系统调用,它允许用户更改进程的有效用户ID。这种能力对于许多需要特殊权限的应用程序来说至关重要。...

Global site tag (gtag.js) - Google Analytics