`
cuiyadll
  • 浏览: 196769 次
文章分类
社区版块
存档分类
最新评论

setuid()与setgid() -- 设置 UID 和 GID

阅读更多

用 setuid() 设置实际用户 UID 和有效用户 UID。
用 setgid() 设置实际组 ID 和有效组 ID。

两个函数声明如下
setuid()与setgid() <wbr>-- <wbr>设置 <wbr>UID <wbr>和 <wbr>GID
在使用该函数时会遇到以下情况:
1. 若进程有 root 权限,则函数将实际用户 ID、有效用户 ID 设置为参数 uid 。使用 root 运行下面代码:
setuid()与setgid() <wbr>-- <wbr>设置 <wbr>UID <wbr>和 <wbr>GID
运行输出:
引用
# ./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 用户,则该进程从此就不具有超级用户权限了。看下面代码:
setuid()与setgid() <wbr>-- <wbr>设置 <wbr>UID <wbr>和 <wbr>GID
我们使用 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 权限。
分享到:
评论

相关推荐

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

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

    gosu:简单的基于Go的setuid + setgid + setgroups + exec

    它们的设置和使用也有些复杂(特别是在sudo的情况下),这允许很大的表达力,但是如果您所需要做的只是“以该特定用户身份运行此特定应用程序并摆脱困境,管道”。 怎样的核心gosu作品直接从如何泊坞窗/ ...

    简要对比C语言中的setgid()函数和setregid()函数

    C语言setgid()函数:设置真实的组识别码 头文件: #include 定义函数: int setgid(gid_t gid); 函数说明:setgid()用来将目前进程的真实组识别码(real gid)设成参数gid 值. 如果是以超级用户身份执行此调用, ...

    linux-权限管理视频教程

    08.2.1 权限管理-文件特殊权限-SetUID.mp4 08.2.2 权限管理-文件特殊权限-SetGID.mp4 08.2.3 权限管理-文件特殊权限-Sticky BIT.mp4 08.3 权限管理-chattr权限.mp4 08.4 权限管理-sudo权限.mp4

    Solaris管理员常用168条命令简明手册

     /* Using multiple windows, this can be used to trace setuid/setgid programs */    Arp, ethernet trouble shooting    arp -a .  /* Shows the ethernet address arp table */    arp -d myhost  /* ...

    实验3 Red Hat的操作 - 副本.doc

    10. 使用字符方式设置文件file的特殊权限setuid和setgid; 11. 使用数值方式设置文件file2的特殊权限setuid和stick bit,并用字符方式删除文件file2的stick bit; 12. 用whereis查找“ls”命令的可执行文件和帮助...

    Linux基础知识与系统管理教学课件-pdf.rar

    8.2.1 权限管理-文件特殊权限-SetUID 8.2.2 权限管理-文件特殊权限-SetGID 8.2.3 权限管理-文件特殊权限-Sticky BIT 8.3 权限管理-chattr权限 8.4 权限管理-sudo权限 9 文件系统管理 9.1 文件系统管理-回顾分区和...

    su-exec:对于Linux node.js,以root身份运行可执行文件,类似于linux中的sudo。

    不要忘记使用process.setuid()和process.setgid()放弃root特权。 它与当前节点进程一起保留了一个很小的后台进程来获取root特权。如何使用使用npm install su-exec 。 使用前,应使用suExec.init()一次初始化。 ...

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

    适合初学者。详细介绍了权限管理中的文件特殊权限SetGID,附有步骤演示截图。

    详解Linux系统中特殊文件权限

     1、setuid与setgid讲解  看一下系统中用到它的地方,以/etc/passwd和/usr/bin/passwd为例: [plain] view plaincopy [root@Salve1 school]# ll /etc/passwd /usr/bin/passwd -rw-r–r– 1 root root 2

    Linux基础知识与系统管理视频.rar

    8.2.1 权限管理-文件特殊权限-SetUID 8.2.2 权限管理-文件特殊权限-SetGID 8.2.3 权限管理-文件特殊权限-Sticky BIT 8.3 权限管理-chattr权限 8.4 权限管理-sudo权限 9 文件系统管理 9.1 文件系统管理-回顾分区和...

    Secure Programming for Linux and Unix HOWTO.rtf

    Such programs include application programs used as viewers of remote data, web applications (including CGI scripts), network servers, and setuid/setgid programs. Specific guidelines for C, C++, Java,...

    AIX系统安全加固手册

    1系统维护升级加固 2安装系统安全补丁加固 3系统配置加固 4Setuid and setgid (可选)

    Linux 文件和目录的属性

    1、Linux 文件属性概说 2、关于inode ...5、setuid和setgid 位 6、粘贴位及设置方法 7、文件或目录的归属关系 8、影响文件的读写执行的因素 9、文件被修改或被访问的时间 10、文件属性和文件系统属性的关系

    substack-flavored-webapp:这里有一些小的后端节点模块,我喜欢把它们粘在一起来构建 webapps

    这里有一些我喜欢将一些小的后端节点模块粘在一起来构建 web 应用程序。 此示例仅包含后端组件。... setuid ( argv . uid ) ; 使用-g和-u指定要放入的用户和组。路线routes模块对于分解 web 应用程序的

    Linux和Unix安全编程HOW TO(中文版)

    本文对在Linux和Unix系统下编写安全程序给出了一组设计和...这样的程序包括用来浏览远端数据的应用程序、CGI脚本程序、网络服务器和setuid/setgid程序。本文还包含了针对C、C++、Java、Perl、Python和Ada95的特别指导.

    Linux中特殊权限SUID、SGID与SBIT的深入讲解

    前言 ...我们先看看下面两个的权限是什么 ...setuid 和 setgid 分别是 set uid ID upon execution 和 set group ID upon execution 的缩写。我们一般会再次把它们缩写为 suid 和 sgid。它们是控制文件访问的权限标志(flag)

    ESX 配置指南 Update 1 ESX 4.0 vCenter Server 4.0

    14 服务控制台安全 165 常规安全建议 165 登录到服务控制台 166 服务控制台防火墙配置 166 密码限制 170 密码强度 175 setuid 和 setgid 标记 176 SSH 安全 177 安全修补程序和安全漏洞扫描软件 178 15 安全部署和...

    namemanager:DNS管理平台

    ##NamedManager 是什么? 一个管理powerdns记录的平台。...setuid=pdns setgid=pdns launch=bind recursor=127.0.0.1:5300 recursor监听ip:port soa-refresh-default=7200 launch=gmysql gmysql-host=x.x.x.x #mysq

Global site tag (gtag.js) - Google Analytics