IPFilter lib/load_http.c文件缓冲区溢出漏洞
发布日期:2009-05-22
更新日期:2009-05-25
受影响系统:Darren Reed IPFilter 4.1.31
描述:
BUGTRAQ ID:
35076
CVE(CAN) ID:
CVE-2009-1476
IPFilter是一款免费的开放源代码的防火墙程序,由Darren Reed编写,可使用在多种Unix和Linux操作系统平台下。
Ippool用于管理IPFilter的IP池子系统中所储存的信息。在IPFilter的lib/load_http.c文件中(char buffer[1024]):
- ---
...
alist_t *
load_http(char *url)
{
int fd, len, left, port, endhdr, removed;
char *s, *t, *u, buffer[1024], *myurl;
alist_t *a, *rtop, *rbot;
struct sockaddr_in sin;
struct hostent *host;
/*
* More than this would just be absurd.
*/
if (strlen(url) > 512) {
fprintf(stderr, "load_http has a URL > 512 bytes?!\n");
return NULL;
}
fd = -1;
rtop = NULL;
rbot = NULL;
sprintf(buffer, "GET %s HTTP/1.0\r\n", url);
myurl = strdup(url);
if (myurl == NULL)
goto done;
s = myurl + 7; /* http:// */
t = strchr(s, '/');
if (t == NULL) {
fprintf(stderr, "load_http has a malformed URL '%s'\n", url);
free(myurl);
return NULL;
}
*t++ = '\0';
u = strchr(s, '@');
if (u != NULL)
s = u + 1; /* AUTH */
sprintf(buffer + strlen(buffer), "Host: %s\r\n\r\n", s);
...
- ---
0. buffer[]仅有1024字节
1. url不能大于512字节
2. url会被拷贝到以下缓冲区:
sprintf(buffer, "GET %s HTTP/1.0\r\n", url);
在这里(s是主机):
sprintf(buffer + strlen(buffer), "Host: %s\r\n\r\n", s);
如果url包含有:
512 = strlen(http:// A x504 /)
则在缓冲区中:
strlen(GET HTTP/1.0\r\n) = 15
strlen(url) = 512
strlen(Host: \r\n\r\n)= 10
strlen(A x504) = 504
总计为1041字节,因此使用这个功能可能会触发缓冲区溢出。
<*来源:Maksymilian Arciemowicz (
max@jestsuper.pl)
链接:
http://securityreason.com/achievement_securityalert/62
*>
建议:
厂商补丁:
Darren Reed
-----------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://cvsweb.netbsd.org/bsdweb.cgi/src/dist/ipf/lib/load_http.c?rev=1.2&content-type=text/x-cvsweb-markup&only_with_tag=MAIN浏览次数:2436
严重程度:0(网友投票)