proftp1.2.0存在安全漏洞

王朝厨房·作者佚名  2007-01-05
窄屏简体版  字體:   |    |    |  超大  

Bug1:

void set_proc_title(char *fmt,...) in src/main.c

memset(statbuf, 0, sizeof(statbuf));

vsnprintf(statbuf, sizeof(statbuf), fmt, msg);

#ifdef HAVE_SETPROCTITLE

setproctitle(statbuf);

#endif /* HAVE_SETPROCTITLE */

setproctitle, defined setproctitle(char *fmt,...);, calls vsnprintf().

这存在格式化攻击的漏洞。通过攻击缓冲区可能获得 root 权限。

Bug2:

MODRET pam_auth(cmd_rec *cmd) in modules/mod_pam.c

/* Allocate our entries...we don't free this because PAM does this for

us.

*/

pam_user = malloc(strlen(cmd->argv[0]) + 1);

if(pam_user == (char *)0)

return pam_return_type ? ERROR(cmd) : DECLINED(cmd);

sstrncpy(pam_user, cmd->argv[0], strlen(cmd->argv[0]) + 1);

pam_pass = malloc(strlen(cmd->argv[1]) + 1);

if(pam_pass == (char *)0)

return pam_return_type ? ERROR(cmd) : DECLINED(cmd);

sstrncpy(pam_pass, cmd->argv[1], strlen(cmd->argv[1]) + 1);

这不能造成拒绝服务攻击,除非管理员设置了更高的界限。

Bug3:

void logformat(char *nickname, char *fmts) 没有在本地变量 'format' 进行边界检查。结果登录格式将溢出缓冲区。

Bug3:

int dolist(cmd_rec *cmd, const char *opt, int clearflags) in

modules/mod_ls.c

char pbuffer[MAXPATHLEN];

if(*arg == '~') {

struct passwd *pw;

int i;

const char *p;

i = 0;

p = arg;

p++;

while(*p && *p != '/')

pbuffer[i++] = *p++;

pbuffer[i] = '\0';

这个函数通过 cmd_stat 调用与 'arg'存在于静态堆栈,看上去是有问题但不能只通过输入 1024 字节造成溢出,不过仍然是不安全的设计。

解决方法:

1。使用 setproctitle("%s",statbuf);

2。pstrdup() 或只使用 cmd->argv[0] and cmd->argv[1].

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航