当前位置: 首页 > 编程日记 > 正文

setuid和setgid

setuid 和 setgid (全称分别是:set user ID upon execution 和 set group ID upon execution)是Unix的访问权限标志位,它允许 用户以可执行文件owner或group的权限来运行这个可执行文件。它们经常适用于:为了运行特定的任务,可以允许用户暂时的提高权限。用处: 暂时的权限提升
什么情况下需要setuid 和 setgid呢?当task需要的权限高于用户的权限时,比如修改用户的登录密码。有些任务需要更高的权限可能不会立刻表现出来,比如ping,它需要发送和监听某个网络接口的控制包。

1. setuid作用于可执行文件
当一个二进制可执行文件被设置了setuid属性之后,在所创建的进程内部,有权限执行此文件的用户将会获得这个可执行文件的owner的权限(通常是root)。在进程内部,用户获取root权限之后,这个用户将可以做一下常规用户被限制做的事情,当然有些事情是禁止的:比如使用ptrace 、LD_LIBRARY_PATH, 或者给自己发送信号(但是从终端发送的信号是可以的)。由于潜在竞争条件,如果setuid 作用于shell 脚本,很多操作系统将会忽略掉setuid.
虽然setuid在很多场合是很有用的,但是如果一个可执行程序设计的不够好并被设置了setuid将会带来潜在的风险。人们能够利用有漏洞的程序获取永久的权限提升,或者让用户在无意之间运行一个特洛伊木马。
setgid能够改变group的权限,正如setuid改变user权限一样。

setuid作用于可执行文件解释了为什么系统调用chroot对于非root用户是不可用的。

可以通过chmod 来设置setuid 和 setguid的标志位(最高位),
4: for setuid

2: for setguid

1: 这个是粘滞位 //可以参考:http://blog.csdn.net/hzgdiyer/article/details/6788275

"chmod 6711 file" 将会设置setuid 和setguid, bits(6) 即位最高位。
另外还多系统也支持 “chmod ug+s"命令来设置.

下面的演示代码用来获取并显示出进程的real 和 effective 的用户(user)和组(group)的ID:
1.显示printid.c的代码,这段代码就是打印real/effective user/group ID
2.编译程序printid
3.运行程序printid,打印出了real/effective user/group ID
4.修改printid的owner为root
5.给文件printid添加setuid和setgid标志位
6.取消文件printid其它用户(other)的读r和执行x权限
7.显示文件printid属性
8.重新运行printid,
我们发现printid权限:
owner:root, rws
group:staff, r-s
other: ---
虽然other没有任何权限,但以用户bobie(对于问价printerid,bobie不是owner,也不是group,属于other)运行printid,依然可以运行,显然是添加了setuid的原因。
通过打印信息可以看到effective id 是0,正好是root的id,可以参考/etc/passwd(里面有每个用户/组对应的id)
//备注:如果这个程序是在volumn上运行且mounte时添加了'nosuid'选项,这个程序将会失败,没有打印信息;
//volumn: 可以再磁盘上创建卷(volumn),物理卷(PV)=》逻辑卷(LV)=>卷组(VG),最后将这卷组mounte到指定路径

[bobie]$ cat printid.c

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void) {
printf(
" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (),
geteuid(), getegid()
);
return getegid() ; /* always good to return something */
}

[bobie]$ cc printid.c -o printid
[bobie]$ ./printid
UID GID
Real 1008 Real 1008
Effective 1008 Effective 1008

[bobie]$ sudo chown root printid # to change the owner you need to sudo
Password:
[bobie]$ sudo chmod ug+s printid # SetUID and SetGID flags
[bobie]$ sudo chmod o-rx printid # Don't let Others read or execute it
[bobie]$ ls -l
-rwsr-s--- 1 root staff 6944 2011-10-06 10:22 printid
[bobie]$ ./printid
UID GID
Real 1008 Real 1008
Effective 0 Effective 20

2.setuid/setgid作用于路径
setuid和setgid作用于路径时,有完全不同的含义。

