EfingerD是一款免费的开放源代码的finger守护程序,使用在Linux操作系统下。 EfingerD在处理域信息中没有正确的处理,可导致缓冲溢出。 当主机连接到finger守护程序的时候,EfingerD默认从连接主机的IP地址中获取域信息并尝试进行解析,但是,如果主机名字超过100字节以上,就会发生缓冲溢出,可导致堆栈变量被覆盖,包括返回地址信息等,存在以efingerd的权利执行任意代码的可能。 问题存在于如下代码中: static char *lookup_addr (struct in_addr in) { static char addr[100]; struct hostent *he; if (resolve_addr) { he = gethostbyaddr ((char *)&in, sizeof(struct in_addr),AF_INET); if (he == NULL) strcpy(addr, inet_ntoa(in)); else strcpy(addr, he->h_name); } else strcpy (addr, inet_ntoa (in)); return addr; } 在处理strcpy函数中没有很好的进行边界检查。
EfingerD是一款免费的开放源代码的finger守护程序,使用在Linux操作系统下。 EfingerD在处理域信息中没有正确的处理,可导致缓冲溢出。 当主机连接到finger守护程序的时候,EfingerD默认从连接主机的IP地址中获取域信息并尝试进行解析,但是,如果主机名字超过100字节以上,就会发生缓冲溢出,可导致堆栈变量被覆盖,包括返回地址信息等,存在以efingerd的权利执行任意代码的可能。 问题存在于如下代码中: static char *lookup_addr (struct in_addr in) { static char addr[100]; struct hostent *he; if (resolve_addr) { he = gethostbyaddr ((char *)&in, sizeof(struct in_addr),AF_INET); if (he == NULL) strcpy(addr, inet_ntoa(in)); else strcpy(addr, he->h_name); } else strcpy (addr, inet_ntoa (in)); return addr; } 在处理strcpy函数中没有很好的进行边界检查。