SUID或SGID程序中能不能用system函数

  system()函数的声明和说明如下:

  

  注意它的描述那里,system()执行一个由command参数定义的命令,通过调用/bin/sh -c命令来实现这个功能。也就是说它的逻辑是这样的!

  进程调用system函数,system函数调用fork创建一个子进程,然后再调用exec函数来把这个子进程的正文段替换成/bin/sh命令的正文段。然后再由sh来执行exec将程序的正文段替换成command参数所代表的命令的正文段,例如,我的一个程序a.out来调用system函数来执行sleep 20命令,它的进程示意图如下所示:

  

  可以参考下面这个例子,如下图所示:

  这里我执行了一个system文件,产生了两个进程,3994和3995(右边那个终端所示,第一列是PPID,第二列是PID),这两个进程是父子关系,值得注意的是这两个进程进程ID是连着的,也就是说在这两个进程执行的时候没有新的进程产生。

  接下来开始扯正题,在《APUE》(UNIX环境高级编程,下文不再赘述)的8.13节中,作者强调SUID和SGID程序中不应该调用system函数。为什么呢,我个人的理解是这样的。

  以SUID权限为例,SUID这种权限设立的目的是什么,就是提供一种可控的超级权限。比如passwd命令,运行passwd这个程序后,进程的有效用户ID是root,理论上可以为所欲为(即对shadow这个文件想怎么改就怎么改),但是passwd程序的代码已经被写死了,用户所做的操作都要经过passwd这个程序的检验,符合标准了才能够进行,否则程序就会提示出错!(也就是说不能像vim那样随意对shadow文件进行更改,只能在某种规范下进行更改)。

  同时,这种权限应该是有限制的,不能够进行任意传播。比如,像man这种能够执行shell命令的程序,它执行shell命令就是通过fork-exec机制来执行了,在某些distribution中有一个man用户,man程序属于这个用户,并且设置了SUID位。也就是说我任意一个普通用户运行man程序后的有效用户都是man,如果此时这个普通用户在man程序中执行shell命令的话,这个shell命令进程的有效用户应不应该是man呢,设置用户ID应不应该继续保留呢,当然不行啦,这样的话一个普通用户不就能够通过这种方式来具有了man用户的权限了!(如果保留了设置用户ID,那么在子进程中可以调用setuid函数来使进程的有效用户ID变成设置用户ID,同样能达到上面所说的目的)

  OK,上面说的这么一大串,就是为啥SUID或者SGID程序不应该调用system函数来执行一个shell命令,因为这样会传播进程的设置用户ID和有效用户ID,将它传递给子进程,这样就会产生bug了。理论上是这样的,但是实际中我发现貌似不行,我的centos6.6上就不能模拟出这个bug来,比如我有这么一段程序:

  getresuid程序的代码如下:

 1 /*  这个程序的作用是获取进程的三个用户ID,它的可执行文件被做了一个软链接到/home/michael/bin下面
 2  * */
 3 #include<errno.h>
 4 #include<string.h>
 5 #include<stdlib.h>
 6 #include<stdarg.h>
 7 #include<stdio.h>
 8 #include<sys/types.h>
 9 #include<unistd.h>
10 #define BUFSIZE 512
11 void err_exit(char *fmt,...);
12 int main(int argc,char *argv[])
13 {
14     uid_t ruid,euid,suid;
15 
16     if(-1 == getresuid(&ruid,&euid,&suid))
17     err_exit("[getresuid]: ");
18     printf("real:%d\teffective:%d\tset-user:%d\n",ruid,euid,suid);
19 
20     return 0;
21 }

  system程序的代码如下:

 1 #include<stdlib.h>
 2 #include<stdio.h>
 3 int main(int argc,char *argv[])
 4 {
 5     uid_t ruid,euid,suid;
 6 
 7     if(-1 == getresuid(&ruid,&euid,&suid))
 8     err_exit("[getresuid]: ");
 9     printf("real:%d\teffective:%d\tset-user:%d\n",ruid,euid,suid);
10 
11     system("getresuid");
12     return 0;
13 }

  这个system程序的功能就是首先输出进程的real uid,effective uid,和set-user id,然后再来通过system函数调用getresuid程序再来把这三个uid输出一遍,我把system这个可执行文件变成root所有,并加上suid权限,执行的结果如下图:

  

  第一个uid的输出结果是符合预期的,即由于SUID权限位的设置,有效用户ID是0。但是后面第二个uid的输出却和想象的有点不同,理论上,system函数应该是能够传递set-user ID和有效用户ID给子进程的,但是这里三个UID全部都变成了500,没一个是root,这个可能是因为system函数在exec之前将所有三个UID都变成了实际用户ID,或者是sh命令在exec之前将所有三个UID都变成了实际用户ID。

  照这么看来,貌似在SUID程序中调用system函数也未尝不可,但是为了保险起见,还是自己通过fork和exec动手来实现一个system吧,然后在exec之前把三个UID都设置成实际用户ID。

