免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3435 | 回复: 3
打印 上一主题 下一主题

保存的设置用户ID位以及exec函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-22 18:12 |只看该作者 |倒序浏览
本帖最后由 blackgenius 于 2010-08-22 22:58 编辑

请教各位前辈,保存的设置用户ID位到底是怎么工作的。看书只理解它是用来切换用户有效用户ID的,可是具体是怎么切换的?

假设有一个程序文件有设置用户ID位,那当一个进程执行它时,进程的有效用户ID变成了该文件的属主用户ID,那saved set-user-ID到底是怎么工作的,它保存的是原来的进程自己的effective user ID还是该文件的effective user ID?请求解除疑惑!谢谢!

另一个疑惑,execl等一系列exec函数的实现是不是使得当exec正确执行时在exec完成后会结束调用它的进程?比如程序段:
  1. #include        <sys/wait.h>
  2. #include        <errno.h>
  3. #include        <unistd.h>

  4. int
  5. system(const char *cmdstring)   /* version without signal handling */
  6. {
  7.         pid_t   pid;
  8.         int             status;

  9.         if (cmdstring == NULL)
  10.                 return(1);              /* always a command processor with UNIX */

  11.         if ((pid = fork()) < 0) {
  12.                 status = -1;    /* probably out of processes */
  13.         } else if (pid == 0) {                          /* child */
  14.                 execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
  15.                 _exit(127);             /* execl error */
  16.         } else {                                                        /* parent */
  17.                 while (waitpid(pid, &status, 0) < 0) {
  18.                         if (errno != EINTR) {
  19.                                 status = -1; /* error other than EINTR from waitpid() */
  20.                                 break;
  21.                         }
  22.                 }
  23.         }

  24.         return(status);
  25. }
复制代码
此程序段中执行sh后子进程就结束了,是因为它执行的sh这个程序有调用exit函数还是说execl函数自己调用了exit函数呢?换句话说是不是shell自己本身的机制就是执行完成一次shell command后就退出进程呢?请求指教~

经过测试,证实了execl自己并没有调用exit,执行上面程序之所以直接退出了是因为sh本身执行了exit函数。关于uid, euid, suid, 和saved suid的问题高手们帮忙解决一下吧~


好吧,自己弄懂了~在这里做个笔记,如果有高手看了觉得这是个错误的说法,恳请指出错误帮助我更深地理解这个问题。我想这个saved set-user-id是对于文件的执行而设的。当fork子进程后由于要执行其他程序,势必影响到安全性。为了防止非法取得特殊权限,我们用setuid把此时进程已经获得(以set-user-id或者set-group-id运行)特殊权限的子进程的euid设置回为进程的实际用户id(uid),此时为了在exec执行完后需要恢复euid为特殊权限,所以为了实现这个,有了saved set-user-id,它把结束exec后的子进程的euid重新设置为suid,这样子进程可以继续以特殊权限执行其他操作。可能我说的还很有问题,希望指出~

论坛徽章:
0
2 [报告]
发表于 2010-08-22 20:23 |只看该作者
没有人回答么?高手们给点指示吧~谢谢了啊~

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
3 [报告]
发表于 2010-08-23 00:46 |只看该作者
没有人回答么?高手们给点指示吧~谢谢了啊~
blackgenius 发表于 2010-08-22 20:23


CU周末没什么人。。。。。

白天曾经路过,因为这些个ID实在是忘的差不多了,没有回贴。看到LZ半夜三更还在思考,最终得出结论,不由得去书柜翻APUE的笔记。

大致看了一下LZ自己摸索的结果,基本上是差不多的。看了一下笔记,总结出两点,LZ参考一下吧。

半年前看书做的笔记,那以后就再也没看这东西了,不保证正确。

一、仅执行fork与exec,effective ID与saved set-user-ID永远是相等的。执行普通文件,两者都等于real ID;执行设置了set-user-ID位的程序,两者都等于可执行文件owner之ID。

二、检查权限时检查的是effective ID。setuid可为effective ID赋值,但只能在real ID与saved set-user-ID之一中选一个。root用户除外。

论坛徽章:
0
4 [报告]
发表于 2010-08-23 15:35 |只看该作者
回复 3# tempname2

谢谢前辈~看来第二点跟我摸索的大致一样,不过第一点是对我摸索的结果的扩充~非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP