IPFilter ‘ippool’ ‘lib/load_http.c’本地缓冲区溢出漏洞

漏洞起因
边界条件错误
 
影响系统
Darren Reed IPFilter 4.1.31
 
不受影响系统
 
危害
本地攻击者可以利用漏洞对应用程序进行拒绝服务攻击,或以系统权限执行任意指令。
 
攻击所需条件
攻击者必须访问IPFilter所在系统。
 
漏洞信息
IPFilter是一款用于提供NAT或防火墙服务的应用程序。
IPFilter ippool存在缓冲区溢出,本地攻击者可以利用漏洞对应用程序进行拒绝服务攻击,或以系统权限执行任意指令。
问题存在于lib/load_http.c中,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 /)
然后缓冲区会可能被填充1041:
strlen(GET HTTP/1.0\r\n) = 15
strlen(url) = 512
strlen(Host: \r\n\r\n)= 10
strlen(A x504) = 504
sum = 1041 bytes.
使用此函数可导致潜在的威胁,比如"ippool"。
 
测试方法
 
厂商解决方案
NetBSD可参考如下补丁:
NetBSD fix:
http://cvsweb.netbsd.org/bsdweb.cgi/src/dist/ipf/lib/load_http.c?only_with_
tag=MAIN
 
漏洞提供者
Maksymilian Arciemowicz

发表评论?

0 条评论。

发表评论