转载于:https://www.cnblogs.com/bwangel23/p/4239889.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xamarin iOS编写第一个应用程序创建工程

Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后&#xff0c;就可以在Xamarin Studio中编写程序了。本节将主要讲解在Xamarin Studio中如何进行工程的创建以及编写代码等内容XamariniOS编写第一个应用程序创建工程本文选自Xamarin iOS开发实战大学霸。 1.3.…

Birt使用总结

把report放到其他服务器要重新建立Data Source ,这是配置&#xff0c;拷贝项目时不会同时拷贝 (1)在EXTJs中利用Report实现报表的刷新 Ext.getCmp("showview").body.update("<iframe idshowviewframe src" "> </iframe>"…

【线性代数公开课MIT Linear Algebra】 第二十三课 微分方程与exp(At)

本系列笔记为方便日后自己查阅而写&#xff0c;更多的是个人见解&#xff0c;也算一种学习的复习与总结&#xff0c;望善始善终吧~ 一阶常系数微分方程 Aududt 将一阶常系数微分方程转换为线性代数问题的关键在于常系数微分方程的解一定是指数形式的。那么我们的需要求解的东西…

iOS学习之基本概念

学习iOS最重要的是态度和兴趣&#xff0c;如果你对于学习始终抱有不断的热情和端正的态度&#xff0c;那么&#xff0c;无论是什么&#xff0c;你总会成功的&#xff01; 有一句话与大家共勉&#xff1a;过程中跌倒多少次都没有关系&#xff0c;重要的是&#xff0c;跌倒后你能…

【转】gvim配置及相关插件安装

0.准备软件及插件。(a)gvim72.exe 地址ftp://ftp.vim.org/pub/vim/pc/gvim72.exe。(b)vimcdoc-1.7.0-setup.exe 地址http://prdownloads.sourceforge.net/vimcdoc/vimcdoc-1.7.0-setup.exe?download(c)ec57w32.zip 地址http://prdownloads.sourceforge.net/ctags/ec57w32.zip(…

Android 高级编程 RecyclerView 控件的使用

RecyclerView 是Android 新添加的一个用来取代ListView的控件&#xff0c;它的灵活性与可替代性比listview更好。 看一下继承关系&#xff1a; ava.lang.Object ↳android.view.View ↳android.view.ViewGroup ↳android.support.v7.widget.RecyclerViewKnown Direct …

jquery判断一个div的边界是否超出另外一个div的边界

摘要&#xff1a;本文简单介绍jquery判断一个div的边界是否超出另外一个div的边界&#xff0c;如果超出边界做出相应的处理。 1、实现效果 判断前 判断后 2、实现思路 实现类似的判断&#xff0c;主要是获取两个div在浏览器中的上下左右的四至&#xff0c;在jquery中&#xff0…

maven环境快速搭建(转)

最近&#xff0c;开发中要用到maven&#xff0c;所以对maven进行了简单的学习。因为有个maven高手在身边&#xff0c;所以&#xff0c;很快就上手了&#xff0c;我这里算是自我总结吧。关于maven是什么东东&#xff0c;请参考其它文章。 ----------------准备工作-------------…

cocos2d-x3.0 相对布局(一)

2dx相对布局和Android非常类似。假设前完成Android它应该是easy入门。Size widgetSize Director::getInstance()->getWinSize();Text* alert Text::create("Layout", "fonts/Marker Felt.ttf", 30 );alert->setColor(Color3B(159, 168, 176));aler…

