- 论坛徽章:
- 0
|
本帖最后由 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完成后会结束调用它的进程?比如程序段:- #include <sys/wait.h>
- #include <errno.h>
- #include <unistd.h>
- int
- system(const char *cmdstring) /* version without signal handling */
- {
- pid_t pid;
- int status;
- if (cmdstring == NULL)
- return(1); /* always a command processor with UNIX */
- if ((pid = fork()) < 0) {
- status = -1; /* probably out of processes */
- } else if (pid == 0) { /* child */
- execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
- _exit(127); /* execl error */
- } else { /* parent */
- while (waitpid(pid, &status, 0) < 0) {
- if (errno != EINTR) {
- status = -1; /* error other than EINTR from waitpid() */
- break;
- }
- }
- }
- return(status);
- }
复制代码 此程序段中执行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,这样子进程可以继续以特殊权限执行其他操作。可能我说的还很有问题,希望指出~ |
|