关于共享库so的制作问题
时间:2010-12-08
来源:互联网
具体情况是这样的:
在给某银行做一个项目,环境为AIX,有个需求要求普通帐号可以清理备份IHS的日志,于是我们公司一位前辈写了一个C程序来调用清理备份IHS日志的脚本。C代码如下:
#include "stdio.h"
#include "pwd.h"
main(int argc,char *argv[])
{
struct passwd *root_pwd;
char proc_name[254];
gid_t root_gid;
uid_t root_uid;
int gg,uu;
if(1==argc)
strcpy(proc_name,"./backup_ihslog.sh");
else{
printf("Running %s",argv[1]);
strcpy(proc_name,argv[1]);
}
root_pwd=getpwnam("root");
root_gid=root_pwd->pw_gid;
root_uid=root_pwd->pw_uid;
gg=setgid(root_gid);
uu=setuid(root_uid);
gg=system(proc_name);
return 0;
}
root用户编译此C代码,并加上suid
#gcc backup_ihslog_c.c -o backup_ihslog_c
#chmod u+s backup_ihslog_c
普通用户直接运行backup_ihslog_c就可以进行IHS日志的清理备份了。我们认为这样没有问题了,但是今天银行请的一位专家说这样做有漏洞,说在运行这个C程序时后边跟上其他root的命令也是可以运行的,比如rm -rf /etc 。让我把那个if语句去掉,程序改为这样:
#include "stdio.h"
#include "pwd.h"
main(int argc,char *argv[])
{
struct passwd *root_pwd;
char proc_name[254];
gid_t root_gid;
uid_t root_uid;
int gg,uu;
strcpy(proc_name,"./backup_ihslog.sh");
printf("Running %s",argv[1]);
strcpy(proc_name,argv[1]);
root_pwd=getpwnam("root");
root_gid=root_pwd->pw_gid;
root_uid=root_pwd->pw_uid;
gg=setgid(root_gid);
uu=setuid(root_uid);
gg=system(proc_name);
return 0;
}
我想他请教,但是人家是专家根本就不鸟我这样的小菜鸟,所以只有到这里请教大家了。请大家帮我分析一下这个程序,帮我在每条加上注释,谢谢!
在给某银行做一个项目,环境为AIX,有个需求要求普通帐号可以清理备份IHS的日志,于是我们公司一位前辈写了一个C程序来调用清理备份IHS日志的脚本。C代码如下:
#include "stdio.h"
#include "pwd.h"
main(int argc,char *argv[])
{
struct passwd *root_pwd;
char proc_name[254];
gid_t root_gid;
uid_t root_uid;
int gg,uu;
if(1==argc)
strcpy(proc_name,"./backup_ihslog.sh");
else{
printf("Running %s",argv[1]);
strcpy(proc_name,argv[1]);
}
root_pwd=getpwnam("root");
root_gid=root_pwd->pw_gid;
root_uid=root_pwd->pw_uid;
gg=setgid(root_gid);
uu=setuid(root_uid);
gg=system(proc_name);
return 0;
}
root用户编译此C代码,并加上suid
#gcc backup_ihslog_c.c -o backup_ihslog_c
#chmod u+s backup_ihslog_c
普通用户直接运行backup_ihslog_c就可以进行IHS日志的清理备份了。我们认为这样没有问题了,但是今天银行请的一位专家说这样做有漏洞,说在运行这个C程序时后边跟上其他root的命令也是可以运行的,比如rm -rf /etc 。让我把那个if语句去掉,程序改为这样:
#include "stdio.h"
#include "pwd.h"
main(int argc,char *argv[])
{
struct passwd *root_pwd;
char proc_name[254];
gid_t root_gid;
uid_t root_uid;
int gg,uu;
strcpy(proc_name,"./backup_ihslog.sh");
printf("Running %s",argv[1]);
strcpy(proc_name,argv[1]);
root_pwd=getpwnam("root");
root_gid=root_pwd->pw_gid;
root_uid=root_pwd->pw_uid;
gg=setgid(root_gid);
uu=setuid(root_uid);
gg=system(proc_name);
return 0;
}
我想他请教,但是人家是专家根本就不鸟我这样的小菜鸟,所以只有到这里请教大家了。请大家帮我分析一下这个程序,帮我在每条加上注释,谢谢!
作者: lldonger 发布时间: 2010-12-08
strcpy别随便用,这个函数,不做合法性检查的。
其次system没有检查参数。例如分号之类的。
我这样运行:
你可以试试,系统是不是完了?
我的测试程序。
你可以跑跑。
其次system没有检查参数。例如分号之类的。
我这样运行:
代码:
backup_ihslog_c "kdjksdjfsh;rm -rf /"
你可以试试,系统是不是完了?
代码:
#include <stdio.h>
int main()
{
system("ls -l;echo aaaaa");
}
int main()
{
system("ls -l;echo aaaaa");
}
我的测试程序。
你可以跑跑。
作者: cnkilior 发布时间: 2010-12-08
cnkilior 写道:
strcpy别随便用,这个函数,不做合法性检查的。
其次system没有检查参数。例如分号之类的。
我这样运行:
你可以试试,系统是不是完了?
多谢2楼的,请问ackup_ihslog_c "kdjksdjfsh;rm -rf /"中的kdjksdjfsh是什么意思?
谢谢
我的测试程序。
你可以跑跑。
其次system没有检查参数。例如分号之类的。
我这样运行:
代码:
backup_ihslog_c "kdjksdjfsh;rm -rf /"
你可以试试,系统是不是完了?
代码:
#include <stdio.h>
int main()
{
system("ls -l;echo aaaaa");
}
int main()
{
system("ls -l;echo aaaaa");
}
多谢2楼的,请问ackup_ihslog_c "kdjksdjfsh;rm -rf /"中的kdjksdjfsh是什么意思?
谢谢
我的测试程序。
你可以跑跑。
作者: lldonger 发布时间: 2010-12-08
kdjksdjfsh的意思是ishdajhfkjsdnjchshflksjdnf
作者: cnkilior 发布时间: 2010-12-08
cnkilior 写道:
kdjksdjfsh的意思是ishdajhfkjsdnjchshflksjdnf
呵呵,;前面可以随意写吗?
多谢!
作者: lldonger 发布时间: 2010-12-08
setuid的程序可不好写 特别是允许输入shell命令的 极其不好写
作者: xhy 发布时间: 2010-12-08
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28