夺命雷公狗---ECSHOP---08---商品页的拇改成星星

<strong>用户评价&#xff1a;</strong>{*---------商品评价星星开始----------*}<img src"./images/stars{$goods.comment_rank}.gif" alt"comment rank {$goods.comment_rank}">{*---------商品评价星星结束-------*} 这里主要是要有星…

文件指针

一.移动文件指针 SetFilePointer,hFile,lDistanceToMove,lpDistanceToMoveHigh,dwMoveMethod dwMoveMethod 指明移动的模式 FILE_BEGIN 不管文件处于什么地方,总是从文件的头部开始移动,这时的位置参数相当于指定了一个绝对位置 FILE_CURRENT 从当前的文件指针处开始移…

见证下的自我变化-2014全年总结

又是一年总结季&#xff0c;回过头看看看自己的成长&#xff0c;心里真的是满满的喜悦之情…… 一年前自己的总结博客&#xff1a;http://blog.csdn.net/huo065000/article/details/19632603 半年前自己的总结博客&#xff1a;http://blog.csdn.net/huo065000/article/details/…

【Linux学习篇】This virtual machine is configured for 64-bit guest operating systems.……

在学习Linux的基本操作的时候&#xff0c;安装虚拟环境则提示自己 This virtualmachine is configured for 64-bit guest operatingsystems.……起初由于各种拒绝的心理&#xff0c;所以屏蔽了这个错误&#xff0c;但是屏蔽永远也解决不了问题的&#xff0c;所以自己则尝试百度…

图解SSIS监视文件夹并自动导入数据

图解SSIS监视文件夹并自动导入数据 原文:图解SSIS监视文件夹并自动导入数据 演示案例&#xff1a;让系统自动监视文件夹&#xff0c;并把文件夹下面的excel文件导入到sql中&#xff0c;之后清空目录。这个过程以往都需要写程序来实现或者定时执行&#xff0c;现在可以用ssis来订…

WP8手机解锁时提示“请确保IPOVERUSBSVC服务正常运行”解决方法

如果你各种重启服务 卸载手机 重装驱动都试过了还不行&#xff0c;请看看你是否安装了Hyper-v或Vitualbox虚拟机&#xff0c;很有可能是虚拟交换机造成的。 我在网络连接属性里看到这个 把它卸载后&#xff0c;解锁成功。 解锁后记得重新安装卸载的那个网络服务转载于:https://…

浮点数的存储

-------------------------------------------------------------------------------- 在VC6.0----float环境一共32位 其中第一位是符号位 第二到第9位中间8位为小数点位置&#xff08;指数以127的二进制为原点向下为负指数 向上为正指数&#xff09;后面23位为数据位。 S EE…

一款基于css3鼠标经过圆形旋转特效

今天给大家分享一款基于css3鼠标经过圆形旋转特效。当鼠标经过的时候图片边框颜色旋转&#xff0c;图片显示详情。该实例适用浏览器&#xff1a;IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗。效果图如下&#xff1a; 在线预览 源码下载 实现的代码。 ht…

Eclipse生成jar包

前言: 本宅因为要写XXX软件的一个插件,来用用java,接触3天后 在打jar包上卡住了..... 经过大量的百度搜索后有如下几种解决方案: 解决方案: 一.安装Fatjar 在线安装地址:http://kurucz-grafika.de/fatjar 悲剧的是我怎么也安装不上去,于是放弃(在线下载包什么 我的Eclipse版…

Buffer和Cache的区别

现在不都是只有page cache了吗&#xff1f; buffer pages其实也是page cache里面的页。只是多了一层抽象&#xff0c;通过buffer_head来进行一些访问管理对,从Linux算法实现的角度&#xff0c;page cache和buffer cache目前是一样的&#xff0c;但是从功能抽象和具体应用来讲&a…

Android刷机

这里也有一篇比较详细的 http://blog.csdn.net/qq1084283172/article/details/52334452 官网刷机包 https://developers.google.com/android/images#hammerhead 我的机器是Nexus 5 一. 安装驱动 如何进入fastboot模式 1. 拔掉数据线&#xff0c;将手机关机 2. 关机后同时按…