mtr是结合了traceroute和ping程序的网络诊断工具。 mtr的split.c文件的split_redraw()函数在处理特制的主机名时存在栈溢出漏洞,远程攻击者可能利用此漏洞控制用户系统。 以下是有漏洞部分的代码段: \"split.c\" #define MAX_LINE_SIZE 256 void split_redraw(void) { int max; ;int at; ip_t *addr; *name; newLine[MAX_LINE_SIZE]; i; ... for(at = 0; at < max; at++) { addr = net_addr(at); if( addrcmp( (void *) addr, (void *) &unspec_addr, af ) != 0 ) { name = dns_lookup(addr);[1] if(name != NULL) { /* May be we should test name\'\'s length */ [!!] ;sprintf(newLine, \"\\%s \\%d \\%d \\%d \\%d \\%d \\%d\", name,[2] net_loss(at), net_returned(at), net_xmit(at), net_best(at) /1000, net_avg(at)/1000, net_worst(at)/1000); } else { ... sprintf(newLine, \"???\"); } ... ;... } } 在[2]处没有安全的调用sprintf()函数,name参数为IP地址的RevDNS。如果用户受骗访问了恶意的DNS服务器,则在使用-p或--split命令行选项时就会触发这个溢出,导致执行任意指令。
mtr是结合了traceroute和ping程序的网络诊断工具。 mtr的split.c文件的split_redraw()函数在处理特制的主机名时存在栈溢出漏洞,远程攻击者可能利用此漏洞控制用户系统。 以下是有漏洞部分的代码段: \"split.c\" #define MAX_LINE_SIZE 256 void split_redraw(void) { int max; ;int at; ip_t *addr; *name; newLine[MAX_LINE_SIZE]; i; ... for(at = 0; at < max; at++) { addr = net_addr(at); if( addrcmp( (void *) addr, (void *) &unspec_addr, af ) != 0 ) { name = dns_lookup(addr);[1] if(name != NULL) { /* May be we should test name\'\'s length */ [!!] ;sprintf(newLine, \"\\%s \\%d \\%d \\%d \\%d \\%d \\%d\", name,[2] net_loss(at), net_returned(at), net_xmit(at), net_best(at) /1000, net_avg(at)/1000, net_worst(at)/1000); } else { ... sprintf(newLine, \"???\"); } ... ;... } } 在[2]处没有安全的调用sprintf()函数,name参数为IP地址的RevDNS。如果用户受骗访问了恶意的DNS服务器,则在使用-p或--split命令行选项时就会触发这个溢出,导致执行任意指令。