给路径设置set gid(chmod g+s),会导致路径下 新建的文件和子文件夹继承它的group id, 而不创建文件或文件夹的用户的primary group id.【只有group id 受影响,owner id 不受影响】。另外,新创建的子文件夹还将继承setgid位。注意:给路径设置setgid,仅仅影响新建的文件和文件夹的group id, 已经存在的文件和文件夹不受影响
给已经存在的子文件夹设置setgid,必须手动来做,用如下命令:
[root@foo]# find /path/to/directory -type d -exec chmod g+s {} \;

给路径设置set uid,将会被Unix 和 Linux系统 忽略

3.安全
被设置setuid/setgid的程序必须小心的设计防止缓存区溢出攻击。缓存区溢出攻击成功的后果是:能够使攻击者利用进程的权限执行任意的代码。如果一个有漏洞的程序被设置了setuid,权限提升以root运行,攻击成功就会使攻击者获得root权限,这太可怕了。

4.历史
setuid 是 Dennis Ritchie发明的,他所在的公司AT&T, 于1972年申请专利,1979年专利获批,专利号:US 4135240 "Protection of data file contents".

相关文章:

Java项目:宠物医院预约挂号系统(java+JSP+Spring+SpringBoot+MyBatis+html+layui+maven+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述功能包括&#xff1a; 用户分为宠物&#xff0c;医生&#xff0c;管理员&#xff0c;宠物主人可进行注册选择医生挂号&#xff0c;选择日期&#xff0c;选择号源&#xff0c;医生可进行宠物接诊…

大智慧面试经验

15-06-18下午1点&#xff0c;大智慧面试&#xff1b; 面试题全英文&#xff0c;第一部分基础的&#xff0c;诸如echo print printf的区别&#xff0c;include与require的区别等&#xff1b; 第二部分细节方面的&#xff0c;如在string中\n的意义&#xff0c;ucwords函数&#x…

Android 获取apk签名的fingerprint

为什么80%的码农都做不了架构师&#xff1f;>>> 假定安装了JDK&#xff0c;如果想查HelloWorld.apk所使用的签名的fingerprint&#xff0c;可以这样做&#xff1a;1. 查找apk里的rsa文件 &#xff08;Windows&#xff09; > jar tf HelloWorld.apk |findstr RSA…

Dinic二分图匹配 || Luogu P3386

题面&#xff1a;【模板】二分图匹配 思路&#xff1a;Dinic实现二分图匹配&#xff0c;要建一个超级源点&#xff08;S&#xff09;和超级汇点&#xff08;T&#xff09;&#xff0c;分别定为NM1和NM2 然后S去和N中的数建正边和反边&#xff0c;正边权值为1&#xff0c;反边权…

shell中引号的使用方法

1. shell使用引号(单引号/双引号)和反斜线("\")用于向shell解释器屏蔽一些特殊字符. 反引号[h2] 对shell则有特殊意义. 1.1 单引号和反斜线 [h1] 可以阻止shell代入变量的值&#xff1b; 1.2 双引号不能阻止代入 例如&#xff1a; sles10i32-1:han$ personha…

Java学习笔记(二)不定时更新

Java语言画图 package cn.witksy.dev;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;/*** Author: Alfred* Created: 2015/5/7*/ public class Main {public void run() {Buffered…

Java项目:前台后台玩具商城系统(java+JSP+SSM+Springboot+Jsp+maven+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述本系统主要实现的功能有&#xff1a; 网上商城系统&#xff0c;前台后台管理&#xff0c;用户注册&#xff0c;登录&#xff0c;商品展示&#xff0c;分组展示&#xff0c;搜索&#xff0c;收货…

Tempdb数据库详细介绍

Tempdb数据库详细介绍一、Tempdb简介tempdb是SQLServer的系统数据库一直都是SQLServer的重要组成部分&#xff0c;用来存储临时对象。可以简单理解tempdb是SQLServer的速写板。应用程序与数据库都可以使用tempdb作为临时的数据存储区。一个实例的所有用户都共享一个Tempdb。很明…

java——逻辑运算符与(和)或(|和||)

区别&#xff1a; 1意思不同&#xff1a; &&是“与”的意思&#xff0c;||是“或者”的意思。 2 使用上不同&#xff1a;a && b&#xff1a;a和b同时为true 才返回 true&#xff0c; 否则返回false&#xff1b;a || b&#xff1a;a或b任意一个为true 就返回tru…

UTRAN 的用户面和控制面

UTRAN接口的通用协议模型如下图&#xff1a; 通俗地讲&#xff0c;通讯网络由终端(terminal)、连接(links)、网络节点(nodes)组成, links将nodes 关联起来。源终端(MO)发送的消息是怎样才能到目的终端(MT)呢? 消息经过links 和nodes,直至到达MT&#xff0c;其中关键是nodes怎么…

Java项目:疫情人员流动管理系统(java+JSP+SSM+Springboot+maven+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 本系统主要实现的功能有&#xff1a; 社区疫情流动人员管理系统&#xff0c;住户管理&#xff0c;出入管理&#xff0c;访客管理&#xff0c;体温录入&#xff0c;高风险警示等等。 二、项目运…

[原创]CentOS下Mysql双机互为备份

一、环境&#xff1a; 1.安装Centos-6.5-x64位系统的机器两台&#xff1a; host1&#xff1a;192.168.2.3 host2&#xff1a;192.168.2.4 &#xff08;互相能ping通&#xff09; 2.安装Mysql。 命令&#xff1a;Yum install mysql-* 二、配置&#xff1a; 1、启动mysql。命令&…

《Effective Java》读书笔记--创建和销毁对象

2019独角兽企业重金招聘Python工程师标准>>> 考虑用静态工厂方法代替构造函数。 当我们在写一个工具类时&#xff0c;是不希望用户将该类实例化的&#xff0c;所以应该定义一个private的构造函数&#xff0c;而不 是将类声明成abstract&#xff0c;因为这样用户可以…

用chrome的snippets片段功能创建页面js外挂程序,从控制台创建js小脚本

用chrome的snippets片段功能创建页面js外挂程序&#xff0c;从控制台创建js小脚本 Chrome的snippets是小脚本&#xff0c;还可以创作并在Chrome DevTools的来源面板中执行。可以访问和从任何页面运行它们。当你运行一个片段&#xff0c;它从当前打开的页面的上下文中执行。 要创…

两个类相互包含引用的问题--类前向声明

在构造自己的类时&#xff0c;有可能会碰到两个类之间的相互引用问题&#xff0c;例如&#xff1a;定义了类A类B&#xff0c;A中使用了B定义的类型&#xff0c;B中也使用了A定义的类型 class A { int i; B b; } class B { int i; A* a; } 请注意上面的定义内…

Java项目:网上电子书城项目(java+SSM+JSP+maven+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 项目描述&#xff1a; spring mvc jsp实现的简单书城项目&#xff0c;可以在支付宝沙箱内实现支付 运行环境&#xff1a; jdk8tomcat9mysqlIntelliJ IDEA 项目技术&#xff1a; springspring mvcmybati…

[nowCoder] 局部最小值位置

定义局部最小的概念。arr长度为1时&#xff0c;arr[0]是局部最小。arr的长度为N(N>1)时&#xff0c;如果arr[0]<arr[1]&#xff0c;那么arr[0]是局部最小&#xff1b;如果arr[N-1]<arr[N-2]&#xff0c;那么arr[N-1]是局部最小&#xff1b;如果0<i<N-1&#xff…

log parser 微软iis 日志分析

Log Parser 2.2 您可以从 Microsoft 下载中心下载 Log Parser。 Log Parser 2.2 是一个功能强大的通用工具&#xff0c;它可对基于文本的数据&#xff08;如日志文件、XML 文件和 CSV 文件&#xff09;以及 Windows 操作系统上的重要数据源&#xff08;如事件日志、注册表、文件…

ubuntu 大小写指示的小工具

最近买个了小本lenovo x100e&#xff0c;结果发现这小本没有大小写指示灯&#xff0c;在windows用也无妨&#xff0c;不过我常常用这本在ubuntu中调试linux代码&#xff0c;vi 常用的编辑器&#xff0c;熟悉的都知道&#xff0c;大小写很关键的&#xff0c;用google搜了一下&am…

mysql主键约束和唯一性约束

主键约束和唯一性约束都是索引&#xff0c;它们的区别是&#xff1a; 主键字段可以确保唯一性&#xff0c;但主键字段不能为NULL.唯一性约束可以确保唯一性&#xff0c;但唯一性约束的字段可以为NULL唯一性约束对含有NULL的记录不起作用&#xff0c;即可以重复加入含有NULL的记…

Java项目:农资采购销售系统(java+SSM+Easyui+maven+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 项目描述&#xff1a; 一个完整的农资采购销售系统&#xff0c;系统分为前台会员注册登陆&#xff0c;农资信息浏览&#xff0c;农资详情信息查看&#xff0c;加入购物车&#xff0c;提交订单&#xff0c;付…

springMVC 拦截器

为什么80%的码农都做不了架构师&#xff1f;>>> 实现springMVC 拦截器步骤&#xff1a; 1.定义拦截器类HandlerInterceptor 继承HandlerInterceptor public class Interceptor implements HandlerInterceptor { /**preHandle&#xff1a;预处理回调方法&#…

django学习笔记--数据库中的多表操作

1.Django数据库----多表的新增操作 1.一对一模式下新增 创建一个详情对象&#xff0c;把这个对象赋值给创建的新的user对象 author_detail models.AuthorDetail.objects.create(addr上海,phone178****4789) # 直接设置author_detail为一个对象 author models.Author.objects.…

+z +Z compiler flag for HP

1. 今天遇到一问题&#xff0c;在sles11/vxworks下编译通过&#xff0c;但是在hpux下失败 2. 编译错误&#xff1a; /usr/ccs/bin/ld:DP relative code in file /projects/xxx/DERIVED/tfa_pa32-hpux.a(tfa02_pa32-hpux.o) -shared library must be position indep…

DP UVALive 6506 Padovan Sequence

题目传送门 /*题意&#xff1a;两行数字&#xff0c;相邻列一上一下&#xff0c;或者隔一列两行都可以&#xff0c;从左到右选择数字使和最大DP&#xff1a;状态转移方程&#xff1a;dp[i][j] max (dp[i][j], dp[1-i][j-1] a[i][j], dp[i/1-i][j-2] a[i][j]);要从前面一个转…

Java项目:基于遗传算法学校排课系统(java+Springboot+Maven+mybatis+Vue+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述本系统功能包括&#xff1a; 排课管理&#xff0c;课程管理&#xff0c;讲师管理&#xff0c;班级管理&#xff0c;学生管理&#xff0c;教学资料&#xff0c;学习文档&#xff0c;在线测试&…

冲刺周期会议七

一、会议时间&#xff1a;2014年5月6日20:30--21:00 二、会议地点&#xff1a;学院楼一楼大厅 三、会议目的:统计任务进度&#xff0c;记录会议问题 四、会议内容&#xff1a; 1、对近几天的项目进度进行总结&#xff1a; 由于刚刚开始学习安卓&#xff0c;无论是配置环境还是学…

chrdev字符设备几种注册方式的差异

数据结构 #define CHRDEV_MAJOR_HASH_SIZE 255static struct char_device_struct {struct char_device_struct *next;unsigned int major;unsigned int baseminor;int minorct;char name[64];struct file_operations *fops;struct cdev *cdev; /* will die */ } *chrdevs[CHRD…

ldconfig及 LD_LIBRARY_PATH

ldconfig及 LD_LIBRARY_PATH 1. 往/lib和/usr/lib里面加东西&#xff0c;是不用修改/etc/ld.so.conf的&#xff0c;但是完了之后要调一下ldconfig&#xff0c;不然这个library会找不到 2.想往上面两个目录以外加东西的时候&#xff0c;一定要修改/etc/ld.so.conf&#xff0c;然…

Java项目:诚途旅游系统(java+JSP+Spring+SSM+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 采用ssm架构实现的旅游网站系统 包括网站展示和后台管理功能&#xff0c;网站主要是页面浏览以及评论、制定旅游方案、智能推荐功能 后台就是维护网站展示的内容&#xff0c;添加旅游景点、管理用户、查看…