关于设置uid位和seteuid的问题

skineffect 2011-04-01 10:40:15
程序如下:
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>

int main() {
struct passwd *pwd, *rpwd;
rpwd = getpwuid(getuid());
pwd = getpwuid(geteuid());
printf("real UID:[%s]\n", rpwd->pw_name);
printf("effective UID:[%s]\n", pwd->pw_name);

system("touch /tmp/foo.txt;ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt;");
printf("\nset EUID to 'skin'..\n");

pwd = getpwnam("skin");
seteuid(pwd->pw_uid);

rpwd = getpwuid(getuid());
printf("real UID:[%s]\n", rpwd->pw_name);
pwd = getpwuid(geteuid());
printf("effective UID:[%s]\n", pwd->pw_name);
system("touch /tmp/foo.txt;ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt;");

printf("\nset EUID to 'root'\n");
seteuid(0);

rpwd = getpwuid(getuid());
printf("real UID:[%s]\n", rpwd->pw_name);
pwd = getpwuid(geteuid());
printf("effective UID:[%s]\n", pwd->pw_name);
system("touch /tmp/foo.txt;ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt;");

return 0;
}

编译如下:
skin@ubuntu:~$ sudo gcc -D_GNU_SOURCE -o euid euid.c; sudo chmod +s euid; ls -l euid
-rwsr-sr-x 1 root root 7410 2011-03-30 11:06 euid
运行结果如下:
skin@ubuntu:~/$ ./euid
real UID:[root] //问题1
effective UID:[root]
-rw-r--r-- 1 root root 0 2011-03-30 11:06 /tmp/foo.txt

set EUID to 'skin'..
real UID:[skin] //问题2
effective UID:[skin]
-rw-r--r-- 1 skin root 0 2011-03-30 11:06 /tmp/foo.txt //问题3

set EUID to 'root'
real UID:[skin]
effective UID:[root]
-rw-r--r-- 1 root root 0 2011-03-30 11:06 /tmp/foo.txt

有几个地方不明白:
1.euid文件设置了设置uid位, 用skin用户运行时, 应该euid变成了root, 但为什么real uid也会变成root呢?设置uid位不是 只改变euid吗?
2.程序中调用seteuid(skin的uid)后, 因为是root调的, 所以连real uid都变成了skin吗?不是说只有root调用setuid后才会三个uid都改变吗,而seteuid只改变euid吗?
3.就算调用seteuid(skin的uid)后real uid和euid都变成了skin, 但是system后为什么euid变成了root呢?不也应该是skin吗?
实在是搞不明白,请大家指教,谢谢啦~
...全文
205 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
skineffect 2011-04-01
  • 打赏
  • 举报
回复
谢谢你,确实是因为getpwuid使用静态变量保存数据。还有最后将group id看成了euid,惭愧啊~
justkk 2011-04-01
  • 打赏
  • 举报
回复
1、2 两个问题,程序有误,你的假设不正确

rpwd = getpwuid(getuid());
pwd = getpwuid(geteuid());
printf("real UID:[%s]\n", rpwd->pw_name);
printf("effective UID:[%s]\n", pwd->pw_name);

因为getpwuid使用静态变量保存数据,后面的调用会覆盖之前的数据,这段的显示结果是错误的,误导你了
改为:
rpwd = getpwuid(getuid());
printf("real UID:[%s]\n", rpwd->pw_name);
pwd = getpwuid(geteuid());
printf("effective UID:[%s]\n", pwd->pw_name);

3、哪儿看到是euid变成root了??那儿的root是组,不是用户

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