浅析为什么设置用户ID程序中不能直接调用system函数?
2017-11-14 16:30
429 查看
设置用户ID程序
本文将以两个简单的小程序为例,说明如果在一个设置用户ID程序中调用system将会发生什么:代码1
代码块语法遵循标准markdown代码,例如:#include "apue.h" int main(int argc,char *argv[]) { int status; if(argc < 2) { err_quit("commondline argument requied"); } if((status=system(argv[1]))<0) { err_sys("err system"); } pr_exit(status); exit(0); }
使用GCC编译成tsys.o可执行文件。
代码2
#include "apue.h" int main(void) { printf("real uid = %d,effective uid = %d\n",getuid(),geteuid()); exit(0); }
将代码2编译成idtest.o。
实验过程:
parallels@ubuntu:~/vimtest/apue$ ./tsys.o ./idtest.o real uid = 1000,effective uid = 1000 normal termination, exit status = 0
修改tsys.o的权限
sudo chown root tsys.o sudo chmod u+s tsys.o
parallels@ubuntu:~/vimtest/apue$ ./tsys.o ./idtest.o real uid = 1000,effective uid = 0 normal termination, exit status = 0
虽然已经切换为普通用户,但是tsys.o的有效ID竟然是root。这是一个很大的安全漏洞!原因是,我们在赋予tsys程序的超级用户权限在system中执行了fork和exec后仍被保留下来了。
结论
如果一个进程正以特殊权限设置用户ID或者用户组ID,它又想生成另一个进程执行另一个程序,则它应当直接使用fork和exec。而且在fork和exec之前要改回普通权限。总之,在设置用户ID或者设置组ID的程序中,坚决不应该调用system函数!相关文章推荐
- 8_25 设置用户id或组id的程序绝对不能再调用system函数。安全漏洞
- 设置用户ID的程序调用system危险
- 用户态程序为什么不能直接访问内核态数据结构
- c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
- 第四周程序三---为什么后面的函数不能调用????????
- 写自己的函数直接调用Linux system call
- 直接拨号、将电话号码传入拨号程序、调用拨号程序、调用系统浏览器浏览网页、调用系统程序查看联系人、显示系统设置界面和显示Wi-Fi设置界面代码
- C程序调用shell脚本共有三种方式:system()、popen()、exec系列函数
- 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”?
- (小常识)为什么程序中不能使用system("cd ..")来改变pwd(present working directory)
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- QT在linux环境下读取和设置系统时间(通过system来直接调用Linux命令,注意权限问题)
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”?
- python只引入模块并不能直接调用该模块的函数
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- //这里为什么定义个display()全局函数,作为舞台,让对象唱戏,不能直接把他们放在主函数里面吗,这样写好处在哪,两者区别在哪?????
- 为什么c++程序调用c编译器编译的函数需要在调用前加上extern“C”
- 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
- c++程序调用被C编译器编译后的函数为什么要加extern "C"