谁能帮我分析一下这个C代码?谢谢!一位银行的专家竟说有漏洞
发表于 : 2010-12-08 19:54
具体情况是这样的:
在给某银行做一个项目,环境为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;
}
我想他请教,但是人家是专家根本就不鸟我这样的小菜鸟,所以只有到这里请教大家了。请大家帮我分析一下这个程序,帮我在每条加上注释,谢谢!