浅析为什么设置用户ID程序中不能直接调用system函数?
发布时间:2020-12-15 09:17:24 所属栏目:安全 来源:网络整理
导读:设置用户ID程序 本文将以两个简单的小程序为例,说明如果在一个设置用户ID程序中调用system将会发生什么: 代码1 代码块语法遵循标准markdown代码,例如: #include "apue.h" int main( int argc,char *argv []){ int status; if (argc 2 ){err_quit( "commo
设置用户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 = %dn",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函数! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 如何在Ansible中创建一个idempontent shell
- 如何有效地从scala中的枚举中选择一个随机元素?
- 应用于scala中的元组列表时出现映射错误
- scala – 我可以从Spark程序而不是从RDD编写纯文本HDFS(或本
- twitter-bootstrap – 带css3变换的Bootstrap翻转卡
- 验证 – 仅在组件中的Angular2 ngModel验证器
- 使用Webpack进行Angular 2翻译
- bootstrap4 layui echarts 框架引入
- bootstrap之双日历时间段选择控件—daterangepicker(汉化版
- 【AngularJS】6.AngularJS 事件指令/input相关指令/样式指令